From ea271573c1342276f63f13b9ee04aa5cadd5d54f Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sat, 12 Oct 2019 17:25:42 +0300 Subject: [PATCH] first commit --- .gitignore | 3 + README.md | 63 ++++++++++++++++++ config.xml | 14 ++++ gulpfile.js | 100 +++++++++++++++++++++++++++++ icon.png | Bin 0 -> 38341 bytes index.html | 6 ++ tizen.js | 179 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 365 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 config.xml create mode 100644 gulpfile.js create mode 100644 icon.png create mode 100644 index.html create mode 100644 tizen.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0ecd118 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.wgt +www +.* diff --git a/README.md b/README.md new file mode 100644 index 0000000..3e7d526 --- /dev/null +++ b/README.md @@ -0,0 +1,63 @@ +

Jellyfin Tizen

+

Part of the Jellyfin Project

+ +## Build Process + +### Getting Started + +1. Download and install Tizen Studio (https://developer.tizen.org/development/tizen-studio/download). +2. Setup Samsung certificate (need Samsung account). +3. Clone or download this repository. + ```sh + git clone https://github.com/jellyfin/jellyfin-tizen.git + ``` +4. Clone or download Jellyfin Web repository. + ```sh + git clone https://github.com/jellyfin/jellyfin-web.git + ``` +5. Go to Jellyfin Tizen directory. + ```sh + cd jellyfin-tizen + ``` + +### Prepare Interface + +If any changes are made to `jellyfin-web/`, the `www/` directory will need to be rebuilt using the following command. + +```sh +JELLYFIN_WEB_DIR=../jellyfin-web/src npx gulp +``` + +> If `NODE_ENV=development` is set in the environment, then the source files will be copied without being minified. + +> The `JELLYFIN_WEB_DIR` environment variable can be used to override the location of `jellyfin-web`. + +### Build WGT + +```sh +tizen build-web -e ".*" -e gulpfile.js +tizen package -t wgt -o . -- .buildResult +``` + +### Deploy to Emulator + +1. Run emulator. +2. Install package. + ```sh + tizen install -n *.wgt -t T-samsung-5.0-x86 + ``` + > Specify target with `-t` option. + +### Deploy to TV + +1. Run TV. +2. Activate Developer Mode on TV (https://developer.samsung.com/tv/develop/getting-started/using-sdk/tv-device). +3. Connect to TV with Device Manager from Tizen Studio. Or with sdb. + ```sh + sdb connect YOUR_TV_IP + ``` +4. Install package. + ```sh + tizen install -n *.wgt -t UE65NU7400 + ``` + > Specify target with `-t` option. diff --git a/config.xml b/config.xml new file mode 100644 index 0000000..2fadcb0 --- /dev/null +++ b/config.xml @@ -0,0 +1,14 @@ + + + + + Jellyfin + + Jellyfin for Samsung Smart TV (Tizen). + + + Jellyfin + + + + diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..abcba1c --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,100 @@ +var gulp = require('gulp'); +var gulpif = require('gulp-if'); +var del = require('del'); +var dom = require('gulp-dom'); +var uglifyes = require('uglify-es'); +var composer = require('gulp-uglify/composer'); +var uglify = composer(uglifyes, console); + +// Check the NODE_ENV environment variable +var isDev = process.env.NODE_ENV === 'development'; +// Allow overriding of jellyfin-web directory +var WEB_DIR = process.env.JELLYFIN_WEB_DIR || 'node_modules/jellyfin-web/dist'; +console.info('Using jellyfin-web from', WEB_DIR); + +// Skip minification for development builds or minified files +var compress = !isDev && [ + '**/*', + '!**/*min.*', + '!**/*hls.js', + // Temporarily exclude apiclient until updated + '!bower_components/emby-apiclient/**/*.js' +]; + +var uglifyOptions = { + compress: { + drop_console: true + } +}; + +var paths = { + assets: { + src: [ + WEB_DIR + '/**/*', + '!' + WEB_DIR + '/index.html' + ], + dest: 'www/' + }, + index: { + src: WEB_DIR + '/index.html', + dest: 'www/' + } +}; + +// Clean the www directory +function clean() { + return del([ + 'www' + ]); +} + +// Copy unmodified assets +function copy() { + return gulp.src(paths.assets.src) + .pipe(gulp.dest(paths.assets.dest)); +} + +// Add required tags to index.html +function modifyIndex() { + return gulp.src(paths.index.src) + .pipe(dom(function() { + // inject CSP meta tag + var meta = this.createElement('meta'); + meta.setAttribute('http-equiv', 'Content-Security-Policy'); + meta.setAttribute('content', 'default-src * \'self\' \'unsafe-inline\' \'unsafe-eval\' data: gap: file: filesystem: ws: wss:;'); + this.head.appendChild(meta); + + // inject appMode script + var appMode = this.createElement('script'); + appMode.text = 'window.appMode=\'cordova\';'; + this.body.appendChild(appMode); + + // inject tizen.js + var tizen = this.createElement('script'); + tizen.setAttribute('src', '../tizen.js'); + tizen.setAttribute('defer', ''); + this.body.appendChild(tizen); + + // inject apploader.js + var apploader = this.createElement('script'); + apploader.setAttribute('src', 'scripts/apploader.js'); + apploader.setAttribute('defer', ''); + this.body.appendChild(apploader); + + return this; + })) + .pipe(gulp.dest(paths.index.dest)) +} + +// Default build task +var build = gulp.series( + clean, + gulp.parallel(copy, modifyIndex) +); + +// Export tasks so they can be run individually +exports.clean = clean; +exports.copy = copy; +exports.modifyIndex = modifyIndex; +// Export default task +exports.default = build; diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..954bc25003ef5efc4a93e8357dde44bac4267781 GIT binary patch literal 38341 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..3eb0f48 --- /dev/null +++ b/index.html @@ -0,0 +1,6 @@ + + + + + + diff --git a/tizen.js b/tizen.js new file mode 100644 index 0000000..aaf8b56 --- /dev/null +++ b/tizen.js @@ -0,0 +1,179 @@ +'use strict'; + +console.log('Tizen adapter'); + +window.addEventListener('load', function() { + + //console.log(JSON.stringify(tizen.tvinputdevice.getSupportedKeys())); + + tizen.tvinputdevice.registerKey('MediaPlay'); + tizen.tvinputdevice.registerKey('MediaTrackPrevious'); + tizen.tvinputdevice.registerKey('MediaTrackNext'); + tizen.tvinputdevice.registerKey('MediaRewind'); + tizen.tvinputdevice.registerKey('MediaFastForward'); + + require(['inputManager', 'focusManager', 'viewManager', 'appRouter', 'actionsheet'], function(inputManager, focusManager, viewManager, appRouter, actionsheet) { + + const commands = { + '10009': 'back', + '415': 'playpause', + '10232': 'previoustrack', + '10233': 'nexttrack', + '412': 'rewind', + '417': 'fastforward' + }; + + var isRestored; + var lastActiveElement; + var historyStartup; + var historyDepth = 0; + var exitPromise; + + //document.addEventListener('keypress', function(e) { + // console.log('keypress'); + //}); + + //document.addEventListener('keyup', function(e) { + // console.log('keyup'); + //}); + + document.addEventListener('keydown', function(e) { + //console.log('keydown: keyCode: ' + e.keyCode + ' key: ' + e.key + ' location: ' + e.location); + + var command = commands[e.keyCode]; + + if (command) { + //console.log('command: ' + command); + + if (command === 'back' && historyDepth < 2 && !exitPromise) { + exitPromise = actionsheet.show({ + title: Globalize.translate('Exit?'), + items: [ + {id: 'yes', name: Globalize.translate('Yes')}, + {id: 'no', name: Globalize.translate('No')} + ] + }).then(function (value) { + exitPromise = null; + + if (value === 'yes') { + try { + tizen.application.getCurrentApplication().exit(); + } catch (ignore) {} + } + }, + function () { + exitPromise = null; + }); + return; + } + + inputManager.trigger(command); + } + }); + + document.addEventListener('click', function() { + lastActiveElement = document.activeElement; + }); + + document.addEventListener('viewhide', function() { + lastActiveElement = document.activeElement; + }); + + function onPageLoad() { + console.debug('onPageLoad ' + window.location.href + ' isRestored=' + isRestored); + + if (isRestored) { + return; + } + + var view = viewManager.currentView() || document.body; + + var element = lastActiveElement; + lastActiveElement = null; + + // These elements are recreated + if (element) { + if (element.classList.contains('btnPreviousPage')) { + element = view.querySelector('.btnPreviousPage'); + } else if (element.classList.contains('btnNextPage')) { + element = view.querySelector('.btnNextPage'); + } + } + + if (element && focusManager.isCurrentlyFocusable(element)) { + focusManager.focus(element); + } else { + element = focusManager.autoFocus(view); + } + } + + // Starts listening for changes in the '.loading-spinner' HTML element + function installMutationObserver() { + var mutationObserver = new MutationObserver(function(mutations) { + mutations.forEach(function(mutation) { + console.debug(mutation.type); + if (mutation.target.classList.contains('hide')) { + onPageLoad(); + } + }); + }); + + var spinner = document.querySelector('.loading-spinner'); + + if (spinner) { + mutationObserver.observe(spinner, { attributes : true }); + document.removeEventListener('viewshow', installMutationObserver); + } + } + document.addEventListener('viewshow', installMutationObserver); + + window.addEventListener('pushState', function(e) { + + // Reset history on some pages + + var path = e.arguments && e.arguments[2] ? e.arguments[2] : ''; + var pos = path.indexOf('?'); + path = path.substring(0, pos !== -1 ? pos : path.length); + + switch (path) { + case '#!/home.html': + if (!historyStartup || historyStartup !== path) { + historyStartup = path; + historyDepth = 0; + } + break; + case '#!/selectserver.html': + case '#!/login.html': + historyStartup = path; + historyDepth = 0; + break; + } + + historyDepth++; + + isRestored = false; + + //console.log('history: ' + historyDepth + ', ' + historyStartup); + }); + + window.addEventListener('popstate', function() { + historyDepth--; + isRestored = true; + //console.log('history: ' + historyDepth + ', ' + historyStartup); + }); + + // Add 'pushState' and 'replaceState' events + var _wr = function(type) { + var orig = history[type]; + return function() { + var rv = orig.apply(this, arguments); + var e = new Event(type); + e.arguments = arguments; + window.dispatchEvent(e); + return rv; + }; + }; + history.pushState = _wr('pushState'); + history.replaceState = _wr('replaceState'); + }); +});