Compare commits

..

399 Commits

Author SHA1 Message Date
Joshua M. Boniface
1d0fd79eb1 Merge pull request #393 from dinki/cherrypick-380
Fix to enable tuner edit again
2019-07-24 10:38:31 -04:00
dinki
cafef103f4 Fix to enable tuner edit again 2019-07-24 09:27:27 -05:00
dkanada
c9e70d9564 Merge pull request #364 from petermcneil/channelmapper-sorting
Change channel mapper to sort list
2019-06-26 01:22:47 -07:00
petermcneil
f7376f5d90 ES5 not ES6 2019-06-23 16:56:04 +01:00
petermcneil
d7180c21ca Change channel mapper to sort list 2019-06-23 16:54:13 +01:00
Joshua M. Boniface
6a0672a996 Merge pull request #361 from oddstr13/pr-emby-auth-coexist-1
Allow Jellyfin and Emby to coexist on the same domain
2019-06-16 01:10:54 -04:00
Odd Stråbø
1c34f6202e Allow Jellyfin and Emby to coexist on the same domain 2019-06-16 00:42:20 +02:00
Joshua M. Boniface
37636dae5c Merge pull request #354 from joshuaboniface/forwardmerge-thumbfix
Add thumbnail fix to release
2019-06-01 21:18:00 -04:00
DrPandemic
e220ea603d Prevent the rendering of button inside button 2019-06-01 20:56:17 -04:00
Anthony Lavado
3f448fd12c Merge pull request #340 from jellyfin/cvium-fix-record-series
Fix context in querySelector
2019-05-24 14:18:39 -04:00
Claus Vium
773fcc1263 Fix context in querySelector 2019-05-24 19:30:24 +02:00
Anthony Lavado
53f403d156 Merge pull request #333 from bugfixin/fix-back-button
Fix back button in PWA
2019-05-23 20:06:41 -04:00
bugfixin
8adcdf5828 Set start url to true home url to prevent redirect on every load 2019-05-21 19:01:51 +00:00
bugfixin
6f2609a65a Remove invalid related application stub in manifest 2019-05-21 18:50:38 +00:00
Joshua M. Boniface
b0f7a9b67c Merge pull request #323 from bugfixin/fix-android-seek
Resolve some android seeking issues
2019-05-17 09:01:42 -04:00
bugfixin
da4d3a755e Prevent needlessly resetting startPositionTicks to null 2019-05-16 04:14:51 +00:00
Joshua M. Boniface
ce06f79502 Merge pull request #316 from anthonylavado/release-10.3.z
Correct the naming of iPad and iPhone
2019-05-10 09:16:18 -04:00
Anthony Lavado
073f82f7de Correct the naming of iPad and iPhone
Fixes #310.
2019-05-10 00:24:22 -04:00
Anthony Lavado
f34ec139e3 Merge pull request #304 from skaro13/master
Fixed Progressive Web App for Android and iOS
2019-05-09 01:09:23 -04:00
Anthony Lavado
8840c15484 Merge pull request #309 from oddstr13/pr-webos-1
Various fixes for webOS 3.3
2019-05-09 01:06:35 -04:00
Odd Stråbø
243f6f898e Implement .finally as .catch().then as suggested. 2019-05-08 07:17:30 +02:00
Simon Caron
4818a7782d Adde iOS Launch Screens for PWA 2019-05-07 21:08:24 -04:00
Simon Caron
0d00b6cfd7 Added 512 px icon for Android PWA Requirements 2019-05-07 21:08:15 -04:00
Simon Caron
7bd0db6b2f Updated PWA Manifest Values 2019-05-07 21:08:08 -04:00
Odd Stråbø
3167c7dbb9 Additional fixes to get jf-web loading in webOS 3.0 emulator.
Can't seem to get any audio/video playing in the emulator,
so I'm not sure if the emulator supports multimedia playback.
2019-05-06 22:21:20 +02:00
Odd Stråbø
747201a6c7 Various fixes for webOS 3.3 2019-05-05 23:55:42 +02:00
Joshua M. Boniface
1ba58b06b3 Merge pull request #296 from joshuaboniface/hotfix-pinreset
Fix "Password Reset by PIN" page
2019-04-30 13:07:30 -04:00
Joshua M. Boniface
4ed02a44ac Merge pull request #287 from bugfixin/seek-too-wide
Remove extraneous padding from sliders
2019-04-30 13:02:28 -04:00
Joshua Boniface
6f3b28d7b0 Fix "Password Reset by PIN" page 2019-04-30 12:58:31 -04:00
Anthony Lavado
96d4f50b74 Merge pull request #290 from bugfixin/firefox-sliderbubble
Remove outdated Firefox check for slider bubble
2019-04-30 01:54:30 -04:00
Joshua M. Boniface
a6f942a99f Merge pull request #291 from bugfixin/autoplaydetect404
Correct 404 on autoPlayDetect.js
2019-04-29 23:08:46 -04:00
Joshua M. Boniface
30e97eaaaa Merge pull request #277 from dkanada/livetv
Fix a broken Live TV page
2019-04-29 23:07:51 -04:00
bugfixin
02ad6c51af Change reference to correct autoplaydetect file 2019-04-26 23:36:00 +00:00
bugfixin
d9210a7aa1 Remove outdated firefox exception for slider bubble 2019-04-26 23:00:44 +00:00
bugfixin
2cac48cf2b Remove extraneous padding from sliders 2019-04-26 17:51:49 +00:00
dkanada
6c7d64b4de remove unnecessary route 2019-04-25 11:16:11 -07:00
dkanada
05a1beebaf move livetv controller to the old location 2019-04-25 11:16:01 -07:00
Bond-009
5f90bee90e Merge pull request #270 from anthonylavado/release-10.3.z
Adds recording button back to view
2019-04-25 07:48:43 +02:00
Anthony Lavado
117614362f Adds recording button back to view
As per @cvium on Matrix, adds the recording button back by changing the selector that makes it visible. Fixes #268.
2019-04-25 01:25:19 -04:00
Joshua M. Boniface
97f6808e12 Merge pull request #258 from thornbill/fix-url-validation
Fix server name input type
2019-04-20 15:46:06 -04:00
Joshua M. Boniface
9c85bcd2d0 Merge pull request #257 from cvium/fix_fallback_culture
Load fallback culture before login
2019-04-20 14:56:15 -04:00
Bill Thornton
5493667a6c Fix server name input type
url type is too strict for what should be a host name/address
2019-04-20 14:52:53 -04:00
Claus Vium
bdbc5682db Remove extra semicolon 2019-04-20 20:48:13 +02:00
Claus Vium
b5db89661a Fix fallback culture before login 2019-04-20 20:44:42 +02:00
Joshua M. Boniface
874b51234e Merge pull request #253 from joshuaboniface/missing-strings-rebase
Readd missing strings
2019-04-19 14:21:49 -04:00
Joshua Boniface
b3e0c1e6d1 Merge branch 'translations' into release-10.3.z 2019-04-19 14:19:58 -04:00
Libor Filípek
701d867f1b Translated using Weblate (Czech)
Currently translated at 94.3% (1371 of 1453 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2019-04-19 13:38:47 -04:00
Libor Filípek
7c38c08592 Translated using Weblate (Czech)
Currently translated at 94.1% (1368 of 1453 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2019-04-19 13:36:29 -04:00
Joshua M. Boniface
ec8d0de8f1 Merge branch 'release-10.3.z' into translations 2019-04-19 13:00:36 -04:00
Heldenkrieger01
a8a7b7fd64 Translated using Weblate (Swiss German)
Currently translated at 9.8% (223 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/gsw/
2019-04-19 12:13:07 -04:00
Facundo Cerezo
0cee5c3d05 Translated using Weblate (Spanish (Mexico))
Currently translated at 96.7% (2192 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_MX/
2019-04-19 12:13:02 -04:00
polisaez
0e19f96c0b Translated using Weblate (Spanish (Mexico))
Currently translated at 96.7% (2192 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_MX/
2019-04-19 12:13:01 -04:00
Jorge E Garcia
01ca8f9529 Translated using Weblate (Spanish (Mexico))
Currently translated at 96.7% (2192 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_MX/
2019-04-19 12:13:00 -04:00
Gabriel Villar
235d340b10 Translated using Weblate (Spanish (Argentina))
Currently translated at 17.4% (396 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/
2019-04-19 12:13:00 -04:00
Facundo Cerezo
473d88fdb7 Translated using Weblate (Spanish (Argentina))
Currently translated at 17.4% (396 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/
2019-04-19 12:12:50 -04:00
Fernando
0d6df6a308 Translated using Weblate (Spanish)
Currently translated at 96.9% (2197 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/
2019-04-19 12:12:19 -04:00
Neyder Achahuanco
df673feda2 Translated using Weblate (Spanish)
Currently translated at 96.9% (2197 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/
2019-04-19 12:12:17 -04:00
SaddFox
7e2cb7c77e Translated using Weblate (Slovenian)
Currently translated at 9.4% (214 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sl/
2019-04-19 12:12:15 -04:00
WWWesten
0cf3e0ba34 Translated using Weblate (Kazakh)
Currently translated at 97.6% (2212 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/kk/
2019-04-19 12:12:08 -04:00
ZsiGiT
eecaff583a Translated using Weblate (Hungarian)
Currently translated at 93.2% (2111 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/
2019-04-19 12:12:07 -04:00
Βασίλης Μουρατίδης
62a79c103a Translated using Weblate (Greek)
Currently translated at 84.8% (1921 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/el/
2019-04-19 12:12:06 -04:00
Leo Verto
6cc6ad8495 Translated using Weblate (German)
Currently translated at 99.5% (2255 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2019-04-19 12:12:05 -04:00
TheBird956
1822fe87f7 Translated using Weblate (French (Canada))
Currently translated at 11.1% (253 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr_CA/
2019-04-19 12:12:03 -04:00
TheBird956
ca4760f340 Translated using Weblate (French)
Currently translated at 100.0% (2265 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2019-04-19 12:11:55 -04:00
Samuli Valavuo
f685931d76 Translated using Weblate (Finnish)
Currently translated at 5.0% (114 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fi/
2019-04-19 12:11:55 -04:00
Jort de Bokx
12be040ee8 Translated using Weblate (Dutch)
Currently translated at 92.6% (2099 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/
2019-04-19 12:11:52 -04:00
Dan Johansen
b0f23efa90 Translated using Weblate (Danish)
Currently translated at 99.6% (2256 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/
2019-04-19 12:11:49 -04:00
Libor Filípek
73fa3e79b8 Translated using Weblate (Czech)
Currently translated at 94.9% (2150 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2019-04-19 12:10:45 -04:00
rondadon
641c5dd51a Translated using Weblate (Croatian)
Currently translated at 74.7% (1692 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hr/
2019-04-19 12:10:12 -04:00
tinganhsu
22626873e3 Translated using Weblate (Chinese (Traditional))
Currently translated at 46.6% (1057 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/
2019-04-19 12:10:11 -04:00
grafixeyehero
353cf8fa99 Readd Missing Strings 2019-04-19 12:05:32 -04:00
tinganhsu
94717cbe59 Translated using Weblate (Chinese (Traditional))
Currently translated at 45.7% (1037 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/
2019-04-19 00:41:10 -04:00
lostmypillow
28fcffb5c5 Translated using Weblate (Chinese (Traditional))
Currently translated at 45.7% (1037 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/
2019-04-19 00:41:07 -04:00
Anthony Lavado
5bd9d56190 Merge pull request #249 from joshuaboniface/hotfix-metadata
Correct edititemmetadata.js script location
2019-04-16 16:22:57 -04:00
Anthony Lavado
f9f9a21e71 Merge pull request #245 from grafixeyehero/missing-strings
Add Missing strings "HeaderFavorite..."
2019-04-16 16:22:29 -04:00
Joshua Boniface
2ca5c4c10c Update location of edititemmetadata.js 2019-04-16 16:08:40 -04:00
Bond-009
cbd518836b Merge pull request #247 from anthonylavado/fix-manifest
Update the name in Manifest.json
2019-04-16 11:54:38 +02:00
Anthony Lavado
076657bf96 Update the name in Manifest.json
Updates the name in the file to read Jellyfin, and removes the previous
comment.
2019-04-16 02:02:57 -04:00
Samuli Valavuo
88d26451a9 Translated using Weblate (Finnish)
Currently translated at 4.0% (91 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fi/
2019-04-15 01:27:48 -04:00
agrhb
70a6287e09 Translated using Weblate (Finnish)
Currently translated at 4.0% (91 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fi/
2019-04-15 01:27:45 -04:00
grafixeyehero
e52c879215 Sort by name 2019-04-14 00:51:41 +03:00
grafixeyehero
2ef711daf4 Add More Missing Strings 2019-04-14 00:33:46 +03:00
grafixeyehero
bc64f4b99e Readd Missing Strings 2019-04-14 00:28:24 +03:00
Joshua M. Boniface
c8ca46fdbe Merge pull request #244 from jellyfin/dkanada-patch-1
Fix a deminification issue with the plugin page
2019-04-13 16:44:03 -04:00
dkanada
4e6820ca0d Fix a deminification issue with the plugin page 2019-04-13 17:34:15 +01:00
Anthony Lavado
e07edea5bf Merge pull request #227 from thornbill/update-input-type
Update add server input type
2019-04-09 21:28:42 -04:00
Anthony Lavado
495534c6d0 Merge pull request #237 from dkanada/controls
Avoid element overlap with music controls
2019-04-09 21:28:20 -04:00
dkanada
85cffe7063 avoid element overlap with music controls 2019-04-09 17:05:01 -07:00
Joshua M. Boniface
00dab1b88c Merge pull request #231 from dkanada/plugin
Improve the plugin catalog and related controllers
2019-04-09 00:33:22 -04:00
Joshua M. Boniface
da96b1120c Merge pull request #235 from dkanada/login
Add check for multiserver on login page
2019-04-08 18:54:59 -04:00
dkanada
38e3861e85 add check for multiserver on login page 2019-04-06 23:18:47 -07:00
dkanada
f83bd20fa9 deminify login controller 2019-04-06 23:07:02 -07:00
dkanada
eb469bd1da deminify add plugin page 2019-04-06 00:17:36 -07:00
dkanada
e4590b4898 fix some broken and unused elements on the plugin pages 2019-04-06 00:17:33 -07:00
dkanada
3b0b5228fe deminify the installed plugin page 2019-04-06 00:17:18 -07:00
Joshua M. Boniface
a90b5d8324 Merge pull request #225 from joshuaboniface/fix-restart-button
Fix restart button API call
2019-04-04 02:32:04 -04:00
Anthony Lavado
36f6500aa3 Merge pull request #226 from nvllsvm/optimize
Optimize images with image_optim
2019-04-04 01:16:30 -04:00
Bill Thornton
18c61a8193 Update add server input type 2019-04-04 00:56:47 -04:00
Andrew Rabert
59ca1caf7d Optimize images with image_optim 2019-04-03 23:01:38 -04:00
Joshua Boniface
8f84b023aa Restart needs to be called with ApiClient 2019-04-03 21:37:26 -04:00
Vasily
79c30b7eee Merge pull request #223 from Froghut/chromecast-hardware-volume-buttons
When playing on Chromecast make volume buttons change chromecast volume
2019-04-03 17:59:53 +03:00
Froghut
4baad878ac when connected to chromecast make thehardware volume buttons change the chromecast device volume + fix volumeUp and columeDown missing var's 2019-04-02 09:43:49 +02:00
Vasily
f6f51d79cc Merge pull request #219 from Froghut/chromecast_volume_fix
Change Chromecast volume instead while casting
2019-04-02 00:33:28 +03:00
Vasily
ac0a640fe0 Merge pull request #222 from Froghut/preserve-chromecast-volume
Remember device volume/mute on Chromecast playback stop
2019-04-02 00:13:34 +03:00
Vasily
1d55d34bba Merge pull request #221 from agrenott/fix_chromcecast
Fix local chromecast play behind reverse proxy
2019-04-02 00:12:48 +03:00
Vasily
ea81fceb40 Merge pull request #217 from grafixeyehero/dev
Re-add missing strings
2019-04-01 22:07:54 +03:00
Aurélien Grenotton
274ef0e532 Fix local chromecast play behind reverse proxy
When using a HTTPS reverse proxy (for eg. traefik in fron of docker
jellyfin), there's no valid advertised local address.
Let's default to external one in such case, relying on the home router
to properly route it internally.
2019-04-01 16:07:56 +02:00
Froghut
82d7b0eefb add fallback defaults to volume/mute if null on playbackstop 2019-04-01 15:40:10 +02:00
Froghut
37f63f6963 add braces for clarification 2019-04-01 15:34:01 +02:00
Vasily
e28b42d40d Merge pull request #218 from vitorsemeano/master
Solve random dark pane over video playing in fullscreen mode
2019-04-01 16:21:22 +03:00
Froghut
49fd86d707 on chromecast playback stop still remember device volume/mute 2019-04-01 14:34:50 +02:00
grafixeyehero
35e63bd9e7 fix Indentation 2019-03-31 19:33:53 +03:00
Froghut
732d8b5e26 When changing volume connected to chromecast change the device volume instead of the jellyfin-player volume 2019-03-31 12:05:54 +02:00
vitorsemeano
e705fb7598 solve dark pane overlay when playing next track 2019-03-30 23:28:42 +00:00
grafixeyehero
e071c2fdcd readd missing strings 2019-03-30 22:10:45 +03:00
Anthony Lavado
9677981344 Merge pull request #216 from grafixeyehero/dev
remove sync menu from multiselect
2019-03-29 18:55:15 -04:00
Joshua M. Boniface
3cc379d0bf Merge pull request #211 from LogicalPhallacy/passwordresetimprovements
Adds web options to support better password resets
2019-03-29 18:24:55 -04:00
Joshua M. Boniface
37cc900a8e Update src/strings/en-us.json
Co-Authored-By: LogicalPhallacy <44458166+LogicalPhallacy@users.noreply.github.com>
2019-03-29 07:12:15 -07:00
Joshua M. Boniface
c508fb9ff0 Merge pull request #206 from vitorsemeano/webpack_part44
Conversion to webpack - part4 - module resolution, appStorage refactor, minor cleanup
2019-03-28 23:10:53 -04:00
vitorsemeano
5ff34f5eb4 removed unecessary file page.js from components 2019-03-28 22:40:36 +00:00
vitorsemeano
67f04532be fix minor bug for listItemImage background sizing 2019-03-28 22:40:36 +00:00
vitorsemeano
ac13bcb43e force emby-button load before routes 2019-03-28 22:40:36 +00:00
vitorsemeano
7a5d66c792 refactor fullscreenManager suggested by JustAMan 2019-03-28 22:40:36 +00:00
vitorsemeano
02c5fd688f removed old duplicate files for viewmanager 2019-03-28 22:39:10 +00:00
vitorsemeano
b3e6d6a835 add missing emby-button dependency for addplugin 2019-03-28 21:41:01 +00:00
vitorsemeano
4013ac8c8f removed duplicate emby-button module as dependency 2019-03-28 21:41:01 +00:00
vitorsemeano
b8cdb3d94e removed old dialoghelper 2019-03-28 21:41:01 +00:00
vitorsemeano
ad813701c5 fix eslint error for appRouter module 2019-03-28 21:41:01 +00:00
vitorsemeano
c42ac7e650 remove emby-linkbutton requires 2019-03-28 21:41:01 +00:00
vitorsemeano
f783509e33 rename dialoghelper to dialogHelper 2019-03-28 21:41:01 +00:00
vitorsemeano
2b9559b4a9 resolve typo for viewContainer dep 2019-03-28 21:41:00 +00:00
vitorsemeano
258cea0b81 rename viewmanager to viewManager 2019-03-28 21:41:00 +00:00
vitorsemeano
d751ff2c19 module resolution for htmlMediaHelper 2019-03-28 21:41:00 +00:00
vitorsemeano
7253406177 module resolution for images modules 2019-03-28 21:41:00 +00:00
vitorsemeano
f56a82b800 module resolution for loading, page and playerSelectionMenu 2019-03-28 21:41:00 +00:00
vitorsemeano
52af8d487e module resolution for scroller 2019-03-28 21:35:32 +00:00
vitorsemeano
d57629d90f module resolution for serverNotifications 2019-03-28 21:35:32 +00:00
vitorsemeano
ba89941fce module resolution for toast and serverRestartDialog 2019-03-28 21:35:32 +00:00
vitorsemeano
578a1670f4 module resoltion for viewContainer 2019-03-28 21:35:32 +00:00
vitorsemeano
a03502646c bug fixes for headroom 2019-03-28 21:35:32 +00:00
vitorsemeano
4a5fc817fb module resolution for viewManager 2019-03-28 21:35:32 +00:00
vitorsemeano
1ba0c7501e remove debugger from loginpage.js 2019-03-28 21:35:32 +00:00
vitorsemeano
00c875b893 module resolution for headroom 2019-03-28 21:35:31 +00:00
vitorsemeano
86c19ee4a3 module resolution for fullscreenManager 2019-03-28 21:35:31 +00:00
vitorsemeano
e0ac97c109 remove duplicated component viewcontainer-lite 2019-03-28 21:35:31 +00:00
vitorsemeano
ecf316d671 removed polyfill fetch 2019-03-28 21:35:31 +00:00
vitorsemeano
c2555d071d added package.json for modules resolution 2019-03-28 21:35:31 +00:00
vitorsemeano
afde8bebe7 removed module emby-linkbutton: same as emby-button 2019-03-28 21:35:31 +00:00
vitorsemeano
93c5157b1e refactor and module resolution for appStorage 2019-03-28 21:35:31 +00:00
Phallacy
dcbdd9957e Merge branch 'passwordresetimprovements' of https://github.com/LogicalPhallacy/jellyfin-web into passwordresetimprovements 2019-03-27 22:51:33 -07:00
Phallacy
18af617c74 minor fixes 2019-03-27 22:51:27 -07:00
Vasily
6c3814f014 Apply suggestions from code review
Co-Authored-By: LogicalPhallacy <44458166+LogicalPhallacy@users.noreply.github.com>
2019-03-27 13:42:01 -07:00
Joshua M. Boniface
535f3dbbad Merge pull request #205 from dkanada/eslint
Move assets and third party libs out of components and update some strings
2019-03-27 16:28:48 -04:00
Vasily
e01feca025 Deuglify
Co-Authored-By: LogicalPhallacy <44458166+LogicalPhallacy@users.noreply.github.com>
2019-03-27 10:02:48 -07:00
Bond-009
2b6865b0bd Merge pull request #214 from tbraeutigam/NativeShell-Filesystem-Fallback
Fix Issue #213 - Direct Playback broken in Chrome 73
2019-03-27 15:46:43 +01:00
Thorben Bräutigam
521f09f79f Fix Issue #213 2019-03-27 15:38:37 +01:00
Phallacy
82e0a2f7da replaces a duplicate anthonylavado with me 2019-03-25 22:43:32 -07:00
Phallacy
24ed198960 adds strings and a link on the password reset page 2019-03-25 22:41:16 -07:00
LogicalPhallacy
78ca7e48d1 Merge pull request #3 from LogicalPhallacy/master
update to current master
2019-03-25 22:21:38 -07:00
LogicalPhallacy
deeb7f9475 Merge pull request #2 from jellyfin/master
Merge pull request #190 from LogicalPhallacy/master
2019-03-25 22:19:47 -07:00
dkanada
518ed623e2 fix eslint ci error 2019-03-25 15:18:13 -07:00
Joshua M. Boniface
2996cd7d28 Merge pull request #190 from LogicalPhallacy/master
Add setting to support configurable user lockout
2019-03-25 11:02:27 -04:00
Phallacy
0fe1d350e6 removes useless connectlinktype check 2019-03-25 00:30:45 -07:00
dkanada
6b1908227f update transcode path strings 2019-03-24 23:50:01 -07:00
dkanada
ef3166143a add custom strings for system info panel on dashboard 2019-03-24 23:50:01 -07:00
Vasily
4144d929e7 Apply suggestions from code review
adding justaman's fixes

Co-Authored-By: LogicalPhallacy <44458166+LogicalPhallacy@users.noreply.github.com>
2019-03-23 23:47:31 -07:00
dkanada
92555c36ce remove unused string 2019-03-23 22:25:19 -07:00
dkanada
9a6f0a12c8 move server name setting to general page 2019-03-23 22:25:19 -07:00
dkanada
3b576be5f0 move some links to the new documentation 2019-03-23 22:25:18 -07:00
dkanada
ed812281bc update some old string references 2019-03-23 22:25:18 -07:00
dkanada
4df59cc345 move thirdparty libs and assets out of components folder 2019-03-23 22:25:18 -07:00
dkanada
c1649d6e65 fix theme videos option always enabled 2019-03-23 22:25:18 -07:00
dkanada
161892a54e create new directory for image assets 2019-03-23 22:25:18 -07:00
Joshua M. Boniface
fe71fc31c4 Merge branch 'master' into master 2019-03-24 01:01:55 -04:00
Joshua M. Boniface
9aa027dcfb Merge pull request #188 from vitorsemeano/webpack_part3
Conversion to webpack - part3 - routes isolation, module resolution, refactoring appStorage
2019-03-24 00:56:39 -04:00
vitorsemeano
4a4a9fb1de removed unused dlnaserversettings route 2019-03-22 23:49:37 +00:00
vitorsemeano
b4257bfda8 optimizing defineRoute in routes.js 2019-03-22 23:48:38 +00:00
vitorsemeano
cc0e19c6bd fix identation for routes.js 2019-03-22 23:48:38 +00:00
vitorsemeano
a5278f3b78 manual deuglify for appStorage 2019-03-22 23:47:37 +00:00
vitorsemeano
c3c035a7d7 code optimization for removeItem from appStorage 2019-03-22 23:47:37 +00:00
vitorsemeano
0b71b0b493 fixed some bugs with merge from upstream 2019-03-22 23:47:19 +00:00
vitorsemeano
5b26405c06 added a bunch of modules main package.json 2019-03-22 23:46:22 +00:00
vitorsemeano
183528cf72 added finally for request that made loading spin forever on start 2019-03-22 23:46:22 +00:00
vitorsemeano
c7ea132f07 hide loading even if connection fails at start 2019-03-22 23:46:22 +00:00
vitorsemeano
468b9e881b module reoslution for backdrop 2019-03-22 23:46:22 +00:00
vitorsemeano
f54a751a9d module resolution for autoPlayDetect 2019-03-22 23:46:22 +00:00
vitorsemeano
32d9a1549d removed all unecessary polifys 2019-03-22 23:45:45 +00:00
vitorsemeano
9ad29733bf refactor and module resolution for appStorage 2019-03-22 23:44:33 +00:00
vitorsemeano
be505da8ac cleanup and module resolution in webpack for skinManager 2019-03-22 23:44:07 +00:00
vitorsemeano
9c758a8d85 module resolution for appRouter and moved controllers to dir 2019-03-22 23:43:05 +00:00
vitorsemeano
d49fee2a29 single module resolution for apiclient 2019-03-22 23:40:10 +00:00
grafixeyehero
7ab37b21a5 remove sync menu 2019-03-23 02:16:02 +03:00
Phallacy
dba9b60800 added ui stuff for password reset pr 2019-03-22 00:12:01 -07:00
Joshua M. Boniface
ae828f76a3 Merge pull request #204 from nvllsvm/mine
Fix CI
2019-03-22 00:17:20 -04:00
Andrew Rabert
304691c197 Fix missing exec permission 2019-03-21 22:43:11 -04:00
Joshua M. Boniface
85a7b34d92 Merge pull request #197 from vitorsemeano/cleanupcordovamodules
Cleanup cordova modules - webpack fix
2019-03-21 21:18:56 -04:00
vitorsemeano
ad5d9be566 add comment for init conversion into timeupdate 2019-03-21 21:54:36 +00:00
vitorsemeano
e82bd8b744 merge from upstream 2019-03-21 21:46:55 +00:00
Vasily
23d4d30d33 Merge pull request #203 from dkanada/strings
Remove all unused strings from translation files
2019-03-21 23:44:58 +03:00
dkanada
381ee59b9e remove all unreferenced strings 2019-03-21 13:14:32 -07:00
dkanada
4cbe81e971 remove unused strings from #178 2019-03-21 13:12:20 -07:00
Joshua M. Boniface
5864c0f5fd Merge pull request #172 from dkanada/webpath
Add web path as config option
2019-03-21 09:06:50 -04:00
Joshua M. Boniface
37cb47aea5 Merge pull request #202 from dkanada/sync
remove sync and registration services
2019-03-21 09:06:14 -04:00
dkanada
ab6ed3037e minor changes to recording fields 2019-03-20 16:01:28 -07:00
dkanada
bf95e6016f apply suggestions from code review
Co-Authored-By: dkanada <dkanada@users.noreply.github.com>
2019-03-20 14:48:59 -07:00
Vasily
22649b66a6 Apply suggestions from JustAMan code review
https://www.youtube.com/watch?v=-CmadmM5cOk

Co-Authored-By: LogicalPhallacy <44458166+LogicalPhallacy@users.noreply.github.com>
2019-03-19 23:12:23 -07:00
dkanada
65fafe9c58 remove registration services 2019-03-19 17:03:51 -07:00
dkanada
886dec1174 remove all sync and convert buttons 2019-03-19 17:03:47 -07:00
dkanada
ae7b8d59f2 remove web path modify option 2019-03-18 22:58:48 -07:00
vitorsemeano
e8e098f9b1 removed nativelshell sync invokation 2019-03-18 23:08:11 +00:00
Joshua M. Boniface
1ae37fea1b Merge pull request #196 from jellyfin/fix_promise
Return inner promise in createConnectionManager
2019-03-17 20:00:59 -04:00
Anthony Lavado
e5e9f5ebbc Merge pull request #195 from cvium/rename_nb
Remove no to nb
2019-03-17 19:52:23 -04:00
vitorsemeano
657e88d07e Merge branch 'master' into cleanupcordovamodules 2019-03-17 23:36:03 +00:00
vitorsemeano
19cb905d5a removed require for cordova apphost 2019-03-17 23:23:59 +00:00
vitorsemeano
c4ada25fe7 nativeshell API added to apphost 2019-03-17 23:23:45 +00:00
vitorsemeano
8315f4a2d4 invert some conditions for readability in apphost 2019-03-17 22:02:24 +00:00
vitorsemeano
9967edcb35 deuglify apphost.js 2019-03-17 21:52:56 +00:00
vitorsemeano
91ef01cbc0 removed require for cordova externalPlayer 2019-03-17 21:42:36 +00:00
Claus Vium
447ec2c3ab Return inner promise in init require 2019-03-17 22:24:49 +01:00
Claus Vium
e29b0be9fd Remove no to nb 2019-03-17 22:13:56 +01:00
Phallacy
dab41fe6e1 made the main save and load methods that I modified more legible 2019-03-17 01:13:12 -07:00
Joshua M. Boniface
c14dab4c8d Merge pull request #189 from vitorsemeano/master
Fix require apiInput
2019-03-17 01:58:15 -04:00
vitorsemeano
01d82010ed cleanup for mediaSession require 2019-03-17 00:32:15 +00:00
vitorsemeano
e4c7282b92 refactor mediaSession to support NativeShell API 2019-03-17 00:31:56 +00:00
vitorsemeano
7fc4165b53 remove some require modules of cordova 2019-03-16 22:56:55 +00:00
vitorsemeano
01d38d04ba removed require for module cordova filedownloader 2019-03-16 21:49:05 +00:00
vitorsemeano
071963ec5a added nativeshell API to filedownloader module 2019-03-16 21:48:44 +00:00
vitorsemeano
856d87a9b2 clean filerepository and transfermanager requires 2019-03-16 21:21:40 +00:00
vitorsemeano
8b6b9974c7 removed require for cordova appshortcuts 2019-03-16 19:34:19 +00:00
vitorsemeano
164bba2faf removed require for module cordova localsync 2019-03-16 19:26:30 +00:00
vitorsemeano
a77058de61 added NativeShell API to localsync module 2019-03-16 19:25:46 +00:00
vitorsemeano
e39d364874 removed require module for cordova imagestore 2019-03-16 19:20:38 +00:00
vitorsemeano
42beea23b6 removed require for module cordova filesystem 2019-03-16 19:19:24 +00:00
vitorsemeano
e13796e4f3 add NativeShell API to filesystem module 2019-03-16 19:19:00 +00:00
vitorsemeano
5cc1821e12 remove require for module cordova chromecast 2019-03-16 18:26:42 +00:00
vitorsemeano
d8d3b0b4c7 remove unused module wakeonlan 2019-03-16 18:21:07 +00:00
vitorsemeano
c22ad0f204 removing require for module cordova shell 2019-03-16 18:13:26 +00:00
vitorsemeano
3de82f210a using NativeShell api for native apps in shell.js 2019-03-16 18:11:46 +00:00
vitorsemeano
bd17f06708 fix require apiInput to serverNotifications 2019-03-16 17:51:24 +00:00
vitorsemeano
60c0e58c64 removed serverdiscovery module 2019-03-16 17:16:11 +00:00
vitorsemeano
04480fc8eb removed serverdiscovery require 2019-03-16 17:15:59 +00:00
vitorsemeano
4be8a788b0 assume server discovery is in NativeShell api 2019-03-16 17:15:37 +00:00
vitorsemeano
c391eaf545 removing module fileupload 2019-03-16 16:52:49 +00:00
vitorsemeano
c2d35ee599 removing require for module file upload 2019-03-16 16:52:41 +00:00
vitorsemeano
9e38eeeb16 removing nativedirectorychooser require 2019-03-16 16:50:51 +00:00
Joshua M. Boniface
82f171e99a Merge pull request #187 from dkanada/eslint
Add CI for eslint
2019-03-16 11:00:08 -04:00
Joshua M. Boniface
e6e38adebe Merge pull request #177 from vitorsemeano/webpack_part22
Conversion to webpack - part2 - emby-webcomponents into components and module naming resolution
2019-03-16 10:59:36 -04:00
vitorsemeano
c5bbc81cab Merge branch 'master' into webpack_part22 2019-03-16 14:06:18 +00:00
dkanada
e38a34384a add ci for eslint 2019-03-16 01:55:47 -07:00
Phallacy
570161efbd more tweaking for style 2019-03-16 00:53:27 -07:00
Phallacy
64feb7fdf7 made the styling more consistent 2019-03-16 00:48:20 -07:00
Phallacy
8d3027d100 added settings to support configurable lockout 2019-03-16 00:18:17 -07:00
Vasily
32290a7cd0 Merge pull request #178 from lostmypillow/master
Remove unused localization strings (updated)
2019-03-15 15:55:53 +03:00
vitorsemeano
9dde221c07 remove forced volumeosd load for edge 2019-03-14 23:40:56 +00:00
lostmypillow
f95018e809 Added back DLNA string 2019-03-14 16:11:52 -05:00
dkanada
ca9e5d83bf remove write check and add warning to the description 2019-03-14 00:05:45 -07:00
Joshua M. Boniface
770a3a1626 Merge pull request #181 from joshuaboniface/fix-syntax-error
Correct syntax error in networkPath
2019-03-13 21:59:07 -04:00
Joshua M. Boniface
f53f11b4da Merge pull request #180 from vitorsemeano/fix_apphost_type
Apply typo fix for apphost
2019-03-13 21:43:15 -04:00
Joshua Boniface
f698ba1f39 Correct syntax error in networkPath 2019-03-13 21:34:58 -04:00
vitorsemeano
70d66f6455 remove unecessary var for onwebcomponentsready 2019-03-13 23:22:17 +00:00
vitorsemeano
8234f189a0 fix bug apphost naming resolution 2019-03-13 23:08:23 +00:00
lostmypillow
03ef8f310d Translated using Weblate (Chinese (Traditional))
Currently translated at 31.0% (704 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/
2019-03-13 10:00:51 -04:00
lostmypillow
ceafa313cd Remove unused localization strings
Improved version of original PR
2019-03-12 23:13:41 -05:00
vitorsemeano
44fe392912 rename embyWebComponentsBower to components 2019-03-12 23:28:26 +00:00
vitorsemeano
6cbd26531c fix bug apphost naming resolution 2019-03-12 22:49:13 +00:00
vitorsemeano
1cb487b9a3 merge from upstream 2019-03-12 21:41:46 +00:00
vitorsemeano
093a9b1ebd merge from upstream 2019-03-12 21:41:16 +00:00
Vasily
65aec76e06 Merge pull request #162 from vitorsemeano/webpack_part1
Convertion to webpack - part1 - npm and dynamic module resolution for site.js
2019-03-13 00:03:47 +03:00
vitorsemeano
4fefa4f9b6 update branch with upstream 2019-03-12 21:00:35 +00:00
Vasily
e08d7256a7 Merge pull request #175 from anthonylavado/link-fix
Update the translation help link
2019-03-12 22:29:39 +03:00
Anthony Lavado
1fa4307b62 Update translation help link
Updates the link after the docs reorganization that happened.
2019-03-12 15:16:28 -04:00
Joshua M. Boniface
5d9973371b Merge pull request #170 from jellyfin/translations
Updated translations
2019-03-12 14:50:22 -04:00
dkanada
9d462263b9 add web path as config option 2019-03-11 21:31:33 -07:00
Joshua M. Boniface
96e4296256 Merge pull request #168 from dkanada/settings
Lots of changes to the server configuration pages
2019-03-11 23:37:14 -04:00
dkanada
487ba61a42 remove open subtitles page from dashboard 2019-03-11 15:58:44 -07:00
vitorsemeano
023a1ed72f TODO for url prefix support investigation 2019-03-11 20:52:12 +00:00
Vasily
a0e9e59e0f Merge pull request #171 from cvium/fix_playback_order
Sort item results in the same order as requested
2019-03-11 15:38:21 +03:00
Claus Vium
5ce13990b6 Add some extra null handling just in case 2019-03-11 08:30:36 +01:00
Claus Vium
9ba1961a0c Sort item results in the same order as requested 2019-03-11 08:24:26 +01:00
WWWesten
531d3b0502 Translated using Weblate (Ukrainian)
Currently translated at 7.0% (160 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/
2019-03-10 03:07:25 -04:00
WWWesten
5223f7263c Translated using Weblate (Turkish)
Currently translated at 16.8% (382 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/tr/
2019-03-10 03:07:24 -04:00
WWWesten
7cf59abb9e Translated using Weblate (Swiss German)
Currently translated at 8.3% (189 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/gsw/
2019-03-10 03:07:24 -04:00
WWWesten
0a11946006 Translated using Weblate (Swedish)
Currently translated at 91.9% (2082 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sv/
2019-03-10 03:07:24 -04:00
WWWesten
425853a3f9 Translated using Weblate (Spanish (Mexico))
Currently translated at 96.4% (2185 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_MX/
2019-03-10 03:07:24 -04:00
WWWesten
2bdae52228 Translated using Weblate (Spanish (Argentina))
Currently translated at 5.6% (127 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/
2019-03-10 03:07:23 -04:00
Herman Besel
b2a50b7f05 Translated using Weblate (Spanish (Argentina))
Currently translated at 5.6% (127 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/
2019-03-10 03:07:23 -04:00
WWWesten
46594040e9 Translated using Weblate (Spanish)
Currently translated at 96.0% (2176 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/
2019-03-10 03:07:16 -04:00
WWWesten
c203b7c3fb Translated using Weblate (Romanian)
Currently translated at 14.9% (339 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ro/
2019-03-10 03:07:16 -04:00
WWWesten
a672a5c0f9 Translated using Weblate (Polish)
Currently translated at 97.8% (2216 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pl/
2019-03-10 03:07:16 -04:00
WWWesten
3aea684f0a Translated using Weblate (Malay)
Currently translated at 4.5% (102 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ms/
2019-03-10 03:07:15 -04:00
WWWesten
c6706d436a Translated using Weblate (Lithuanian)
Currently translated at 33.2% (754 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/lt/
2019-03-10 03:07:15 -04:00
WWWesten
76fa3e86f9 Translated using Weblate (Korean)
Currently translated at 59.4% (1347 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ko/
2019-03-10 03:07:15 -04:00
WWWesten
586ab88d02 Translated using Weblate (Kazakh)
Currently translated at 97.6% (2212 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/kk/
2019-03-10 03:07:15 -04:00
WWWesten
8df353f8ac Translated using Weblate (Indonesian)
Currently translated at 2.7% (63 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/id/
2019-03-10 03:07:14 -04:00
WWWesten
8626692ed7 Translated using Weblate (Icelandic)
Currently translated at 2.4% (56 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/is/
2019-03-10 03:07:14 -04:00
WWWesten
3592641bf7 Translated using Weblate (Hungarian)
Currently translated at 92.9% (2106 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/
2019-03-10 03:07:13 -04:00
ZsiGiT
8d6d258928 Translated using Weblate (Hungarian)
Currently translated at 92.9% (2106 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/
2019-03-10 03:07:13 -04:00
WWWesten
f8933cf445 Translated using Weblate (Hebrew)
Currently translated at 32.4% (734 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2019-03-10 03:06:31 -04:00
WWWesten
fc84426c49 Translated using Weblate (German)
Currently translated at 98.7% (2236 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2019-03-10 03:06:31 -04:00
TheBird956
90512ee28e Translated using Weblate (French (Canada))
Currently translated at 9.0% (206 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr_CA/
2019-03-10 03:06:30 -04:00
WWWesten
54267a4d6f Translated using Weblate (Danish)
Currently translated at 80.5% (1824 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/
2019-03-10 03:06:24 -04:00
WWWesten
20ae688f05 Translated using Weblate (Czech)
Currently translated at 86.0% (1949 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/
2019-03-10 03:06:24 -04:00
WWWesten
a8b9b9426a Translated using Weblate (Croatian)
Currently translated at 74.3% (1685 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hr/
2019-03-10 03:06:24 -04:00
WWWesten
42b7625715 Translated using Weblate (Chinese (Simplified))
Currently translated at 94.1% (2133 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2019-03-10 03:06:23 -04:00
Matsuri
75a8ed2318 Translated using Weblate (Chinese (Simplified))
Currently translated at 94.1% (2133 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2019-03-10 03:06:23 -04:00
WWWesten
5acb2ac11e Translated using Weblate (Chinese (Hong Kong))
Currently translated at 24.2% (550 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant_HK/
2019-03-10 03:06:22 -04:00
WWWesten
443cbba7be Translated using Weblate (Belarusian)
Currently translated at 1.6% (37 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/be/
2019-03-10 03:06:21 -04:00
WWWesten
78a7632583 Translated using Weblate (Arabic)
Currently translated at 70.2% (1592 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ar/
2019-03-10 03:06:21 -04:00
Joshua M. Boniface
84f2315e27 Merge pull request #144 from grafixeyehero/dev
Add top offset and bottom offset margins in emby-scrollbuttons
2019-03-10 01:57:45 -05:00
Joshua M. Boniface
7bd77a5ce1 Merge pull request #128 from ploughpuff/ffmpeg
Always show FFmpeg path in Transcoding page
2019-03-10 01:53:32 -05:00
dkanada
cd13be84fc revert network share path changes 2019-03-10 07:06:28 +09:00
vitorsemeano
a0e45f7809 ensure that appHost is loaded on onAppReady for all function 2019-03-09 17:35:38 +00:00
dkanada
326d9f9adf fix title capitalization 2019-03-09 11:48:31 +09:00
dkanada
c7a8076438 mirror the metadata manager in the user preference menu 2019-03-09 11:45:48 +09:00
dkanada
90290d30db fix some other code clarity issues 2019-03-09 11:40:10 +09:00
Claus Vium
6565ec4009 Update src/scripts/encodingsettings.js
Co-Authored-By: ploughpuff <33969763+ploughpuff@users.noreply.github.com>
2019-03-08 09:25:45 +00:00
Claus Vium
36a0df3c7d Update src/scripts/encodingsettings.js
Co-Authored-By: ploughpuff <33969763+ploughpuff@users.noreply.github.com>
2019-03-08 09:15:19 +00:00
Claus Vium
b9d21084f0 Update src/scripts/encodingsettings.js
Co-Authored-By: ploughpuff <33969763+ploughpuff@users.noreply.github.com>
2019-03-08 09:15:12 +00:00
Vasily
06d2154434 apply suggestions from code review
Co-Authored-By: dkanada <dkanada@users.noreply.github.com>
2019-03-07 22:00:13 +00:00
Vasily
62bb9f8721 Update src/scripts/encodingsettings.js
Co-Authored-By: ploughpuff <33969763+ploughpuff@users.noreply.github.com>
2019-03-07 21:19:21 +00:00
dkanada
14005d6c63 comment out multiserver and add check in navigation drawer 2019-03-06 19:13:44 +09:00
dkanada
f3e07e1531 move network share path out of directory browser component 2019-03-06 18:53:31 +09:00
dkanada
74eabd2af9 fix js crash from missing method and deminification 2019-03-06 18:18:49 +09:00
dkanada
579fbe90c8 remove appservices page in favor of plugin catalog 2019-03-06 17:53:44 +09:00
dkanada
07673d0ae6 remove a dead setting from dlna page 2019-03-06 16:43:39 +09:00
dkanada
c1e09008d6 delete section for top plugins by install count 2019-03-06 16:22:40 +09:00
vitorsemeano
8be5c9e987 Merge branch 'master' into webpack_part1 2019-03-05 22:40:28 +00:00
Bond-009
44e16c77a8 Merge pull request #166 from jellyfin/release-10.2.z
Better progressive playback controls of bottom pages (#164)
2019-03-05 20:29:13 +01:00
vitorsemeano
6046ad3dac optimization added to resolve specific urls 2019-03-05 19:10:03 +00:00
vitorsemeano
ec18360958 removed deadcode for registerServiceWorker 2019-03-05 18:52:53 +00:00
dkanada
6ffd74b9dd fix syntax issue 2019-03-05 21:59:52 +09:00
dkanada
f1b34bdb57 remove old and unused settings 2019-03-05 21:43:27 +09:00
dkanada
467808a6a7 include new setting in form load and submit 2019-03-05 21:42:40 +09:00
dkanada
141ff8887f more deminification 2019-03-05 21:42:40 +09:00
dkanada
44ba7a5cc4 deminification and move metadata path setting 2019-03-05 21:42:22 +09:00
dkanada
3def2a935d move metadata manager to navbar and out of server configuration 2019-03-05 20:42:12 +09:00
vitorsemeano
cb1309bb09 Merge branch 'webpack_part1' of github.com:vitorsemeano/jellyfin-web into webpack_part1 2019-03-04 20:47:05 +00:00
vitorsemeano
7e22a64238 merging ifs 2019-03-04 20:47:00 +00:00
Claus Vium
64c3c15af4 Update src/scripts/site.js
Co-Authored-By: vitorsemeano <vitorsemeano@gmail.com>
2019-03-04 20:45:44 +00:00
Claus Vium
8d7fa1557f Update src/scripts/site.js
Co-Authored-By: vitorsemeano <vitorsemeano@gmail.com>
2019-03-04 20:45:19 +00:00
Claus Vium
ff07a77133 Update src/scripts/site.js
Co-Authored-By: vitorsemeano <vitorsemeano@gmail.com>
2019-03-04 20:44:27 +00:00
Claus Vium
6a15acb310 Update src/scripts/site.js
well the tool can't make all the coding, am i right?

Co-Authored-By: vitorsemeano <vitorsemeano@gmail.com>
2019-03-04 20:43:37 +00:00
Claus Vium
1dd3096f37 Update src/scripts/site.js
i agree, definitely more readable

Co-Authored-By: vitorsemeano <vitorsemeano@gmail.com>
2019-03-04 20:40:13 +00:00
vitorsemeano
e60da6b545 renamed strange variable names 2019-03-04 20:38:39 +00:00
vitorsemeano
b50647f101 fix nested if else not done properly with deuglify 2019-03-04 20:36:51 +00:00
vitorsemeano
0fe01a85c4 Merge branch 'webpack_part1' of github.com:vitorsemeano/jellyfin-web into webpack_part1 2019-03-04 20:30:46 +00:00
vitorsemeano
5a258d6522 adjust var declarations for some specific cases 2019-03-04 20:30:42 +00:00
Claus Vium
24ae3a9c49 Update src/scripts/site.js
updating as suggested

Co-Authored-By: vitorsemeano <vitorsemeano@gmail.com>
2019-03-04 20:27:29 +00:00
Claus Vium
9878cfc012 Update src/scripts/site.js
It's really a matter of preference, but if you want it this way, np.

Co-Authored-By: vitorsemeano <vitorsemeano@gmail.com>
2019-03-04 20:25:42 +00:00
Anthony Lavado
36ab9764ac Merge pull request #163 from jellyfin/release-10.2.z
Backmerge for 10.2.2
2019-03-04 01:19:09 -05:00
Deniz
3ece0d5ba0 Translated using Weblate (Turkish)
Currently translated at 16.8% (382 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/tr/
2019-02-28 23:14:52 -05:00
ElFantasma
809b047025 Translated using Weblate (Spanish (Argentina))
Currently translated at 3.5% (80 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/
2019-02-28 23:14:50 -05:00
SaddFox
34e24a7f81 Translated using Weblate (Slovenian)
Currently translated at 7.1% (163 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sl/
2019-02-28 23:14:46 -05:00
WWWesten
0933726e90 Translated using Weblate (Russian)
Currently translated at 99.5% (2255 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/
2019-02-28 23:14:38 -05:00
v1tin
86d362725d Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.1% (2201 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_BR/
2019-02-28 23:14:38 -05:00
WWWesten
d70a69c4f7 Translated using Weblate (Norwegian Bokmål)
Currently translated at 80.4% (1822 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nb_NO/
2019-02-28 23:14:29 -05:00
EffeF
96b00e7942 Translated using Weblate (Italian)
Currently translated at 94.4% (2139 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/
2019-02-28 23:14:29 -05:00
ZsiGiT
72e13be935 Translated using Weblate (Hungarian)
Currently translated at 80.3% (1819 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/
2019-02-28 23:14:28 -05:00
Leo Verto
6d7c55382b Translated using Weblate (German)
Currently translated at 98.7% (2236 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2019-02-28 23:14:11 -05:00
TheBird956
7b9aa42a52 Translated using Weblate (French (Canada))
Currently translated at 7.3% (166 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr_CA/
2019-02-28 23:14:11 -05:00
TheBird956
3e12354bba Translated using Weblate (French)
Currently translated at 100.0% (2265 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2019-02-28 23:14:02 -05:00
Luclu7
15512b5073 Translated using Weblate (French)
Currently translated at 100.0% (2265 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2019-02-28 23:14:02 -05:00
lostmypillow
ec2f8f31ec Translated using Weblate (Chinese (Traditional))
Currently translated at 27.9% (632 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant/
2019-02-28 23:14:02 -05:00
littmean
d1a4d145c0 Translated using Weblate (Chinese (Simplified))
Currently translated at 93.7% (2124 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/
2019-02-28 23:13:39 -05:00
PloughPuff
037059f59d Use EncoderAppPathDisplay to populate encoder path field 2019-02-28 22:10:49 +00:00
PloughPuff
ba2c777772 Always show FFmpeg path in Transcoding page
Removed the 'hide' and 'required' settings from the html to always show the FFmpeg path to user and also allow user to remove a custom path and return to using whatever is available from system $PATH.
2019-02-28 22:08:37 +00:00
vitorsemeano
0b099806a7 fix merge conflicts 2019-02-28 21:41:24 +00:00
vitorsemeano
bf408ae9aa merge with updates from upstream 2019-02-28 18:31:53 +00:00
Joshua M. Boniface
8f03439b7e Merge pull request #159 from dkanada/plugin
remove some deprecated plugin code
2019-02-26 16:22:49 -05:00
Vasily
bb118a5ae8 add suggested changes from code review
Co-Authored-By: dkanada <dkanada@users.noreply.github.com>
2019-02-26 21:12:58 +00:00
dkanada
32a8e89420 use normal method for getAvailablePlugins 2019-02-27 06:11:42 +09:00
dkanada
3f7ca1d915 clean up plugin catalog page 2019-02-26 03:15:12 +09:00
dkanada
2dd44178fa remove plugin configuration block for android devices 2019-02-26 02:56:18 +09:00
dkanada
fa8eb4f34d method deminification 2019-02-26 02:39:58 +09:00
Mickaël Bernardini
335f64cc22 Translated using Weblate (French)
Currently translated at 100.0% (2265 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2019-02-24 08:52:57 -05:00
Luclu7
c9fed0c609 Translated using Weblate (French)
Currently translated at 100.0% (2265 of 2265 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/
2019-02-24 08:52:53 -05:00
vitorsemeano
e45e8d3f00 add missing package.json for module actionsheet 2019-02-23 19:34:50 +00:00
vitorsemeano
3dba261ae7 define apiInput as a module for webpack 2019-02-23 19:34:34 +00:00
vitorsemeano
2665923bb0 merged alert and nativeAlert for webpack 2019-02-23 19:14:56 +00:00
vitorsemeano
8e1c56adf5 removed bower_components from .gitignore 2019-02-23 18:26:35 +00:00
vitorsemeano
6ddc62857d move emby-webcomponents to components and reflect paths 2019-02-23 18:05:42 +00:00
vitorsemeano
e91cbf8438 add directory dist to .gitignore 2019-02-23 17:12:41 +00:00
vitorsemeano
e272b12755 refactor dynamic require dependencies for webpack 2019-02-23 17:12:14 +00:00
vitorsemeano
427c9d2036 deuglify and indent to 4 spaces site.js 2019-02-23 16:38:53 +00:00
Bond-009
e9240a0114 Merge pull request #153 from sparky8251/improve-typing
Make types more consistent
2019-02-23 10:37:30 -05:00
Sparky
802bb3a757 Make types more consistent
There is no instance I can find where these values are ever *actually* strings. Changing them to boolean improves consistency.
2019-02-23 10:29:42 -05:00
vitorsemeano
f5c2a331b0 changed package.json for initial version 0.0.0 2019-02-20 22:18:56 +00:00
vitorsemeano
7f407f9691 added weback and webpack-cli as dev dependencies 2019-02-20 22:17:26 +00:00
vitorsemeano
4dd77a24ab added package.json with yarn init 2019-02-20 22:15:40 +00:00
Joshua M. Boniface
ec5a3b6e5e Merge pull request #149 from jellyfin/release-10.2.z
Release 10.2.1
2019-02-20 14:59:31 -05:00
Joshua M. Boniface
5415d48a53 Merge pull request #145 from JustAMan/gh-templates
Copy issue and PR templates from main repo
2019-02-19 11:10:21 -05:00
Vasily
907a4ec516 Copy issue and PR templates from main repo 2019-02-19 18:58:58 +03:00
grafixeyehero
d2fe0e4bef margining top offset and bottom offset emby-scrollbuttons 2019-02-19 00:37:38 +03:00
WWWesten
8c662380a4 Translated using Weblate (Russian)
Currently translated at 99.5% (2256 of 2266 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/
2019-02-17 15:58:26 -05:00
Eliseo Martelli
b2c18d5e20 Translated using Weblate (Italian)
Currently translated at 94.4% (2140 of 2266 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/
2019-02-17 15:58:26 -05:00
ZsiGiT
2567d0977d Translated using Weblate (Hungarian)
Currently translated at 74.5% (1689 of 2266 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/
2019-02-17 15:58:26 -05:00
bobberb
4832b845a0 Translated using Weblate (Hebrew)
Currently translated at 32.3% (734 of 2266 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/
2019-02-17 15:57:03 -05:00
Philipp Hochkamp
e93af55c41 Translated using Weblate (German)
Currently translated at 98.7% (2237 of 2266 strings)

Translation: Jellyfin/Jellyfin Web
Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/
2019-02-17 15:57:03 -05:00
Joshua M. Boniface
072f4a3cf9 Merge pull request #139 from jellyfin/release-10.2.z
Release 10.2.0
2019-02-17 15:54:09 -05:00
512 changed files with 21117 additions and 36353 deletions

9
.drone.yml Normal file
View File

@@ -0,0 +1,9 @@
---
kind: pipeline
name: eslint
steps:
- name: run
image: nextcloudci/eslint:eslint-1
commands:
- ./run-eslint.sh

3
.eslintrc.yml Normal file
View File

@@ -0,0 +1,3 @@
env:
browser: true
amd: true

35
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,35 @@
---
name: Bug report
about: Create a bug report
title: ''
labels: bug
assignees: ''
---
**Describe the bug**
<!-- A clear and concise description of what the bug is. -->
**To Reproduce**
<!-- Steps to reproduce the behavior: -->
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
<!-- A clear and concise description of what you expected to happen. -->
**Logs**
<!-- Please paste any log errors. -->
**Screenshots**
<!-- If applicable, add screenshots to help explain your problem. -->
**System (please complete the following information):**
- OS: [e.g. Docker, Debian, Windows]
- Browser: [e.g. Firefox, Chrome, Safari]
- Jellyfin Version: [e.g. 10.0.1]
**Additional context**
<!-- Add any other context about the problem here. -->

View File

@@ -0,0 +1,20 @@
---
name: Enhancement request
about: Suggest an modification to an existing feature
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
**Describe the solution you'd like**
<!-- A clear and concise description of what you want to happen. -->
**Describe alternatives you've considered**
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
**Additional context**
<!-- Add any other context or screenshots about the feature request here. -->

View File

@@ -0,0 +1,14 @@
---
name: Feature request
about: Suggest a new feature
title: ''
labels: feature
assignees: ''
---
**Describe the feature you'd like**
<!-- A clear and concise description of what you want to happen. -->
**Additional context**
<!-- Add any other context or screenshots about the feature request here. -->

11
.github/pull_request_template.md vendored Normal file
View File

@@ -0,0 +1,11 @@
<!--
Ensure your title is short, descriptive, and in the imperative mood (Fix X, Change Y, instead of Fixed X, Changed Y).
For a good inspiration of what to write in commit messages and PRs please review https://chris.beams.io/posts/git-commit/ and our https://jellyfin.readthedocs.io/en/latest/developer-docs/contributing/ page.
-->
**Changes**
<!-- Describe your changes here in 1-5 sentences. -->
**Issues**
<!-- Tag any issues that this PR solves here.
ex. Fixes # -->

3
.gitignore vendored
View File

@@ -570,3 +570,6 @@ ASALocalRun/
healthchecksdb
# End of https://www.gitignore.io/api/node,rider,macos,linux,windows,visualstudio,visualstudiocode
# dist for webpack output
dist

View File

@@ -19,7 +19,10 @@
- [nkmerrill](https://github.com/nkmerrill)
- [TtheCreator](https://github.com/Tthecreator)
- [RazeLighter777](https://github.com/RazeLighter777)
- [anthonylavado](https://github.com/anthonylavado)
- [LogicalPhallacy](https://github.com/LogicalPhallacy)
- [thornbill](https://github.com/thornbill)
- [Oddstr13](https://github.com/oddstr13)
- [petermcneil](https://github.com/petermcneil)
# Emby Contributors

11
package.json Normal file
View File

@@ -0,0 +1,11 @@
{
"name": "jellyfin-web",
"version": "0.0.0",
"description": "Web interface for Jellyfin",
"repository": "https://github.com/jellyfin/jellyfin-web",
"license": "GPL-2",
"devDependencies": {
"webpack": "^4.29.5",
"webpack-cli": "^3.2.3"
}
}

18
run-eslint.sh Executable file
View File

@@ -0,0 +1,18 @@
#!/bin/sh
set -e
# used this pull request for reference
# https://github.com/nextcloud/spreed/pull/48
ESLINT=$(which eslint || true)
if [ -z "$ESLINT" ]
then
echo "could not find eslint in $PATH"
exit 1
fi
echo checking scripts with $ESLINT
find -name "*.js" -print0 | xargs -0 $ESLINT
# use this line to test changes locally
#find src -name "*.js" -exec sh -c 'npx eslint $1' -- {} \;

View File

@@ -1,4 +1,4 @@
<div id="addPluginPage" data-role="page" class="page type-interior pluginConfigurationPage" data-backbutton="true" data-require="emby-select,emby-collapse,emby-linkbutton">
<div id="addPluginPage" data-role="page" class="page type-interior pluginConfigurationPage" data-backbutton="true" data-require="emby-select,emby-collapse,emby-button">
<div>
<div class="content-primary">
@@ -8,7 +8,7 @@
<div class="verticalSection">
<div class="sectionTitleContainer flex align-items-center">
<h1 class="sectionTitle pluginName"></h1>
<a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Plugins">${Help}</a>
<a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://jellyfin.readthedocs.io/en/latest/administrator-docs/plugins/">${Help}</a>
</div>
<p id="tagline" style="font-style: italic;"></p>

View File

@@ -3,7 +3,7 @@
<form class="manualServerForm" style="margin: 0 auto;">
<h1 style="text-align: left;">${HeaderConnectToServer}</h1>
<div class="inputContainer">
<input is="emby-input" type="text" id="txtServerHost" required="required" label="${LabelServerHost}" />
<input is="emby-input" type="text" id="txtServerHost" required="required" label="${LabelServerHost}" autocomplete="off" spellcheck="false" autocapitalize="none" autocorrect="off" />
<div class="fieldDescription" style="text-align: left;">${LabelServerHostHelp}</div>
</div>
<br />
@@ -19,4 +19,4 @@
</button>
</form>
</div>
</div>
</div>

View File

@@ -1,21 +0,0 @@
<div id="appServicesPage" data-role="page" class="page type-interior appServicesPage withTabs fullWidthContent" data-require="scripts/appservices">
<div>
<div class="content-primary">
<div class="verticalSection">
<div class="sectionTitleContainer sectionTitleContainer-cards flex align-items-center">
<h2 class="sectionTitle sectionTitle-cards">${HeaderInstalledServices}</h2>
<a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Plugins">${Help}</a>
</div>
<div class="installedPlugins"></div>
</div>
<div class="verticalSection">
<h2 class="sectionTitle sectionTitle-cards">${HeaderAvailableServices}</h2>
<div class="catalog"></div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,8 @@
<div id="pluginCatalogPage" data-role="page" class="page type-interior pluginConfigurationPage withTabs fullWidthContent">
<div>
<div class="content-primary">
<div id="noPlugins" class="hide">${MessageNoAvailablePlugins}</div>
<div id="pluginTiles" style="text-align:left;"></div>
</div>
</div>
</div>

View File

@@ -239,6 +239,7 @@ var requirejs, require, define;
}
function delayedError(e) {
console.log(e.stack);
return setTimeout(function() {
e.dynaId && trackedErrors[e.dynaId] || (trackedErrors[e.dynaId] = !0, req.onError(e))
}), e
@@ -265,7 +266,7 @@ var requirejs, require, define;
trackedErrors = obj(),
urlFetched = obj(),
bundlesMap = obj(),
asyncResolve = Promise.resolve();
asyncResolve = Promise.resolve(undefined);
return load = "function" == typeof importScripts ? function(map) {
var url = map.url;
urlFetched[url] || (urlFetched[url] = !0, getDefer(map.id), importScripts(url), takeQueue(map.id))
@@ -415,4 +416,4 @@ var requirejs, require, define;
baseUrl: subPath
})), topReq([dataMain])))
}
}(this, "undefined" != typeof Promise ? Promise : void 0);
}(this, "undefined" != typeof Promise ? Promise : void 0);

View File

@@ -1,6 +1,11 @@
define(["apiclientcore", "localassetmanager"], function(ApiClient, localassetmanager) {
//TODO: (vitorsemeano) modify this lines for webpack
define(["bower_components/apiclient/apiclientcore", "localassetmanager"], function(ApiClient, localassetmanager) {
"use strict";
if ("cordova" !== window.appMode && "android" !== window.appMode) {
return ApiClient;
}
function isLocalId(str) {
return startsWith(str, localPrefix)
}

View File

@@ -0,0 +1,53 @@
define([], function() {
"use strict";
function onCachePutFail(e) {
console.log(e);
}
function updateCache(instance) {
if (instance.cache) {
instance.cache.put("data", new Response(JSON.stringify(instance.localData))).catch(onCachePutFail);
}
}
function onCacheOpened(result) {
this.cache = result;
this.localData = {};
}
function MyStore() {
this.setItem = function(name, value) {
localStorage.setItem(name, value);
if (this.localData && this.localData[name] !== value) {
this.localData[name] = value;
updateCache(this);
}
};
this.getItem = function(name) {
return localStorage.getItem(name);
};
this.removeItem = function(name) {
localStorage.removeItem(name);
if (this.localData) {
delete this.localData[name];
updateCache(this);
}
};
try {
if (self.caches) {
self.caches.open("embydata").then(onCacheOpened.bind(this));
}
} catch (err) {
console.log("Error opening cache: " + err);
}
}
return new MyStore;
});

View File

@@ -269,12 +269,15 @@ define(["events", "apiclient", "appStorage"], function(events, apiClientFactory,
});
resolve(servers)
};
require(["serverdiscovery"], function(serverDiscovery) {
serverDiscovery.findServers(1e3).then(onFinish, function() {
if (window.NativeShell && typeof window.NativeShell.findServers === 'function') {
window.NativeShell.findServers(1e3).then(onFinish, function() {
onFinish([])
})
})
})
});
} else {
resolve([]);
}
});
}
function convertEndpointAddressToManualAddress(info) {

View File

@@ -13,7 +13,7 @@ define(["events", "appStorage"], function(events, appStorage) {
}
function Credentials(key) {
this.key = key || "servercredentials3"
this.key = key || "jellyfin_credentials"
}
return Credentials.prototype.clear = function() {
this._credentials = null, appStorage.removeItem(this.key)

View File

@@ -0,0 +1,3 @@
{
"main": "apiclient.js"
}

View File

@@ -1,23 +0,0 @@
define([], function() {
"use strict";
function MyStore() {}
function updateCache(instance) {
instance.cache.put("data", new Response(JSON.stringify(instance.localData)))
}
return MyStore.prototype.init = function() {
var instance = this;
return caches.open("embydata").then(function(result) {
instance.cache = result, instance.localData = {}
})
}, MyStore.prototype.setItem = function(name, value) {
if (this.localData) {
this.localData[name] !== value && (this.localData[name] = value, updateCache(this))
}
}, MyStore.prototype.getItem = function(name) {
if (this.localData) return this.localData[name]
}, MyStore.prototype.removeItem = function(name) {
this.localData && (this.localData[name] = null, delete this.localData[name], updateCache(this))
}, new MyStore
});

View File

@@ -1,37 +0,0 @@
define([], function() {
"use strict";
function onCachePutFail(e) {
console.log(e)
}
function updateCache(instance) {
var cache = instance.cache;
cache && cache.put("data", new Response(JSON.stringify(instance.localData))).catch(onCachePutFail)
}
function onCacheOpened(result) {
this.cache = result, this.localData = {}
}
function MyStore() {
try {
self.caches && caches.open("embydata").then(onCacheOpened.bind(this))
} catch (err) {
console.log("Error opening cache: " + err)
}
}
return MyStore.prototype.setItem = function(name, value) {
localStorage.setItem(name, value);
var localData = this.localData;
if (localData) {
localData[name] !== value && (localData[name] = value, updateCache(this))
}
}, MyStore.prototype.getItem = function(name) {
return localStorage.getItem(name)
}, MyStore.prototype.removeItem = function(name) {
localStorage.removeItem(name);
var localData = this.localData;
localData && (localData[name] = null, delete localData[name], updateCache(this))
}, new MyStore
});

View File

@@ -1,14 +0,0 @@
define([], function() {
"use strict";
function MyStore() {
this.localData = {}
}
return MyStore.prototype.setItem = function(name, value) {
this.localData[name] = value
}, MyStore.prototype.getItem = function(name) {
return this.localData[name]
}, MyStore.prototype.removeItem = function(name) {
this.localData[name] = null
}, new MyStore
});

View File

@@ -1,8 +0,0 @@
define([], function() {
"use strict";
function FileUpload() {}
return FileUpload.prototype.upload = function(file, url) {
return Promise.reject()
}, FileUpload
});

View File

@@ -1,8 +0,0 @@
define([], function() {
"use strict";
return {
findServers: function(timeoutMs) {
return Promise.resolve([])
}
}
});

View File

@@ -1,15 +0,0 @@
define([], function() {
"use strict";
function send(info) {
return Promise.reject()
}
function isSupported() {
return !1
}
return {
send: send,
isSupported: isSupported
}
});

View File

@@ -1,34 +0,0 @@
define(['dialog', 'globalize'], function (dialog, globalize) {
'use strict';
return function (text, title) {
var options;
if (typeof text === 'string') {
options = {
title: title,
text: text
};
} else {
options = text;
}
var items = [];
items.push({
name: globalize.translate('ButtonGotIt'),
id: 'ok',
type: 'submit'
});
options.buttons = items;
return dialog(options).then(function (result) {
if (result === 'ok') {
return Promise.resolve();
}
return Promise.reject();
});
};
});

View File

@@ -1,23 +0,0 @@
define([], function () {
'use strict';
function replaceAll(str, find, replace) {
return str.split(find).join(replace);
}
return function (options) {
if (typeof options === 'string') {
options = {
text: options
};
}
var text = replaceAll(options.text || '', '<br/>', '\n');
alert(text);
return Promise.resolve();
};
});

View File

@@ -1,12 +0,0 @@
define(['multi-download'], function (multiDownload) {
'use strict';
return {
download: function (items) {
multiDownload(items.map(function (item) {
return item.url;
}));
}
};
});

View File

@@ -1,12 +0,0 @@
define([], function () {
'use strict';
return {
fileExists: function (path) {
return Promise.reject();
},
directoryExists: function (path) {
return Promise.reject();
}
};
});

View File

@@ -1,26 +0,0 @@
define(['dom', 'fullscreenManager'], function (dom, fullscreenManager) {
'use strict';
function isTargetValid(target) {
if (dom.parentWithTag(target, ['BUTTON', 'INPUT', 'TEXTAREA'])) {
return false;
}
return true;
}
dom.addEventListener(window, 'dblclick', function (e) {
if (isTargetValid(e.target)) {
if (fullscreenManager.isFullScreen()) {
fullscreenManager.exitFullscreen();
} else {
fullscreenManager.requestFullscreen();
}
}
}, {
passive: true
});
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -1,80 +0,0 @@
define(['playbackManager', 'itemHelper'], function (playbackManager, itemHelper) {
"use strict";
function getRequirePromise(deps) {
return new Promise(function (resolve, reject) {
require(deps, resolve);
});
}
function validatePlayback(options) {
var feature = 'playback';
if (options.item && (options.item.Type === 'TvChannel' || options.item.Type === 'Recording')) {
feature = 'livetv';
}
if (feature === 'playback') {
var player = playbackManager.getCurrentPlayer();
if (player && !player.isLocalPlayer) {
return Promise.resolve();
}
}
return getRequirePromise(["registrationServices"]).then(function (registrationServices) {
return registrationServices.validateFeature(feature, options).then(function (result) {
if (result && result.enableTimeLimit) {
startAutoStopTimer();
}
});
});
}
var autoStopTimeout;
function startAutoStopTimer() {
stopAutoStopTimer();
autoStopTimeout = setTimeout(onAutoStopTimeout, 63000);
}
function onAutoStopTimeout() {
stopAutoStopTimer();
playbackManager.stop();
}
function stopAutoStopTimer() {
var timeout = autoStopTimeout;
if (timeout) {
clearTimeout(timeout);
autoStopTimeout = null;
}
}
function PlaybackValidation() {
this.name = 'Playback validation';
this.type = 'preplayintercept';
this.id = 'playbackvalidation';
this.order = -1;
}
PlaybackValidation.prototype.intercept = function (options) {
// Don't care about video backdrops, or theme music or any kind of non-fullscreen playback
if (!options.fullscreen) {
return Promise.resolve();
}
if (options.item && itemHelper.isLocalItem(options.item)) {
return Promise.resolve();
}
return validatePlayback(options);
};
return PlaybackValidation;
});

View File

@@ -1,25 +0,0 @@
if (!Array.prototype.filter) {
Array.prototype.filter = function (fun /*, thisp*/) {
"use strict";
if (this == null)
throw new TypeError();
var t = Object(this);
var len = t.length >>> 0;
if (typeof fun != "function")
throw new TypeError();
var res = [];
var thisp = arguments[1];
for (var i = 0; i < len; i++) {
if (i in t) {
var val = t[i]; // in case fun mutates this
if (fun.call(thisp, val, i, t))
res.push(val);
}
}
return res;
};
}

View File

@@ -1,27 +0,0 @@
if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
if (typeof this !== 'function') {
// closest thing possible to the ECMAScript 5
// internal IsCallable function
throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function () { },
fBound = function () {
return fToBind.apply(this instanceof fNOP
? this
: oThis,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
if (this.prototype) {
// Function.prototype doesn't have a prototype property
fNOP.prototype = this.prototype;
}
fBound.prototype = new fNOP();
return fBound;
};
}

View File

@@ -1,31 +0,0 @@
// http://paulirish.com/2011/requestanimationframe-for-smart-animating/
// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel
// MIT license
(function () {
var lastTime = 0;
var vendors = ['ms', 'moz', 'webkit', 'o'];
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame']
|| window[vendors[x] + 'CancelRequestAnimationFrame'];
}
if (!window.requestAnimationFrame)
window.requestAnimationFrame = function (callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
var id = window.setTimeout(function () { callback(currTime + timeToCall); },
timeToCall);
lastTime = currTime + timeToCall;
return id;
};
if (!window.cancelAnimationFrame)
window.cancelAnimationFrame = function (id) {
clearTimeout(id);
};
}());

View File

@@ -1,16 +0,0 @@
define(['appSettings', 'loading', 'apphost', 'events', 'shell', 'globalize', 'dialogHelper', 'connectionManager', 'layoutManager', 'emby-button', 'emby-linkbutton'], function (appSettings, loading, appHost, events, shell, globalize, dialogHelper, connectionManager, layoutManager) {
'use strict';
function validateFeature(feature, options) {
return Promise.resolve();
}
function showPremiereInfo() {
return Promise.resolve();
}
return {
validateFeature: validateFeature,
showPremiereInfo: showPremiereInfo
};
});

View File

@@ -1,6 +0,0 @@
self.addEventListener('sync', function (event) {
'use strict';
if (event.tag === 'emby-sync') {
}
});

View File

@@ -1,21 +0,0 @@
define([], function () {
'use strict';
return {
openUrl: function (url) {
window.open(url, '_blank');
},
canExec: false,
exec: function (options) {
// options.path
// options.arguments
return Promise.reject();
},
enableFullscreen: function () {
// do nothing since this is for native apps
},
disableFullscreen: function () {
// do nothing since this is for native apps
}
};
});

View File

@@ -1,355 +0,0 @@
define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdrop', 'globalize', 'require', 'appSettings'], function (appHost, userSettings, browser, events, pluginManager, backdrop, globalize, require, appSettings) {
'use strict';
var currentSkin;
function getCurrentSkin() {
return currentSkin;
}
function getRequirePromise(deps) {
return new Promise(function (resolve, reject) {
require(deps, resolve);
});
}
function loadSkin(id) {
var newSkin = pluginManager.plugins().filter(function (p) {
return p.id === id;
})[0];
if (!newSkin) {
newSkin = pluginManager.plugins().filter(function (p) {
return p.id === 'defaultskin';
})[0];
}
var unloadPromise;
if (currentSkin) {
if (currentSkin.id === newSkin.id) {
// Nothing to do, it's already the active skin
return Promise.resolve(currentSkin);
}
unloadPromise = unloadSkin(currentSkin);
} else {
unloadPromise = Promise.resolve();
}
return unloadPromise.then(function () {
var deps = newSkin.getDependencies();
console.log('Loading skin dependencies');
return getRequirePromise(deps).then(function () {
console.log('Skin dependencies loaded');
var strings = newSkin.getTranslations ? newSkin.getTranslations() : [];
return globalize.loadStrings({
name: newSkin.id,
strings: strings
}).then(function () {
globalize.defaultModule(newSkin.id);
return loadSkinHeader(newSkin);
});
});
});
}
function unloadSkin(skin) {
unloadTheme();
backdrop.clear();
console.log('Unloading skin: ' + skin.name);
// TODO: unload css
return skin.unload().then(function () {
document.dispatchEvent(new CustomEvent("skinunload", {
detail: {
name: skin.name
}
}));
});
}
function loadSkinHeader(skin) {
return getSkinHeader(skin).then(function (headerHtml) {
document.querySelector('.skinHeader').innerHTML = headerHtml;
currentSkin = skin;
skin.load();
return skin;
});
}
var cacheParam = new Date().getTime();
function getSkinHeader(skin) {
return new Promise(function (resolve, reject) {
if (!skin.getHeaderTemplate) {
resolve('');
return;
}
var xhr = new XMLHttpRequest();
var url = skin.getHeaderTemplate();
url += url.indexOf('?') === -1 ? '?' : '&';
url += 'v=' + cacheParam;
xhr.open('GET', url, true);
xhr.onload = function (e) {
if (this.status < 400) {
resolve(this.response);
} else {
resolve('');
}
};
xhr.send();
});
}
function loadUserSkin(options) {
var skin = userSettings.get('skin', false) || 'defaultskin';
loadSkin(skin).then(function (skin) {
options = options || {};
if (options.start) {
Emby.Page.invokeShortcut(options.start);
} else {
Emby.Page.goHome();
}
});
}
events.on(userSettings, 'change', function (e, name) {
if (name === 'skin' || name === 'language') {
loadUserSkin();
}
});
var themeStyleElement;
var currentThemeId;
function unloadTheme() {
var elem = themeStyleElement;
if (elem) {
elem.parentNode.removeChild(elem);
themeStyleElement = null;
currentThemeId = null;
}
}
function getThemes() {
if (currentSkin.getThemes) {
return currentSkin.getThemes();
}
return [];
}
var skinManager = {
getCurrentSkin: getCurrentSkin,
loadSkin: loadSkin,
loadUserSkin: loadUserSkin,
getThemes: getThemes
};
function onRegistrationSuccess() {
appSettings.set('appthemesregistered', 'true');
}
function onRegistrationFailure() {
appSettings.set('appthemesregistered', 'false');
}
function isRegistered() {
getRequirePromise(['registrationServices']).then(function (registrationServices) {
registrationServices.validateFeature('themes', {
showDialog: false
}).then(onRegistrationSuccess, onRegistrationFailure);
});
return appSettings.get('appthemesregistered') !== 'false';
}
function getThemeStylesheetInfo(id, requiresRegistration, isDefaultProperty) {
var themes = skinManager.getThemes();
var defaultTheme;
var selectedTheme;
for (var i = 0, length = themes.length; i < length; i++) {
var theme = themes[i];
if (theme[isDefaultProperty]) {
defaultTheme = theme;
}
if (id === theme.id) {
selectedTheme = theme;
}
}
selectedTheme = selectedTheme || defaultTheme;
if (selectedTheme.id !== defaultTheme.id && requiresRegistration && !isRegistered()) {
selectedTheme = defaultTheme;
}
var embyWebComponentsBowerPath = 'bower_components/emby-webcomponents';
return {
stylesheetPath: require.toUrl(embyWebComponentsBowerPath + '/themes/' + selectedTheme.id + '/theme.css'),
themeId: selectedTheme.id
};
}
var themeResources = {};
var lastSound = 0;
var currentSound;
function loadThemeResources(id) {
lastSound = 0;
if (currentSound) {
currentSound.stop();
currentSound = null;
}
backdrop.clear();
}
function onThemeLoaded() {
document.documentElement.classList.remove('preload');
try {
var color = getComputedStyle(document.querySelector('.skinHeader')).getPropertyValue("background-color");
if (color) {
appHost.setThemeColor(color);
}
}
catch (err) {
console.log('Error setting theme color: ' + err);
}
}
skinManager.setTheme = function (id, context) {
return new Promise(function (resolve, reject) {
var requiresRegistration = true;
if (currentThemeId && currentThemeId === id) {
resolve();
return;
}
var isDefaultProperty = context === 'serverdashboard' ? 'isDefaultServerDashboard' : 'isDefault';
var info = getThemeStylesheetInfo(id, requiresRegistration, isDefaultProperty);
if (currentThemeId && currentThemeId === info.themeId) {
resolve();
return;
}
var linkUrl = info.stylesheetPath;
unloadTheme();
var link = document.createElement('link');
link.setAttribute('rel', 'stylesheet');
link.setAttribute('type', 'text/css');
link.onload = function () {
onThemeLoaded();
resolve();
};
link.setAttribute('href', linkUrl);
document.head.appendChild(link);
themeStyleElement = link;
currentThemeId = info.themeId;
loadThemeResources(info.themeId);
onViewBeforeShow({});
});
};
function onViewBeforeShow(e) {
if (e.detail && e.detail.type === 'video-osd') {
return;
}
if (themeResources.backdrop) {
backdrop.setBackdrop(themeResources.backdrop);
}
if (!browser.mobile && userSettings.enableThemeSongs()) {
if (lastSound === 0) {
if (themeResources.themeSong) {
playSound(themeResources.themeSong);
}
} else if ((new Date().getTime() - lastSound) > 30000) {
if (themeResources.effect) {
playSound(themeResources.effect);
}
}
}
}
document.addEventListener('viewshow', onViewBeforeShow);
function playSound(path, volume) {
lastSound = new Date().getTime();
require(['howler'], function (howler) {
try {
var sound = new Howl({
src: [path],
volume: volume || 0.1
});
sound.play();
currentSound = sound;
}
catch (err) {
console.log('Error playing sound: ' + err);
}
});
}
return skinManager;
});

View File

@@ -1,188 +0,0 @@
define(['connectionManager', 'serverNotifications', 'events', 'globalize', 'emby-button'], function (connectionManager, serverNotifications, events, globalize, EmbyButtonPrototype) {
'use strict';
function onClick(e) {
var button = this;
var id = button.getAttribute('data-id');
var serverId = button.getAttribute('data-serverid');
var apiClient = connectionManager.getApiClient(serverId);
if (!button.classList.contains('downloadbutton-on')) {
require(['syncDialog'], function (syncDialog) {
syncDialog.showMenu({
items: [id],
mode: 'download',
serverId: serverId
}).then(function () {
button.dispatchEvent(new CustomEvent('download', {
cancelable: false
}));
});
});
} else {
require(['confirm'], function (confirm) {
confirm({
text: globalize.translate('ConfirmRemoveDownload'),
confirmText: globalize.translate('RemoveDownload'),
cancelText: globalize.translate('KeepDownload'),
primary: 'cancel'
}).then(function () {
apiClient.cancelSyncItems([id]);
button.dispatchEvent(new CustomEvent('download-cancel', {
cancelable: false
}));
});
});
}
}
function updateSyncStatus(button, syncPercent) {
var icon = button.iconElement;
if (!icon) {
button.iconElement = button.querySelector('i');
icon = button.iconElement;
}
if (syncPercent != null) {
button.classList.add('downloadbutton-on');
if (icon) {
icon.classList.add('downloadbutton-icon-on');
}
} else {
button.classList.remove('downloadbutton-on');
if (icon) {
icon.classList.remove('downloadbutton-icon-on');
}
}
if ((syncPercent || 0) >= 100) {
button.classList.add('downloadbutton-complete');
if (icon) {
icon.classList.add('downloadbutton-icon-complete');
}
} else {
button.classList.remove('downloadbutton-complete');
if (icon) {
icon.classList.remove('downloadbutton-icon-complete');
}
}
var text;
if ((syncPercent || 0) >= 100) {
text = globalize.translate('Downloaded');
} else if (syncPercent != null) {
text = globalize.translate('Downloading');
} else {
text = globalize.translate('Download');
}
var textElement = button.querySelector('.emby-downloadbutton-downloadtext');
if (textElement) {
textElement.innerHTML = text;
}
button.title = text;
}
function clearEvents(button) {
button.removeEventListener('click', onClick);
}
function bindEvents(button) {
clearEvents(button);
button.addEventListener('click', onClick);
}
var EmbyDownloadButtonPrototype = Object.create(EmbyButtonPrototype);
EmbyDownloadButtonPrototype.createdCallback = function () {
// base method
if (EmbyButtonPrototype.createdCallback) {
EmbyButtonPrototype.createdCallback.call(this);
}
};
EmbyDownloadButtonPrototype.attachedCallback = function () {
// base method
if (EmbyButtonPrototype.attachedCallback) {
EmbyButtonPrototype.attachedCallback.call(this);
}
var itemId = this.getAttribute('data-id');
var serverId = this.getAttribute('data-serverid');
if (itemId && serverId) {
bindEvents(this);
}
};
EmbyDownloadButtonPrototype.detachedCallback = function () {
// base method
if (EmbyButtonPrototype.detachedCallback) {
EmbyButtonPrototype.detachedCallback.call(this);
}
clearEvents(this);
this.iconElement = null;
};
function fetchAndUpdate(button, item) {
connectionManager.getApiClient(item.ServerId).getSyncStatus(item.Id).then(function (result) {
updateSyncStatus(button, result.Progress);
}, function () {
});
}
EmbyDownloadButtonPrototype.setItem = function (item) {
if (item) {
this.setAttribute('data-id', item.Id);
this.setAttribute('data-serverid', item.ServerId);
fetchAndUpdate(this, item);
bindEvents(this);
} else {
this.removeAttribute('data-id');
this.removeAttribute('data-serverid');
clearEvents(this);
}
};
document.registerElement('emby-downloadbutton', {
prototype: EmbyDownloadButtonPrototype,
extends: 'button'
});
});

View File

@@ -1,736 +0,0 @@
define(['apphost', 'globalize', 'connectionManager', 'layoutManager', 'focusManager', 'scrollHelper', 'appSettings', 'registrationServices', 'dialogHelper', 'paper-icon-button-light', 'formDialogStyle'], function (appHost, globalize, connectionManager, layoutManager, focusManager, scrollHelper, appSettings, registrationServices, dialogHelper) {
'use strict';
var currentDialogOptions;
function submitJob(dlg, apiClient, userId, syncOptions, form) {
if (!userId) {
throw new Error('userId cannot be null');
}
if (!syncOptions) {
throw new Error('syncOptions cannot be null');
}
if (!form) {
throw new Error('form cannot be null');
}
var selectSyncTarget = form.querySelector('#selectSyncTarget');
var target = selectSyncTarget ? selectSyncTarget.value : null;
if (!target) {
require(['toast'], function (toast) {
toast(globalize.translate('PleaseSelectDeviceToSyncTo'));
});
return false;
}
var options = {
userId: userId,
TargetId: target,
ParentId: syncOptions.ParentId,
Category: syncOptions.Category
};
setJobValues(options, form);
if (syncOptions.items && syncOptions.items.length) {
options.ItemIds = (syncOptions.items || []).map(function (i) {
return i.Id || i;
}).join(',');
}
apiClient.ajax({
type: "POST",
url: apiClient.getUrl("Sync/Jobs"),
data: JSON.stringify(options),
contentType: "application/json",
dataType: 'json'
}).then(function () {
dialogHelper.close(dlg);
require(['toast'], function (toast) {
showSubmissionToast(target, apiClient);
if (syncOptions.mode === 'download') {
syncNow();
}
});
});
return true;
}
function showSubmissionToast(targetId, apiClient) {
require(['toast'], function (toast) {
var msg = targetId === apiClient.deviceId() ?
globalize.translate('DownloadingDots') :
globalize.translate('SyncingDots');
toast(msg);
});
}
function syncNow() {
require(['localsync'], function (localSync) {
localSync.sync();
});
}
function submitQuickSyncJob(apiClient, userId, targetId, syncOptions) {
if (!userId) {
throw new Error('userId cannot be null');
}
if (!syncOptions) {
throw new Error('syncOptions cannot be null');
}
if (!targetId) {
throw new Error('targetId cannot be null');
}
var options = {
userId: userId,
TargetId: targetId,
ParentId: syncOptions.ParentId,
Category: syncOptions.Category,
Quality: syncOptions.Quality,
Bitrate: syncOptions.Bitrate
};
if (syncOptions.items && syncOptions.items.length) {
options.ItemIds = (syncOptions.items || []).map(function (i) {
return i.Id || i;
}).join(',');
}
return apiClient.ajax({
type: "POST",
url: apiClient.getUrl("Sync/Jobs"),
data: JSON.stringify(options),
contentType: "application/json",
dataType: 'json'
}).then(function () {
require(['toast'], function (toast) {
showSubmissionToast(targetId, apiClient);
if (syncOptions.mode === 'download') {
syncNow();
}
});
});
}
function setJobValues(job, form) {
var txtBitrate = form.querySelector('#txtBitrate');
var bitrate = txtBitrate ? txtBitrate.value : null;
if (bitrate) {
bitrate = parseFloat(bitrate) * 1000000;
}
job.Bitrate = bitrate;
var selectQuality = form.querySelector('#selectQuality');
if (selectQuality) {
job.Quality = selectQuality.value;
appSettings.set('sync-lastquality', job.Quality || '');
}
var selectProfile = form.querySelector('#selectProfile');
if (selectProfile) {
job.Profile = selectProfile.value;
}
var txtItemLimit = form.querySelector('#txtItemLimit');
if (txtItemLimit) {
job.ItemLimit = txtItemLimit.value || null;
}
var chkSyncNewContent = form.querySelector('#chkSyncNewContent');
if (chkSyncNewContent) {
job.SyncNewContent = chkSyncNewContent.checked;
}
var chkUnwatchedOnly = form.querySelector('#chkUnwatchedOnly');
if (chkUnwatchedOnly) {
job.UnwatchedOnly = chkUnwatchedOnly.checked;
}
}
function renderForm(options) {
return new Promise(function (resolve, reject) {
require(['emby-checkbox', 'emby-input', 'emby-select'], function () {
renderFormInternal(options, connectionManager.deviceId(), resolve);
});
});
}
function renderFormInternal(options, defaultTargetId, resolve) {
var elem = options.elem;
var dialogOptions = options.dialogOptions;
var targets = dialogOptions.Targets;
var html = '';
var mode = options.mode;
var targetContainerClass = mode === 'download' ? ' hide' : '';
var syncTargetLabel = mode === 'convert' ? globalize.translate('LabelConvertTo') : globalize.translate('LabelSyncTo');
if (options.readOnlySyncTarget) {
html += '<div class="inputContainer' + targetContainerClass + '">';
html += '<input is="emby-input" type="text" id="selectSyncTarget" readonly label="' + syncTargetLabel + '"/>';
html += '</div>';
} else {
html += '<div class="selectContainer' + targetContainerClass + '">';
html += '<select is="emby-select" id="selectSyncTarget" required="required" label="' + syncTargetLabel + '">';
html += targets.map(function (t) {
var isSelected = defaultTargetId === t.Id;
var selectedHtml = isSelected ? ' selected="selected"' : '';
return '<option' + selectedHtml + ' value="' + t.Id + '">' + t.Name + '</option>';
}).join('');
html += '</select>';
if (!targets.length) {
html += '<div class="fieldDescription">' + globalize.translate('LabelSyncNoTargetsHelp') + '</div>';
}
if (appHost.supports('externallinks')) {
html += '<div class="fieldDescription"><a is="emby-linkbutton" class="button-link lnkLearnMore" href="https://github.com/MediaBrowser/Wiki/wiki/Sync" target="_blank">' + globalize.translate('LearnMore') + '</a></div>';
}
html += '</div>';
}
html += '<div class="fldProfile selectContainer hide">';
html += '<select is="emby-select" id="selectProfile" label="' + globalize.translate('LabelProfile') + '">';
html += '</select>';
html += '<div class="fieldDescription profileDescription"></div>';
html += '</div>';
html += '<div class="fldQuality selectContainer hide">';
html += '<select is="emby-select" id="selectQuality" required="required" label="' + globalize.translate('LabelQuality') + '">';
html += '</select>';
html += '<div class="fieldDescription qualityDescription"></div>';
html += '</div>';
html += '<div class="fldBitrate inputContainer hide">';
html += '<input is="emby-input" type="number" step=".1" min=".1" id="txtBitrate" label="' + globalize.translate('LabelBitrateMbps') + '"/>';
html += '</div>';
if (dialogOptions.Options.indexOf('UnwatchedOnly') !== -1) {
html += '<div class="checkboxContainer checkboxContainer-withDescription">';
html += '<label>';
html += '<input is="emby-checkbox" type="checkbox" id="chkUnwatchedOnly"/>';
if (mode === 'convert') {
html += '<span>' + globalize.translate('ConvertUnwatchedVideosOnly') + '</span>';
} else {
html += '<span>' + globalize.translate('SyncUnwatchedVideosOnly') + '</span>';
}
html += '</label>';
if (mode === 'convert') {
html += '<div class="fieldDescription checkboxFieldDescription">' + globalize.translate('ConvertUnwatchedVideosOnlyHelp') + '</div>';
} else {
html += '<div class="fieldDescription checkboxFieldDescription">' + globalize.translate('SyncUnwatchedVideosOnlyHelp') + '</div>';
}
html += '</div>';
}
if (dialogOptions.Options.indexOf('SyncNewContent') !== -1) {
html += '<div class="checkboxContainer checkboxContainer-withDescription">';
html += '<label>';
html += '<input is="emby-checkbox" type="checkbox" id="chkSyncNewContent"/>';
if (mode === 'convert') {
html += '<span>' + globalize.translate('AutomaticallyConvertNewContent') + '</span>';
} else {
html += '<span>' + globalize.translate('AutomaticallySyncNewContent') + '</span>';
}
html += '</label>';
if (mode === 'convert') {
html += '<div class="fieldDescription checkboxFieldDescription">' + globalize.translate('AutomaticallyConvertNewContentHelp') + '</div>';
} else {
html += '<div class="fieldDescription checkboxFieldDescription">' + globalize.translate('AutomaticallySyncNewContentHelp') + '</div>';
}
html += '</div>';
}
if (dialogOptions.Options.indexOf('ItemLimit') !== -1) {
html += '<div class="inputContainer">';
html += '<input is="emby-input" type="number" step="1" min="1" id="txtItemLimit" label="' + globalize.translate('LabelItemLimit') + '"/>';
if (mode === 'convert') {
html += '<div class="fieldDescription">' + globalize.translate('ConvertItemLimitHelp') + '</div>';
} else {
html += '<div class="fieldDescription">' + globalize.translate('DownloadItemLimitHelp') + '</div>';
}
html += '</div>';
}
//html += '</div>';
//html += '</div>';
elem.innerHTML = html;
var selectSyncTarget = elem.querySelector('#selectSyncTarget');
if (selectSyncTarget) {
selectSyncTarget.addEventListener('change', function () {
loadQualityOptions(elem, this.value, options.dialogOptionsFn).then(resolve);
});
selectSyncTarget.dispatchEvent(new CustomEvent('change', {
bubbles: true
}));
}
var selectProfile = elem.querySelector('#selectProfile');
if (selectProfile) {
selectProfile.addEventListener('change', function () {
onProfileChange(elem, this.value);
});
if (dialogOptions.ProfileOptions.length) {
selectProfile.dispatchEvent(new CustomEvent('change', {
bubbles: true
}));
}
}
var selectQuality = elem.querySelector('#selectQuality');
if (selectQuality) {
selectQuality.addEventListener('change', function () {
onQualityChange(elem, this.value);
});
selectQuality.dispatchEvent(new CustomEvent('change', {
bubbles: true
}));
}
// This isn't ideal, but allow time for the change handlers above to run
setTimeout(function () {
focusManager.autoFocus(elem);
}, 100);
}
function showWifiMessage() {
require(['dialog', 'appRouter'], function (dialog, appRouter) {
var options = {
title: globalize.translate('HeaderWaitingForWifi'),
text: globalize.translate('WifiRequiredToDownload')
};
var items = [];
items.push({
name: options.confirmText || globalize.translate('ButtonOk'),
id: 'ok',
type: 'submit'
});
items.push({
name: options.cancelText || globalize.translate('HeaderDownloadSettings'),
id: 'downloadsettings',
type: 'cancel'
});
options.buttons = items;
dialog(options).then(function (result) {
if (result === 'ok') {
return Promise.resolve();
}
if (result === 'downloadsettings') {
appRouter.show(appRouter.getRouteUrl('downloadsettings'));
return Promise.resolve();
}
return Promise.reject();
});
});
}
function validateNetwork() {
var network = navigator.connection ? navigator.connection.type : null;
switch (network) {
case 'cellular':
case 'bluetooth':
showWifiMessage();
return false;
default:
return true;
}
}
function showSyncMenu(options) {
if (options.mode === 'download' && appSettings.syncOnlyOnWifi() && !validateNetwork()) {
return Promise.reject();
}
return registrationServices.validateFeature('sync').then(function () {
return showSyncMenuInternal(options);
});
}
function enableAutoSync(options) {
if (options.mode !== 'download') {
return false;
}
var firstItem = (options.items || [])[0] || {};
if (firstItem.Type === 'Audio') {
return true;
}
if (firstItem.Type === 'MusicAlbum') {
return true;
}
if (firstItem.Type === 'MusicArtist') {
return true;
}
if (firstItem.Type === 'MusicGenre') {
return true;
}
if (firstItem.Type === 'Playlist' && firstItem.MediaType === 'Audio') {
return true;
}
return false;
}
function showSyncMenuInternal(options) {
var apiClient = connectionManager.getApiClient(options.serverId);
var userId = apiClient.getCurrentUserId();
if (enableAutoSync(options)) {
return submitQuickSyncJob(apiClient, userId, apiClient.deviceId(), {
items: options.items,
Quality: 'custom',
Bitrate: appSettings.maxStaticMusicBitrate()
});
}
var dialogOptionsFn = getTargetDialogOptionsFn(apiClient, {
UserId: userId,
ItemIds: (options.items || []).map(function (i) {
return i.Id || i;
}).join(','),
ParentId: options.ParentId,
Category: options.Category,
IncludeProviders: options.mode === 'convert' ? 'ConvertSyncProvider' : null,
ExcludeProviders: options.mode === 'convert' ? null : 'ConvertSyncProvider'
});
return dialogOptionsFn().then(function (dialogOptions) {
currentDialogOptions = dialogOptions;
var dlgElementOptions = {
removeOnClose: true,
scrollY: false,
autoFocus: false
};
if (layoutManager.tv) {
dlgElementOptions.size = 'fullscreen';
} else {
dlgElementOptions.size = 'small';
}
var dlg = dialogHelper.createDialog(dlgElementOptions);
dlg.classList.add('formDialog');
var html = '';
html += '<div class="formDialogHeader">';
html += '<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><i class="md-icon">&#xE5C4;</i></button>';
html += '<h3 class="formDialogHeaderTitle">';
var syncButtonLabel = options.mode === 'download' ?
globalize.translate('Download') :
(options.mode === 'convert' ? globalize.translate('Convert') : globalize.translate('Sync'));
html += syncButtonLabel;
html += '</h3>';
if (appHost.supports('externallinks')) {
html += '<a is="emby-linkbutton" href="https://github.com/MediaBrowser/Wiki/wiki/Sync" target="_blank" class="button-link lnkHelp" style="margin-top:0;display:inline-block;vertical-align:middle;margin-left:auto;"><i class="md-icon">info</i><span>' + globalize.translate('Help') + '</span></a>';
}
html += '</div>';
html += '<div class="formDialogContent smoothScrollY" style="padding-top:2em;">';
html += '<div class="dialogContentInner dialog-content-centered">';
html += '<form class="formSubmitSyncRequest" style="margin: auto;">';
html += '<div class="formFields"></div>';
html += '<div class="formDialogFooter">';
html += '<button is="emby-button" type="submit" class="raised button-submit block formDialogFooterItem"><span>' + syncButtonLabel + '</span></button>';
html += '</div>';
html += '</form>';
html += '</div>';
html += '</div>';
dlg.innerHTML = html;
var submitted = false;
dlg.querySelector('form').addEventListener('submit', function (e) {
submitted = submitJob(dlg, apiClient, userId, options, this);
e.preventDefault();
return false;
});
dlg.querySelector('.btnCancel').addEventListener('click', function () {
dialogHelper.close(dlg);
});
if (layoutManager.tv) {
scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
}
var promise = dialogHelper.open(dlg);
renderForm({
elem: dlg.querySelector('.formFields'),
dialogOptions: dialogOptions,
dialogOptionsFn: dialogOptionsFn,
mode: options.mode
});
return promise.then(function () {
if (layoutManager.tv) {
scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false);
}
if (submitted) {
return Promise.resolve();
}
return Promise.reject();
});
});
}
function getTargetDialogOptionsFn(apiClient, query) {
return function (targetId) {
query.TargetId = targetId;
return apiClient.getJSON(apiClient.getUrl('Sync/Options', query));
};
}
function setQualityFieldVisible(form, visible) {
var fldQuality = form.querySelector('.fldQuality');
var selectQuality = form.querySelector('#selectQuality');
if (visible) {
if (fldQuality) {
fldQuality.classList.remove('hide');
}
if (selectQuality) {
//selectQuality.setAttribute('required', 'required');
// This is a hack due to what appears to be a edge bug but it shoudln't matter as the list always has selectable items
selectQuality.removeAttribute('required');
}
} else {
if (fldQuality) {
fldQuality.classList.add('hide');
}
if (selectQuality) {
selectQuality.removeAttribute('required');
}
}
}
function onProfileChange(form, profileId) {
var options = currentDialogOptions || {};
var profileOptions = options.ProfileOptions || [];
if (!profileOptions.length) {
return;
}
var option = profileOptions.filter(function (o) {
return o.Id === profileId;
})[0];
var qualityOptions = options.QualityOptions || [];
if (option) {
form.querySelector('.profileDescription').innerHTML = option.Description || '';
setQualityFieldVisible(form, qualityOptions.length > 0 && option.EnableQualityOptions && options.Options.indexOf('Quality') !== -1);
} else {
form.querySelector('.profileDescription').innerHTML = '';
setQualityFieldVisible(form, qualityOptions.length > 0 && options.Options.indexOf('Quality') !== -1);
}
}
function onQualityChange(form, qualityId) {
var options = currentDialogOptions || {};
var option = (options.QualityOptions || []).filter(function (o) {
return o.Id === qualityId;
})[0];
var qualityDescription = form.querySelector('.qualityDescription');
if (option) {
qualityDescription.innerHTML = option.Description || '';
} else {
qualityDescription.innerHTML = '';
}
var fldBitrate = form.querySelector('.fldBitrate');
var txtBitrate = form.querySelector('#txtBitrate');
if (qualityId === 'custom') {
if (fldBitrate) {
fldBitrate.classList.remove('hide');
}
if (txtBitrate) {
txtBitrate.setAttribute('required', 'required');
}
} else {
if (fldBitrate) {
fldBitrate.classList.add('hide');
}
if (txtBitrate) {
txtBitrate.removeAttribute('required');
}
}
}
function renderTargetDialogOptions(form, options) {
currentDialogOptions = options;
var fldProfile = form.querySelector('.fldProfile');
var selectProfile = form.querySelector('#selectProfile');
if (options.ProfileOptions.length && options.Options.indexOf('Profile') !== -1) {
if (fldProfile) {
fldProfile.classList.remove('hide');
}
if (selectProfile) {
selectProfile.setAttribute('required', 'required');
}
} else {
if (fldProfile) {
fldProfile.classList.add('hide');
}
if (selectProfile) {
selectProfile.removeAttribute('required');
}
}
setQualityFieldVisible(form, options.QualityOptions.length > 0);
if (selectProfile) {
selectProfile.innerHTML = options.ProfileOptions.map(function (o) {
var selectedAttribute = o.IsDefault ? ' selected="selected"' : '';
return '<option value="' + o.Id + '"' + selectedAttribute + '>' + o.Name + '</option>';
}).join('');
selectProfile.dispatchEvent(new CustomEvent('change', {
bubbles: true
}));
}
var selectQuality = form.querySelector('#selectQuality');
if (selectQuality) {
selectQuality.innerHTML = options.QualityOptions.map(function (o) {
var selectedAttribute = o.IsDefault ? ' selected="selected"' : '';
return '<option value="' + o.Id + '"' + selectedAttribute + '>' + o.Name + '</option>';
}).join('');
var lastQuality = appSettings.get('sync-lastquality');
if (lastQuality && options.QualityOptions.filter(function (i) {
return i.Id === lastQuality;
}).length) {
selectQuality.value = lastQuality;
}
selectQuality.dispatchEvent(new CustomEvent('change', {
bubbles: true
}));
}
}
function loadQualityOptions(form, targetId, dialogOptionsFn) {
return dialogOptionsFn(targetId).then(function (options) {
return renderTargetDialogOptions(form, options);
});
}
return {
showMenu: showSyncMenu,
renderForm: renderForm,
setJobValues: setJobValues
};
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

View File

@@ -1,313 +0,0 @@
define(['browser', 'dom', 'layoutManager', 'css!./viewcontainer-lite'], function (browser, dom, layoutManager) {
'use strict';
var mainAnimatedPages = document.querySelector('.mainAnimatedPages');
var allPages = [];
var currentUrls = [];
var pageContainerCount = 3;
var selectedPageIndex = -1;
function enableAnimation() {
// too slow
if (browser.tv) {
return false;
}
return browser.supportsCssAnimation();
}
function findLastView(parent, className) {
var nodes = parent.childNodes;
for (var i = nodes.length - 1; i >= 0; i--) {
var node = nodes[i];
var classList = node.classList;
if (classList && classList.contains(className)) {
return node;
}
}
}
function findViewBefore(elem, className) {
var node = elem.previousSibling;
while (node) {
var classList = node.classList;
if (classList && classList.contains(className)) {
return node;
}
node = node.previousSibling;
}
}
function loadView(options) {
if (options.cancel) {
return;
}
cancelActiveAnimations();
var selected = selectedPageIndex;
var previousAnimatable = selected === -1 ? null : allPages[selected];
var pageIndex = selected + 1;
if (pageIndex >= pageContainerCount) {
pageIndex = 0;
}
var viewHtml = options.view;
var properties = [];
if (options.fullscreen) {
properties.push('fullscreen');
}
var currentPage = allPages[pageIndex];
var view;
if (currentPage) {
triggerDestroy(currentPage);
currentPage.insertAdjacentHTML('beforebegin', viewHtml);
view = findViewBefore(currentPage, 'view');
mainAnimatedPages.removeChild(currentPage);
} else {
mainAnimatedPages.insertAdjacentHTML('beforeend', viewHtml);
view = findLastView(mainAnimatedPages, 'view');
}
view.classList.add('mainAnimatedPage');
if (properties.length) {
view.setAttribute('data-properties', properties.join(','));
}
if (options.type) {
view.setAttribute('data-type', options.type);
}
allPages[pageIndex] = view;
if (onBeforeChange) {
onBeforeChange(view, false, options);
}
beforeAnimate(allPages, pageIndex, selected);
// animate here
return animate(view, previousAnimatable, options.transition, options.isBack).then(function () {
selectedPageIndex = pageIndex;
currentUrls[pageIndex] = options.url;
if (!options.cancel && previousAnimatable) {
afterAnimate(allPages, pageIndex);
}
return view;
});
}
function beforeAnimate(allPages, newPageIndex, oldPageIndex) {
for (var i = 0, length = allPages.length; i < length; i++) {
if (newPageIndex === i || oldPageIndex === i) {
//allPages[i].classList.remove('hide');
} else {
allPages[i].classList.add('hide');
}
}
}
function afterAnimate(allPages, newPageIndex) {
for (var i = 0, length = allPages.length; i < length; i++) {
if (newPageIndex === i) {
//allPages[i].classList.remove('hide');
} else {
allPages[i].classList.add('hide');
}
}
}
function animate(newAnimatedPage, oldAnimatedPage, transition, isBack) {
if (enableAnimation() && oldAnimatedPage) {
if (transition === 'slide') {
return slide(newAnimatedPage, oldAnimatedPage, transition, isBack);
} else if (transition === 'fade') {
return fade(newAnimatedPage, oldAnimatedPage, transition, isBack);
} else {
clearAnimation(newAnimatedPage);
if (oldAnimatedPage) {
clearAnimation(oldAnimatedPage);
}
}
}
return Promise.resolve();
}
function clearAnimation(elem) {
setAnimation(elem, 'none');
}
function slide(newAnimatedPage, oldAnimatedPage, transition, isBack) {
return new Promise(function (resolve, reject) {
var duration = layoutManager.tv ? 450 : 160;
var animations = [];
if (oldAnimatedPage) {
if (isBack) {
setAnimation(oldAnimatedPage, 'view-slideright-r ' + duration + 'ms ease-out normal both');
} else {
setAnimation(oldAnimatedPage, 'view-slideleft-r ' + duration + 'ms ease-out normal both');
}
animations.push(oldAnimatedPage);
}
if (isBack) {
setAnimation(newAnimatedPage, 'view-slideright ' + duration + 'ms ease-out normal both');
} else {
setAnimation(newAnimatedPage, 'view-slideleft ' + duration + 'ms ease-out normal both');
}
animations.push(newAnimatedPage);
currentAnimations = animations;
var onAnimationComplete = function () {
dom.removeEventListener(newAnimatedPage, dom.whichAnimationEvent(), onAnimationComplete, {
once: true
});
resolve();
};
dom.addEventListener(newAnimatedPage, dom.whichAnimationEvent(), onAnimationComplete, {
once: true
});
});
}
function fade(newAnimatedPage, oldAnimatedPage, transition, isBack) {
return new Promise(function (resolve, reject) {
var duration = layoutManager.tv ? 450 : 270;
var animations = [];
newAnimatedPage.style.opacity = 0;
setAnimation(newAnimatedPage, 'view-fadein ' + duration + 'ms ease-in normal both');
animations.push(newAnimatedPage);
if (oldAnimatedPage) {
setAnimation(oldAnimatedPage, 'view-fadeout ' + duration + 'ms ease-out normal both');
animations.push(oldAnimatedPage);
}
currentAnimations = animations;
var onAnimationComplete = function () {
dom.removeEventListener(newAnimatedPage, dom.whichAnimationEvent(), onAnimationComplete, {
once: true
});
resolve();
};
dom.addEventListener(newAnimatedPage, dom.whichAnimationEvent(), onAnimationComplete, {
once: true
});
});
}
function setAnimation(elem, value) {
requestAnimationFrame(function () {
elem.style.animation = value;
});
}
var currentAnimations = [];
function cancelActiveAnimations() {
var animations = currentAnimations;
for (var i = 0, length = animations.length; i < length; i++) {
animations[i].style.animation = 'none';
}
}
var onBeforeChange;
function setOnBeforeChange(fn) {
onBeforeChange = fn;
}
function tryRestoreView(options) {
var url = options.url;
var index = currentUrls.indexOf(url);
if (index !== -1) {
var animatable = allPages[index];
var view = animatable;
if (view) {
if (options.cancel) {
return;
}
cancelActiveAnimations();
var selected = selectedPageIndex;
var previousAnimatable = selected === -1 ? null : allPages[selected];
if (onBeforeChange) {
onBeforeChange(view, true, options);
}
beforeAnimate(allPages, index, selected);
animatable.classList.remove('hide');
return animate(animatable, previousAnimatable, options.transition, options.isBack).then(function () {
selectedPageIndex = index;
if (!options.cancel && previousAnimatable) {
afterAnimate(allPages, index);
}
return view;
});
}
}
return Promise.reject();
}
function triggerDestroy(view) {
view.dispatchEvent(new CustomEvent('viewdestroy', {
cancelable: false
}));
}
function reset() {
allPages = [];
currentUrls = [];
mainAnimatedPages.innerHTML = '';
selectedPageIndex = -1;
}
return {
loadView: loadView,
tryRestoreView: tryRestoreView,
reset: reset,
setOnBeforeChange: setOnBeforeChange
};
});

View File

@@ -0,0 +1,3 @@
{
"main": "actionsheet.js"
}

45
src/components/alert.js Normal file
View File

@@ -0,0 +1,45 @@
define(['browser', 'dialog', 'globalize'], function (browser, dialog, globalize) {
'use strict';
function replaceAll(originalString, strReplace, strWith) {
var reg = new RegExp(strReplace, 'ig');
return originalString.replace(reg, strWith);
}
return function (text, title) {
var options;
if (typeof text === 'string') {
options = {
title: title,
text: text
};
} else {
options = text;
}
if (browser.tv && window.alert) {
alert(replaceAll(options.text || '', '<br/>', '\n'));
} else {
var items = [];
items.push({
name: globalize.translate('ButtonGotIt'),
id: 'ok',
type: 'submit'
});
options.buttons = items;
return dialog(options).then(function (result) {
if (result === 'ok') {
return Promise.resolve();
}
return Promise.reject();
});
}
return Promise.resolve();
};
});

View File

@@ -1,4 +1,4 @@
define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinManager', 'pluginManager', 'backdrop', 'browser', 'pageJs', 'appSettings', 'apphost', 'connectionManager'], function (loading, globalize, events, viewManager, layoutManager, skinManager, pluginManager, backdrop, browser, page, appSettings, appHost, connectionManager) {
define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinManager', 'pluginManager', 'backdrop', 'browser', 'page', 'appSettings', 'apphost', 'connectionManager'], function (loading, globalize, events, viewManager, layoutManager, skinManager, pluginManager, backdrop, browser, page, appSettings, appHost, connectionManager) {
'use strict';
var appRouter = {
@@ -14,31 +14,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
},
showSettings: function () {
show('/settings/settings.html');
},
showSearch: function () {
skinManager.getCurrentSkin().search();
},
showGenre: function (options) {
skinManager.getCurrentSkin().showGenre(options);
},
showGuide: function () {
skinManager.getCurrentSkin().showGuide({
serverId: connectionManager.currentApiClient().serverId()
});
},
showLiveTV: function () {
skinManager.getCurrentSkin().showLiveTV({
serverId: connectionManager.currentApiClient().serverId()
});
},
showRecordedTV: function () {
skinManager.getCurrentSkin().showRecordedTV();
},
showFavorites: function () {
skinManager.getCurrentSkin().showFavorites();
},
showNowPlaying: function () {
skinManager.getCurrentSkin().showNowPlaying();
}
};
@@ -125,13 +100,11 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
sendRouteToViewManager(ctx, next, route, controllerFactory);
};
require(route.dependencies || [], function () {
if (route.controller) {
require([route.controller], onInitComplete);
} else {
onInitComplete();
}
});
if (route.controller) {
require(['controllers/' + route.controller], onInitComplete);
} else {
onInitComplete();
}
}
function cancelCurrentLoadRequest() {
@@ -356,15 +329,12 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
events.on(appHost, 'resume', onAppResume);
connectionManager.connect({
enableAutoLogin: appSettings.enableAutoLogin()
}).then(function (result) {
firstConnectionResult = result;
loading.hide();
options = options || {};
page({
@@ -372,6 +342,8 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
hashbang: options.hashbang !== false,
enableHistory: enableHistory()
});
}).catch().then(function() {
loading.hide();
});
}
@@ -438,11 +410,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
console.log('appRouter - user is authenticated');
if (ctx.isBack && (route.isDefaultRoute || route.startup) && !isCurrentRouteStartup) {
handleBackToDefault();
return;
}
else if (route.isDefaultRoute) {
if (route.isDefaultRoute) {
console.log('appRouter - loading skin home page');
loadUserSkinWithOptions(ctx);
return;
@@ -501,30 +469,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
var isHandlingBackToDefault;
var isDummyBackToHome;
function handleBackToDefault() {
if (!appHost.supports('exitmenu') && appHost.supports('exit')) {
appHost.exit();
return;
}
isDummyBackToHome = true;
skinManager.loadUserSkin();
if (isHandlingBackToDefault) {
return;
}
// This must result in a call to either
// skinManager.loadUserSkin();
// Logout
// Or exit app
skinManager.getCurrentSkin().showBackMenu().then(function () {
isHandlingBackToDefault = false;
});
}
function loadContent(ctx, route, html, request) {
html = globalize.translateDocument(html, route.dictionary);
@@ -670,30 +614,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
return currentRouteInfo ? currentRouteInfo.route : null;
}
function goHome() {
var skin = skinManager.getCurrentSkin();
if (skin.getHomeRoute) {
var homePath = skin.getHomeRoute();
return show(pluginManager.mapRoute(skin, homePath));
} else {
var homeRoute = skin.getRoutes().filter(function (r) {
return r.type === 'home';
})[0];
return show(pluginManager.mapRoute(skin, homeRoute));
}
}
function getRouteUrl(item, options) {
if (item === 'settings') {
return 'settings/settings.html';
}
return skinManager.getCurrentSkin().getRouteUrl(item, options);
}
function showItem(item, serverId, options) {
if (typeof (item) === 'string') {
@@ -714,20 +634,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
}
}
function setTitle(title) {
skinManager.getCurrentSkin().setTitle(title);
}
function showVideoOsd() {
var skin = skinManager.getCurrentSkin();
var homeRoute = skin.getRoutes().filter(function (r) {
return r.type === 'video-osd';
})[0];
return show(pluginManager.mapRoute(skin, homeRoute));
}
var allRoutes = [];
function addRoute(path, newRoute) {
@@ -834,15 +740,11 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
appRouter.canGoBack = canGoBack;
appRouter.current = current;
appRouter.beginConnectionWizard = beginConnectionWizard;
appRouter.goHome = goHome;
appRouter.showItem = showItem;
appRouter.setTitle = setTitle;
appRouter.setTransparency = setTransparency;
appRouter.getRoutes = getRoutes;
appRouter.getRouteUrl = getRouteUrl;
appRouter.pushState = pushState;
appRouter.enableNativeHistory = enableNativeHistory;
appRouter.showVideoOsd = showVideoOsd;
appRouter.handleAnchorClick = page.handleAnchorClick;
appRouter.TransparencyLevel = {
None: 0,

View File

@@ -1,109 +1,191 @@
define(["appSettings", "browser", "events", "htmlMediaHelper"], function(appSettings, browser, events, htmlMediaHelper) {
define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSettings, browser, events, htmlMediaHelper) {
"use strict";
function getBaseProfileOptions(item) {
var disableHlsVideoAudioCodecs = [];
return item && htmlMediaHelper.enableHlsJsPlayer(item.RunTimeTicks, item.MediaType) && ((browser.edge || browser.msie) && disableHlsVideoAudioCodecs.push("mp3"), disableHlsVideoAudioCodecs.push("ac3"), disableHlsVideoAudioCodecs.push("eac3"), disableHlsVideoAudioCodecs.push("opus")), {
enableMkvProgressive: !1,
disableHlsVideoAudioCodecs: disableHlsVideoAudioCodecs
if (item && htmlMediaHelper.enableHlsJsPlayer(item.RunTimeTicks, item.MediaType)) {
if (browser.edge || browser.msie) {
disableHlsVideoAudioCodecs.push("mp3");
}
disableHlsVideoAudioCodecs.push("ac3");
disableHlsVideoAudioCodecs.push("eac3");
disableHlsVideoAudioCodecs.push("opus");
}
return {
enableMkvProgressive: false,
disableHlsVideoAudioCodecs: disableHlsVideoAudioCodecs
};
}
function getDeviceProfileForWindowsUwp(item) {
return new Promise(function(resolve, reject) {
require(["browserdeviceprofile", "environments/windows-uwp/mediacaps"], function(profileBuilder, uwpMediaCaps) {
return new Promise(function (resolve, reject) {
require(["browserdeviceprofile", "environments/windows-uwp/mediacaps"], function (profileBuilder, uwpMediaCaps) {
var profileOptions = getBaseProfileOptions(item);
profileOptions.supportsDts = uwpMediaCaps.supportsDTS(), profileOptions.supportsTrueHd = uwpMediaCaps.supportsDolby(), profileOptions.audioChannels = uwpMediaCaps.getAudioChannels(), resolve(profileBuilder(profileOptions))
})
})
profileOptions.supportsDts = uwpMediaCaps.supportsDTS();
profileOptions.supportsTrueHd = uwpMediaCaps.supportsDolby();
profileOptions.audioChannels = uwpMediaCaps.getAudioChannels();
resolve(profileBuilder(profileOptions));
});
});
}
function getDeviceProfile(item, options) {
return options = options || {}, self.Windows ? getDeviceProfileForWindowsUwp(item) : new Promise(function(resolve, reject) {
require(["browserdeviceprofile"], function(profileBuilder) {
var profile = profileBuilder(getBaseProfileOptions(item));
item && !options.isRetry && "allcomplexformats" !== appSettings.get("subtitleburnin") && (browser.orsay || browser.tizen || (profile.SubtitleProfiles.push({
Format: "ass",
Method: "External"
}), profile.SubtitleProfiles.push({
Format: "ssa",
Method: "External"
}))), resolve(profile)
})
})
options = options || {};
if (self.Windows) {
return getDeviceProfileForWindowsUwp(item);
}
return new Promise(function (resolve) {
require(["browserdeviceprofile"], function (profileBuilder) {
var profile;
if (window.NativeShell) {
profile = window.NativeShell.AppHost.getDeviceProfile(profileBuilder);
} else {
profile = profileBuilder(getBaseProfileOptions(item));
if (item && !options.isRetry && "allcomplexformats" !== appSettings.get("subtitleburnin")) {
if (!browser.orsay && !browser.tizen) {
profile.SubtitleProfiles.push({
Format: "ass",
Method: "External"
});
profile.SubtitleProfiles.push({
Format: "ssa",
Method: "External"
});
}
}
}
resolve(profile);
});
});
}
function escapeRegExp(str) {
return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1")
return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
}
function replaceAll(originalString, strReplace, strWith) {
var strReplace2 = escapeRegExp(strReplace),
reg = new RegExp(strReplace2, "ig");
return originalString.replace(reg, strWith)
var strReplace2 = escapeRegExp(strReplace);
var reg = new RegExp(strReplace2, "ig");
return originalString.replace(reg, strWith);
}
function generateDeviceId() {
var keys = [];
if (keys.push(navigator.userAgent), keys.push((new Date).getTime()), self.btoa) {
if (keys.push(navigator.userAgent), keys.push(new Date().getTime()), self.btoa) {
var result = replaceAll(btoa(keys.join("|")), "=", "1");
return Promise.resolve(result)
return Promise.resolve(result);
}
return Promise.resolve((new Date).getTime())
return Promise.resolve(new Date().getTime());
}
function getDeviceId() {
var key = "_deviceId2",
deviceId = appSettings.get(key);
return deviceId ? Promise.resolve(deviceId) : generateDeviceId().then(function(deviceId) {
return appSettings.set(key, deviceId), deviceId
})
var key = "_deviceId2";
var deviceId = appSettings.get(key);
if (deviceId) {
return Promise.resolve(deviceId);
}
return generateDeviceId().then(function (deviceId) {
appSettings.set(key, deviceId);
return deviceId;
});
}
function getDeviceName() {
var deviceName;
return deviceName = browser.tizen ? "Samsung Smart TV" : browser.web0s ? "LG Smart TV" : browser.operaTv ? "Opera TV" : browser.xboxOne ? "Xbox One" : browser.ps4 ? "Sony PS4" : browser.chrome ? "Chrome" : browser.edge ? "Edge" : browser.firefox ? "Firefox" : browser.msie ? "Internet Explorer" : browser.opera ? "Opera" : "Web Browser", browser.ipad ? deviceName += " Ipad" : browser.iphone ? deviceName += " Iphone" : browser.android && (deviceName += " Android"), deviceName
deviceName = browser.tizen ? "Samsung Smart TV" : browser.web0s ? "LG Smart TV" : browser.operaTv ? "Opera TV" : browser.xboxOne ? "Xbox One" : browser.ps4 ? "Sony PS4" : browser.chrome ? "Chrome" : browser.edge ? "Edge" : browser.firefox ? "Firefox" : browser.msie ? "Internet Explorer" : browser.opera ? "Opera" : "Web Browser";
if (browser.ipad) {
deviceName += " iPad";
} else {
if (browser.iphone) {
deviceName += " iPhone";
} else {
if (browser.android) {
deviceName += " Android";
}
}
}
return deviceName;
}
function supportsVoiceInput() {
return !browser.tv && (window.SpeechRecognition || window.webkitSpeechRecognition || window.mozSpeechRecognition || window.oSpeechRecognition || window.msSpeechRecognition)
if (!browser.tv) {
return window.SpeechRecognition || window.webkitSpeechRecognition || window.mozSpeechRecognition || window.oSpeechRecognition || window.msSpeechRecognition;
}
return false;
}
function supportsFullscreen() {
if (browser.tv) return !1;
if (browser.tv) {
return false;
}
var element = document.documentElement;
return !!(element.requestFullscreen || element.mozRequestFullScreen || element.webkitRequestFullscreen || element.msRequestFullscreen) || !!document.createElement("video").webkitEnterFullscreen
return (element.requestFullscreen || element.mozRequestFullScreen || element.webkitRequestFullscreen || element.msRequestFullscreen) || document.createElement("video").webkitEnterFullscreen;
}
function getSyncProfile() {
return new Promise(function(resolve, reject) {
require(["browserdeviceprofile", "appSettings"], function(profileBuilder, appSettings) {
var profile = profileBuilder();
profile.MaxStaticMusicBitrate = appSettings.maxStaticMusicBitrate(), resolve(profile)
})
})
return new Promise(function (resolve) {
require(["browserdeviceprofile", "appSettings"], function (profileBuilder, appSettings) {
var profile;
if (window.NativeShell) {
profile = window.NativeShell.AppHost.getSyncProfile(profileBuilder, appSettings);
} else {
profile = profileBuilder();
profile.MaxStaticMusicBitrate = appSettings.maxStaticMusicBitrate();
}
resolve(profile);
});
});
}
function getDefaultLayout() {
return "desktop"
return "desktop";
}
function supportsHtmlMediaAutoplay() {
if (browser.edgeUwp || browser.tizen || browser.web0s || browser.orsay || browser.operaTv || browser.ps4 || browser.xboxOne) return !0;
if (browser.mobile) return !1;
if (browser.edgeUwp || browser.tizen || browser.web0s || browser.orsay || browser.operaTv || browser.ps4 || browser.xboxOne) {
return true;
}
if (browser.mobile) {
return false;
}
var savedResult = appSettings.get(htmlMediaAutoplayAppStorageKey);
return "true" === savedResult || "false" !== savedResult && null
return "true" === savedResult || "false" !== savedResult && null;
}
function cueSupported() {
try {
var video = document.createElement("video"),
style = document.createElement("style");
style.textContent = "video::cue {background: inherit}", document.body.appendChild(style), document.body.appendChild(video);
var video = document.createElement("video");
var style = document.createElement("style");
style.textContent = "video::cue {background: inherit}";
document.body.appendChild(style);
document.body.appendChild(video);
var cue = window.getComputedStyle(video, "::cue").background;
return document.body.removeChild(style), document.body.removeChild(video), !!cue.length
document.body.removeChild(style);
document.body.removeChild(video);
return !!cue.length;
} catch (err) {
return console.log("Error detecting cue support:" + err), !1
console.log("Error detecting cue support:" + err);
return false;
}
}
@@ -123,40 +205,104 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function(appSett
}
var htmlMediaAutoplayAppStorageKey = "supportshtmlmediaautoplay0";
var supportedFeatures = function() {
var supportedFeatures = function () {
var features = [];
navigator.share && features.push("sharing");
browser.edgeUwp || browser.tv || browser.xboxOne || browser.ps4 || features.push("filedownload");
browser.operaTv || browser.tizen || browser.orsay || browser.web0s
? features.push("exit")
: (features.push("exitmenu"), features.push("plugins"));
browser.operaTv || browser.tizen || browser.orsay || browser.web0s || browser.ps4 || (features.push("externallinks"), features.push("externalpremium"));
browser.operaTv || features.push("externallinkdisplay");
supportsVoiceInput() && features.push("voiceinput");
!browser.tv && !browser.xboxOne && browser.ps4, supportsHtmlMediaAutoplay() && (features.push("htmlaudioautoplay"), features.push("htmlvideoautoplay"));
browser.edgeUwp && features.push("sync");
supportsFullscreen() && features.push("fullscreenchange");
(browser.chrome || browser.edge && !browser.slow) && (browser.noAnimation || browser.edgeUwp || browser.xboxOne || features.push("imageanalysis"));
(browser.tv || browser.xboxOne || browser.ps4 || browser.mobile) && features.push("physicalvolumecontrol");
browser.tv || browser.xboxOne || browser.ps4 || features.push("remotecontrol");
browser.operaTv || browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp || features.push("remotevideo");
if (navigator.share) {
features.push("sharing");
}
if (!browser.edgeUwp && !browser.tv && !browser.xboxOne && !browser.ps4) {
features.push("filedownload");
}
if (browser.operaTv || browser.tizen || browser.orsay || browser.web0s) {
features.push("exit");
} else {
features.push("exitmenu");
features.push("plugins");
}
if (!browser.operaTv && !browser.tizen && !browser.orsay && !browser.web0s && !browser.ps4) {
features.push("externallinks");
features.push("externalpremium");
}
if (!browser.operaTv) {
features.push("externallinkdisplay");
}
if (supportsVoiceInput()) {
features.push("voiceinput");
}
if (!browser.tv && !browser.xboxOne) {
browser.ps4;
}
if (supportsHtmlMediaAutoplay()) {
features.push("htmlaudioautoplay");
features.push("htmlvideoautoplay");
}
if (browser.edgeUwp) {
features.push("sync");
}
if (supportsFullscreen()) {
features.push("fullscreenchange");
}
if (browser.chrome || browser.edge && !browser.slow) {
if (!browser.noAnimation && !browser.edgeUwp && !browser.xboxOne) {
features.push("imageanalysis");
}
}
if (browser.tv || browser.xboxOne || browser.ps4 || browser.mobile) {
features.push("physicalvolumecontrol");
}
if (!browser.tv && !browser.xboxOne && !browser.ps4) {
features.push("remotecontrol");
}
if (!browser.operaTv && !browser.tizen && !browser.orsay && !browser.web0s && !browser.edgeUwp) {
features.push("remotevideo");
}
features.push("displaylanguage");
features.push("otherapppromotions");
features.push("targetblank");
features.push("multiserver");
browser.orsay || browser.tizen || browser.msie || !(browser.firefox || browser.ps4 || browser.edge || cueSupported()) || features.push("subtitleappearancesettings");
browser.orsay || browser.tizen || features.push("subtitleburnsettings");
browser.tv || browser.ps4 || browser.xboxOne || features.push("fileinput");
browser.chrome && features.push("chromecast");
features.push("targetblank"); // allows users to connect to more than one server
//features.push("multiserver");
if (!browser.orsay && !browser.tizen && !browser.msie && (browser.firefox || browser.ps4 || browser.edge || cueSupported())) {
features.push("subtitleappearancesettings");
}
if (!browser.orsay && !browser.tizen) {
features.push("subtitleburnsettings");
}
if (!browser.tv && !browser.ps4 && !browser.xboxOne) {
features.push("fileinput");
}
if (browser.chrome) {
features.push("chromecast");
}
return features;
}();
if (supportedFeatures.indexOf("htmlvideoautoplay") === -1 && supportsHtmlMediaAutoplay() !== false) {
require(["autoPlayDetect"], function(autoPlayDetect) {
autoPlayDetect.supportsHtmlMediaAutoplay().then(function() {
require(["autoPlayDetect"], function (autoPlayDetect) {
autoPlayDetect.supportsHtmlMediaAutoplay().then(function () {
appSettings.set(htmlMediaAutoplayAppStorageKey, "true");
supportedFeatures.push("htmlvideoautoplay");
supportedFeatures.push("htmlaudioautoplay");
}, function() {
}, function () {
appSettings.set(htmlMediaAutoplayAppStorageKey, "false");
});
});
@@ -168,73 +314,169 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function(appSett
var visibilityState;
var appVersion = window.dashboardVersion || "3.0";
var appHost = {
getWindowState: function() {
return document.windowState || "Normal"
getWindowState: function () {
return document.windowState || "Normal";
},
setWindowState: function(state) {
alert("setWindowState is not supported and should not be called")
setWindowState: function (state) {
alert("setWindowState is not supported and should not be called");
},
exit: function() {
if (browser.tizen) try {
tizen.application.getCurrentApplication().exit()
} catch (err) {
console.log("error closing application: " + err)
} else window.close()
exit: function () {
if (window.NativeShell) {
window.NativeShell.AppHost.exit();
} else if (browser.tizen) {
try {
tizen.application.getCurrentApplication().exit();
} catch (err) {
console.log("error closing application: " + err);
}
} else {
window.close();
}
},
supports: function(command) {
return -1 !== supportedFeatures.indexOf(command.toLowerCase())
supports: function (command) {
if (window.NativeShell) {
return window.NativeShell.AppHost.supports(command);
}
return -1 !== supportedFeatures.indexOf(command.toLowerCase());
},
preferVisualCards: browser.android || browser.chrome,
moreIcon: browser.android ? "dots-vert" : "dots-horiz",
getSyncProfile: getSyncProfile,
getDefaultLayout: getDefaultLayout,
getDefaultLayout: function () {
if (window.NativeShell) {
return window.NativeShell.AppHost.getDefaultLayout();
}
return getDefaultLayout()
},
getDeviceProfile: getDeviceProfile,
init: function() {
return deviceName = getDeviceName(), getDeviceId().then(function(resolvedDeviceId) {
deviceId = resolvedDeviceId
})
init: function () {
if (window.NativeShell) {
return window.NativeShell.AppHost.init();
}
deviceName = getDeviceName();
return getDeviceId().then(function (resolvedDeviceId) {
deviceId = resolvedDeviceId;
});
},
deviceName: function() {
return deviceName
deviceName: function () {
return window.NativeShell ? window.NativeShell.AppHost.deviceName() : deviceName;
},
deviceId: function() {
return deviceId
deviceId: function () {
return window.NativeShell ? window.NativeShell.AppHost.deviceId() : deviceId;
},
appName: function() {
return "Jellyfin Web"
appName: function () {
return window.NativeShell ? window.NativeShell.AppHost.appName() : "Jellyfin Web";
},
appVersion: function() {
return appVersion
appVersion: function () {
return window.NativeShell ? window.NativeShell.AppHost.appVersion() : appVersion;
},
getPushTokenInfo: function() {
return {}
getPushTokenInfo: function () {
return {};
},
setThemeColor: function(color) {
setThemeColor: function (color) {
var metaThemeColor = document.querySelector("meta[name=theme-color]");
metaThemeColor && metaThemeColor.setAttribute("content", color)
},
setUserScalable: function(scalable) {
if (!browser.tv) {
var att = scalable ? "width=device-width, initial-scale=1, minimum-scale=1, user-scalable=yes" : "width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no";
document.querySelector("meta[name=viewport]").setAttribute("content", att)
if (metaThemeColor) {
metaThemeColor.setAttribute("content", color);
}
},
deviceIconUrl: function() {
return browser.edgeUwp, browser.edgeUwp ? "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/windowsrt.png" : browser.opera || browser.operaTv ? "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/opera.png" : browser.orsay || browser.tizen ? "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/samsungtv.png" : browser.web0s ? "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/lgtv.png" : browser.ps4 ? "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/ps4.png" : browser.chromecast ? "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/chromecast.png" : browser.chrome ? "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/chrome.png" : browser.edge ? "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/edge.png" : browser.firefox ? "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/firefox.png" : browser.msie ? "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/internetexplorer.png" : browser.safari ? "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/safari.png" : "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/html5.png"
setUserScalable: function (scalable) {
if (!browser.tv) {
var att = scalable ? "width=device-width, initial-scale=1, minimum-scale=1, user-scalable=yes" : "width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no";
document.querySelector("meta[name=viewport]").setAttribute("content", att);
}
},
deviceIconUrl: function () {
if (browser.edgeUwp) {
return "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/windowsrt.png";
}
if (browser.opera || browser.operaTv) {
return "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/opera.png";
}
if (browser.orsay || browser.tizen) {
return "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/samsungtv.png";
}
if (browser.web0s) {
return "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/lgtv.png";
}
if (browser.ps4) {
return "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/ps4.png";
}
if (browser.chromecast) {
return "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/chromecast.png";
}
if (browser.chrome) {
return "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/chrome.png";
}
if (browser.edge) {
return "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/edge.png";
}
if (browser.firefox) {
return "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/firefox.png";
}
if (browser.msie) {
return "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/internetexplorer.png";
}
if (browser.safari) {
return "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/safari.png";
}
return "https://github.com/MediaBrowser/Emby.Resources/raw/master/images/devices/html5.png";
}
};
var doc = self.document;
doc && (void 0 !== doc.visibilityState ? (visibilityChange = "visibilitychange", visibilityState = "hidden") : void 0 !== doc.mozHidden ? (visibilityChange = "mozvisibilitychange", visibilityState = "mozVisibilityState") : void 0 !== doc.msHidden ? (visibilityChange = "msvisibilitychange", visibilityState = "msVisibilityState") : void 0 !== doc.webkitHidden && (visibilityChange = "webkitvisibilitychange", visibilityState = "webkitVisibilityState"));
var isHidden = false;
if (doc) {
doc.addEventListener(visibilityChange, function() {
document[visibilityState] ? onAppHidden() : onAppVisible()
if (void 0 !== doc.visibilityState) {
visibilityChange = "visibilitychange";
visibilityState = "hidden";
} else {
if (void 0 !== doc.mozHidden) {
visibilityChange = "mozvisibilitychange";
visibilityState = "mozVisibilityState";
} else {
if (void 0 !== doc.msHidden) {
visibilityChange = "msvisibilitychange";
visibilityState = "msVisibilityState";
} else {
if (void 0 !== doc.webkitHidden) {
visibilityChange = "webkitvisibilitychange";
visibilityState = "webkitVisibilityState";
}
}
}
}
}
var isHidden = false;
if (doc) {
doc.addEventListener(visibilityChange, function () {
if (document[visibilityState]) {
onAppHidden();
} else {
onAppVisible();
}
});
}
if (self.addEventListener) {
self.addEventListener("focus", onAppVisible);
self.addEventListener("blur", onAppHidden);
}
return appHost;
});

View File

@@ -0,0 +1,3 @@
{
"main": "backdrop.js"
}

View File

@@ -751,7 +751,7 @@ define(['browser'], function (browser) {
Condition: 'Equals',
Property: 'IsSecondaryAudio',
Value: 'false',
IsRequired: 'false'
IsRequired: false
});
}
@@ -780,7 +780,7 @@ define(['browser'], function (browser) {
Condition: 'Equals',
Property: 'IsSecondaryAudio',
Value: 'false',
IsRequired: 'false'
IsRequired: false
}
]
});
@@ -913,4 +913,4 @@ define(['browser'], function (browser) {
return profile;
};
});
});

View File

@@ -1267,13 +1267,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
var showTitle = options.showTitle === 'auto' ? true : (options.showTitle || item.Type === 'PhotoAlbum' || item.Type === 'Folder');
var overlayText = options.overlayText;
if (forceName && !options.cardLayout) {
if (overlayText == null) {
overlayText = true;
}
}
var cardImageContainerClass = 'cardImageContainer';
var coveredImage = options.coverImage || imgInfo.coverImage;

View File

@@ -1,31 +0,0 @@
define(["itemHelper", "libraryMenu", "apphost"], function(itemHelper, libraryMenu, appHost) {
"use strict";
function initSyncButtons(view) {
var apiClient = window.ApiClient;
apiClient && apiClient.getCurrentUserId() && apiClient.getCurrentUser().then(function(user) {
for (var item = {
SupportsSync: !0
}, categorySyncButtons = view.querySelectorAll(".categorySyncButton"), i = 0, length = categorySyncButtons.length; i < length; i++) categorySyncButtons[i].addEventListener("click", onCategorySyncButtonClick), itemHelper.canSync(user, item) ? categorySyncButtons[i].classList.remove("hide") : categorySyncButtons[i].classList.add("hide")
})
}
function onCategorySyncButtonClick(e) {
var button = this,
category = button.getAttribute("data-category"),
parentId = libraryMenu.getTopParentId();
require(["syncDialog"], function(syncDialog) {
syncDialog.showMenu({
ParentId: parentId,
Category: category,
serverId: ApiClient.serverId(),
mode: appHost.supports("sync") ? "download" : "sync"
})
})
}
return {
init: function(view) {
initSyncButtons(view)
}
}
});

View File

@@ -28,15 +28,18 @@ define(["dialogHelper", "loading", "connectionManager", "globalize", "actionshee
function onChannelsElementClick(e) {
var btnMap = parentWithClass(e.target, "btnMap");
if (btnMap) {
var channelId = btnMap.getAttribute("data-id"),
providerChannelId = btnMap.getAttribute("data-providerid"),
menuItems = currentMappingOptions.ProviderChannels.map(function(m) {
return {
name: m.Name,
id: m.Id,
selected: m.Id.toLowerCase() === providerChannelId.toLowerCase()
}
});
var channelId = btnMap.getAttribute("data-id");
var providerChannelId = btnMap.getAttribute("data-providerid");
var menuItems = currentMappingOptions.ProviderChannels.map(function(m) {
return {
name: m.Name,
id: m.Id,
selected: m.Id.toLowerCase() === providerChannelId.toLowerCase()
}
}).sort(function (a, b) {
return a.name.localeCompare(b.name);
});
actionsheet.show({
positionTo: btnMap,
items: menuItems
@@ -93,4 +96,4 @@ define(["dialogHelper", "loading", "connectionManager", "globalize", "actionshee
})
}
}
});
});

View File

@@ -187,8 +187,13 @@ define(['events'], function (events) {
return apiClient.getEndpointInfo().then(function (endpoint) {
if (endpoint.IsInNetwork) {
return apiClient.getPublicSystemInfo().then(function (info) {
addToCache(serverAddress, info.LocalAddress);
return info.LocalAddress;
var localAddress = info.LocalAddress
if (!localAddress) {
console.log("No valid local address returned, defaulting to external one")
localAddress = serverAddress;
}
addToCache(serverAddress, localAddress);
return localAddress;
});
} else {
addToCache(serverAddress, serverAddress);

View File

@@ -220,7 +220,9 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
this.session = null;
this.deviceState = DEVICE_STATE.IDLE;
this.castPlayerState = PLAYER_STATE.IDLE;
document.removeEventListener("volumeupbutton", onVolumeUpKeyDown, false);
document.removeEventListener("volumedownbutton", onVolumeDownKeyDown, false);
//console.log('sessionUpdateListener: setting currentMediaSession to null');
this.currentMediaSession = null;
@@ -258,6 +260,9 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
this.session.addMediaListener(this.sessionMediaListener.bind(this));
this.session.addUpdateListener(this.sessionUpdateListener.bind(this));
document.addEventListener("volumeupbutton", onVolumeUpKeyDown, false);
document.addEventListener("volumedownbutton", onVolumeDownKeyDown, false);
events.trigger(this, 'connect');
this.sendMessage({
@@ -266,6 +271,14 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
});
};
function onVolumeUpKeyDown() {
playbackManager.volumeUp();
}
function onVolumeDownKeyDown() {
playbackManager.volumeDown();
}
/**
* session update listener
*/
@@ -305,6 +318,8 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
//console.log(message);
this.deviceState = DEVICE_STATE.IDLE;
this.castPlayerState = PLAYER_STATE.IDLE;
document.removeEventListener("volumeupbutton", onVolumeUpKeyDown, false);
document.removeEventListener("volumedownbutton", onVolumeDownKeyDown, false);
//console.log('onStopAppSuccess: setting currentMediaSession to null');
this.currentMediaSession = null;
@@ -574,8 +589,15 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
events.trigger(instance, "playbackstop", [state]);
var state = instance.lastPlayerData.PlayState || {};
var volume = state.VolumeLevel || 0.5;
var mute = state.IsMuted || false;
// Reset this so the next query doesn't make it appear like content is playing.
instance.lastPlayerData = {};
instance.lastPlayerData.PlayState = {};
instance.lastPlayerData.PlayState.VolumeLevel = volume;
instance.lastPlayerData.PlayState.IsMuted = mute;
});
events.on(instance._castPlayer, "playbackprogress", function (e, data) {
@@ -780,11 +802,16 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
};
ChromecastPlayer.prototype.volumeDown = function () {
var vol = this._castPlayer.session.receiver.volume.level;
if (vol == null)
{
vol = 0.5;
}
vol -= 0.05;
vol = Math.max(vol, 0);
this._castPlayer.session.setReceiverVolumeLevel(vol);
this._castPlayer.sendMessage({
options: {},
command: 'VolumeDown'
});
};
ChromecastPlayer.prototype.endSession = function () {
@@ -799,24 +826,24 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
};
ChromecastPlayer.prototype.volumeUp = function () {
var vol = this._castPlayer.session.receiver.volume.level;
if (vol == null)
{
vol = 0.5;
}
vol += 0.05;
vol = Math.min(vol, 1);
this._castPlayer.sendMessage({
options: {},
command: 'VolumeUp'
});
this._castPlayer.session.setReceiverVolumeLevel(vol);
};
ChromecastPlayer.prototype.setVolume = function (vol) {
vol = Math.min(vol, 100);
vol = Math.max(vol, 0);
this._castPlayer.sendMessage({
options: {
volume: vol
},
command: 'SetVolume'
});
vol = vol / 100;
this._castPlayer.session.setReceiverVolumeLevel(vol);
};
ChromecastPlayer.prototype.unpause = function () {

View File

@@ -1,4 +1,4 @@
define(['dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'emby-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button', 'emby-linkbutton', 'flexStyles'], function (dialogHelper, loading, appHost, layoutManager, connectionManager, appRouter, globalize) {
define(['dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'emby-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (dialogHelper, loading, appHost, layoutManager, connectionManager, appRouter, globalize) {
'use strict';
var currentServerId;

View File

@@ -0,0 +1,3 @@
{
"main": "dialog.js"
}

View File

@@ -0,0 +1,3 @@
{
"main": "dialogHelper.js"
}

View File

@@ -1,4 +1,4 @@
define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'emby-button', 'paper-icon-button-light', 'css!./directorybrowser', 'formDialogStyle', 'emby-linkbutton'], function(loading, dialogHelper, dom) {
define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper-icon-button-light', 'css!./directorybrowser', 'formDialogStyle', 'emby-button'], function(loading, dialogHelper, dom) {
'use strict';
function getSystemInfo() {
@@ -18,18 +18,18 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'emby-b
if (path && typeof path !== 'string') {
throw new Error("invalid path");
}
loading.show();
var promises = [];
if ("Network" === path) {
promises.push(ApiClient.getNetworkDevices())
} else {
if (path) {
if (path) {
promises.push(ApiClient.getDirectoryContents(path, fileOptions));
promises.push(ApiClient.getParentPath(path));
} else {
} else {
promises.push(ApiClient.getDrives());
}
}
@@ -42,7 +42,7 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'emby-b
page.querySelector(".results").scrollTop = 0;
page.querySelector("#txtDirectoryPickerPath").value = path || "";
if (path) {
html += getItem("lnkPath lnkDirectory", "", parentPath, "...");
}
@@ -51,7 +51,7 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'emby-b
var cssClass = "File" === folder.Type ? "lnkPath lnkFile" : "lnkPath lnkDirectory";
html += getItem(cssClass, folder.Type, folder.Path, folder.Name);
}
if (!path) {
html += getItem("lnkPath lnkDirectory", "", "Network", Globalize.translate("ButtonNetwork"));
}
@@ -128,7 +128,7 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'emby-b
html += '<button type="button" is="paper-icon-button-light" class="btnRefreshDirectories emby-input-iconbutton" title="' + Globalize.translate("ButtonRefresh") + '"><i class="md-icon">search</i></button>';
}
html += "</div>";
if (!readOnlyAttribute) {
if (!readOnlyAttribute) {
html += '<div class="results paperList" style="max-height: 200px; overflow-y: auto;"></div>';
}
if (options.enableNetworkSharePath) {
@@ -222,11 +222,7 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'emby-b
var networkSharePath = this.querySelector("#txtNetworkPath");
networkSharePath = networkSharePath ? networkSharePath.value : null;
var path = this.querySelector("#txtDirectoryPickerPath").value;
validatePath(path, options.validateWriteable, ApiClient).then(
function() {
options.callback(path, networkSharePath);
}
);
validatePath(path, options.validateWriteable, ApiClient).then(options.callback(path, networkSharePath));
}
e.preventDefault();
e.stopPropagation();

View File

@@ -1,4 +1,4 @@
define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', 'apphost', 'focusManager', 'datetime', 'globalize', 'loading', 'connectionManager', 'skinManager', 'dom', 'events', 'emby-select', 'emby-checkbox', 'emby-linkbutton'], function (require, browser, layoutManager, appSettings, pluginManager, appHost, focusManager, datetime, globalize, loading, connectionManager, skinManager, dom, events) {
define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', 'apphost', 'focusManager', 'datetime', 'globalize', 'loading', 'connectionManager', 'skinManager', 'dom', 'events', 'emby-select', 'emby-checkbox', 'emby-button'], function (require, browser, layoutManager, appSettings, pluginManager, appHost, focusManager, datetime, globalize, loading, connectionManager, skinManager, dom, events) {
"use strict";
function fillThemes(select, isDashboard) {
@@ -225,32 +225,25 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', '
userSettingsInstance.enableBackdrops(context.querySelector('#chkBackdrops').checked);
if (user.Id === apiClient.getCurrentUserId()) {
skinManager.setTheme(userSettingsInstance.theme());
}
layoutManager.setLayout(context.querySelector('.selectLayout').value);
return apiClient.updateUserConfiguration(user.Id, user.Configuration);
}
function save(instance, context, userId, userSettings, apiClient, enableSaveConfirmation) {
loading.show();
apiClient.getUser(userId).then(function (user) {
saveUser(context, user, userSettings, apiClient).then(function () {
loading.hide();
if (enableSaveConfirmation) {
require(['toast'], function (toast) {
toast(globalize.translate('SettingsSaved'));
});
}
events.trigger(instance, 'saved');
}, function () {
loading.hide();
});
@@ -258,14 +251,12 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', '
}
function onSubmit(e) {
var self = this;
var apiClient = connectionManager.getApiClient(self.options.serverId);
var userId = self.options.userId;
var userSettings = self.options.userSettings;
userSettings.setUserInfo(userId, apiClient).then(function () {
var enableSaveConfirmation = self.options.enableSaveConfirmation;
save(self, self.options.element, userId, userSettings, apiClient, enableSaveConfirmation);
});
@@ -278,30 +269,22 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', '
}
function embed(options, self) {
require(['text!./displaysettings.template.html'], function (template) {
options.element.innerHTML = globalize.translateDocument(template, 'core');
options.element.querySelector('form').addEventListener('submit', onSubmit.bind(self));
if (options.enableSaveButton) {
options.element.querySelector('.btnSave').classList.remove('hide');
}
self.loadData(options.autoFocus);
});
}
function DisplaySettings(options) {
this.options = options;
embed(options, this);
}
DisplaySettings.prototype.loadData = function (autoFocus) {
var self = this;
var context = self.options.element;
@@ -312,13 +295,9 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', '
var userSettings = self.options.userSettings;
return apiClient.getUser(userId).then(function (user) {
return userSettings.setUserInfo(userId, apiClient).then(function () {
self.dataLoaded = true;
loadForm(context, user, userSettings, apiClient);
if (autoFocus) {
focusManager.autoFocus(context);
}
@@ -331,7 +310,6 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', '
};
DisplaySettings.prototype.destroy = function () {
this.options = null;
};

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