diff --git a/Dockerfile b/Dockerfile
index cba55959..9faf7339 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -30,7 +30,7 @@ ENV FPM_PORT="${PHP_FPM_PORT}"
#
RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone && \
for ext in ${PHP_PACKAGES}; do PACKAGES="${PACKAGES} ${PHP_V}-${ext}"; done && \
- apk add --no-cache bash caddy icu-data-full nano curl procps net-tools iproute2 \
+ apk add --no-cache bash caddy icu-data-full nano curl procps net-tools iproute2 ffmpeg \
shadow sqlite redis tzdata gettext fcgi ca-certificates nss mailcap libcap ${PHP_V} ${PACKAGES} && \
# Basic setup
echo '' && \
diff --git a/README.md b/README.md
index 01a77066..3526a959 100644
--- a/README.md
+++ b/README.md
@@ -9,6 +9,22 @@ out of the box, this tool support `Jellyfin`, `Plex` and `Emby` media servers.
## Updates
+### 2024-08-10
+
+I have recently added new experimental feature, to play your content directly from the WebUI. This feature is still in
+alpha, and missing a lot of features. But it's a start. Right now it does auto transcode on the fly to play any content in the browser.
+
+The feature requires that you mount your media directories to the `WatchState` container similar to the `File integrity` feature. I have plans to expand
+the feature to support more controls, however, right now it's only support basic subtitles streams and default audio stream or first audio stream.
+
+The transcoder works by converting the media on the fly to `HLS` segments, and the subtitles are selectable via the player ui which are also converted to `vtt` format.
+
+Expects bugs and issues, as the feature is still in alpha. But I would love to hear your feedback. You can play the media by visiting
+the history page of the item you will see red play button on top right corner of the page. If the items has a play button, then you correctly mounted
+the media directories. otherwise, the button be disabled with tooltip of `Media is inaccessible`.
+
+The feature is not meant to replace your backend media player, the purpose of this feature is to quickly check the media without leaving the WebUI.
+
### 2024-08-01
We recently enabled listening on tls connections via `8443` which can be controlled by `HTTPS_PORT` environment variable.
diff --git a/composer.json b/composer.json
index 0e008661..4f0e8fe0 100644
--- a/composer.json
+++ b/composer.json
@@ -24,6 +24,7 @@
"ext-simplexml": "*",
"ext-fileinfo": "*",
"ext-redis": "*",
+ "ext-posix": "*",
"monolog/monolog": "^3.4",
"symfony/console": "^6.1.4",
"symfony/cache": "^6.1.3",
@@ -43,8 +44,7 @@
"psy/psysh": "^0.11.22"
},
"suggest": {
- "ext-sockets": "For UDP commincations.",
- "ext-posix": "to check if running under super user."
+ "ext-sockets": "For UDP commincations."
},
"require-dev": {
"roave/security-advisories": "dev-latest",
diff --git a/composer.lock b/composer.lock
index 7a18b32a..121eda4a 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "1aac4505fd9a6fa51ceef1181c194d7a",
+ "content-hash": "b1b5fdc74178fdeafb640278ee9dcc00",
"packages": [
{
"name": "dragonmantank/cron-expression",
@@ -3114,12 +3114,12 @@
"source": {
"type": "git",
"url": "https://github.com/Roave/SecurityAdvisories.git",
- "reference": "0cc79cfabcebf66307fe5a686367bc425a7b96b6"
+ "reference": "fe2777b484817ebbbe50ad685af7525560198c59"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/0cc79cfabcebf66307fe5a686367bc425a7b96b6",
- "reference": "0cc79cfabcebf66307fe5a686367bc425a7b96b6",
+ "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/fe2777b484817ebbbe50ad685af7525560198c59",
+ "reference": "fe2777b484817ebbbe50ad685af7525560198c59",
"shasum": ""
},
"conflict": {
@@ -3216,7 +3216,7 @@
"codeigniter4/shield": "<1.0.0.0-beta8",
"codiad/codiad": "<=2.8.4",
"composer/composer": "<1.10.27|>=2,<2.2.24|>=2.3,<2.7.7",
- "concrete5/concrete5": "<9.2.8",
+ "concrete5/concrete5": "<9.3.3",
"concrete5/core": "<8.5.8|>=9,<9.1",
"contao-components/mediaelement": ">=2.14.2,<2.21.1",
"contao/comments-bundle": ">=2,<4.13.40|>=5.0.0.0-RC1-dev,<5.3.4",
@@ -3237,7 +3237,7 @@
"datatables/datatables": "<1.10.10",
"david-garcia/phpwhois": "<=4.3.1",
"dbrisinajumi/d2files": "<1",
- "dcat/laravel-admin": "<=2.1.3.0-beta",
+ "dcat/laravel-admin": "<=2.1.3",
"derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3",
"derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1|>=7,<7.4",
"desperado/xml-bundle": "<=0.1.7",
@@ -3303,6 +3303,7 @@
"filp/whoops": "<2.1.13",
"fineuploader/php-traditional-server": "<=1.2.2",
"firebase/php-jwt": "<6",
+ "fisharebest/webtrees": "<=2.1.18",
"fixpunkt/fp-masterquiz": "<2.2.1|>=3,<3.5.2",
"fixpunkt/fp-newsletter": "<1.1.1|>=2,<2.1.2|>=2.2,<3.2.6",
"flarum/core": "<1.8.5",
@@ -3386,6 +3387,7 @@
"innologi/typo3-appointments": "<2.0.6",
"intelliants/subrion": "<4.2.2",
"inter-mediator/inter-mediator": "==5.5",
+ "ipl/web": "<0.10.1",
"islandora/islandora": ">=2,<2.4.1",
"ivankristianto/phpwhois": "<=4.3",
"jackalope/jackalope-doctrine-dbal": "<1.7.4",
@@ -3468,7 +3470,7 @@
"microsoft/microsoft-graph": ">=1.16,<1.109.1|>=2,<2.0.1",
"microsoft/microsoft-graph-beta": "<2.0.1",
"microsoft/microsoft-graph-core": "<2.0.2",
- "microweber/microweber": "<=2.0.4",
+ "microweber/microweber": "<=2.0.16",
"mikehaertl/php-shellcommand": "<1.6.1",
"miniorange/miniorange-saml": "<1.4.3",
"mittwald/typo3_forum": "<1.2.1",
@@ -3633,8 +3635,8 @@
"serluck/phpwhois": "<=4.2.6",
"sfroemken/url_redirect": "<=1.2.1",
"sheng/yiicms": "<=1.2",
- "shopware/core": "<6.5.8.8-dev|>=6.6.0.0-RC1-dev,<6.6.1",
- "shopware/platform": "<6.5.8.8-dev|>=6.6.0.0-RC1-dev,<6.6.1",
+ "shopware/core": "<=6.5.8.12|>=6.6,<=6.6.5",
+ "shopware/platform": "<=6.5.8.12|>=6.6,<=6.6.5",
"shopware/production": "<=6.3.5.2",
"shopware/shopware": "<=5.7.17",
"shopware/storefront": "<=6.4.8.1|>=6.5.8,<6.5.8.7-dev",
@@ -3764,6 +3766,7 @@
"tribalsystems/zenario": "<9.5.60602",
"truckersmp/phpwhois": "<=4.3.1",
"ttskch/pagination-service-provider": "<1",
+ "twbs/bootstrap": "<=3.4.1|>=4,<=4.6.2",
"twig/twig": "<1.44.7|>=2,<2.15.3|>=3,<3.4.3",
"typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2",
"typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1",
@@ -3918,7 +3921,7 @@
"type": "tidelift"
}
],
- "time": "2024-07-31T17:04:31+00:00"
+ "time": "2024-08-08T21:04:55+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -4958,7 +4961,8 @@
"ext-sodium": "*",
"ext-simplexml": "*",
"ext-fileinfo": "*",
- "ext-redis": "*"
+ "ext-redis": "*",
+ "ext-posix": "*"
},
"platform-dev": [],
"plugin-api-version": "2.6.0"
diff --git a/config/languageCodes.php b/config/languageCodes.php
new file mode 100644
index 00000000..6854b8df
--- /dev/null
+++ b/config/languageCodes.php
@@ -0,0 +1,131 @@
+ [
+ 'ab' => 'abk',
+ 'aa' => 'aar',
+ 'af' => 'afr',
+ 'ak' => 'aka',
+ 'sq' => 'alb',
+ 'am' => 'amh',
+ 'ar' => 'ara',
+ 'an' => 'arg',
+ 'hy' => 'arm',
+ 'as' => 'asm',
+ 'av' => 'ava',
+ 'ae' => 'ave',
+ 'ay' => 'aym',
+ 'az' => 'aze',
+ 'bm' => 'bam',
+ 'ba' => 'bak',
+ 'eu' => 'baq',
+ 'be' => 'bel',
+ 'bn' => 'ben',
+ 'bh' => 'bih',
+ 'bi' => 'bis',
+ 'bs' => 'bos',
+ 'br' => 'bre',
+ 'bg' => 'bul',
+ 'my' => 'bur',
+ 'ca' => 'cat',
+ 'ch' => 'cha',
+ 'ce' => 'che',
+ 'ny' => 'nya',
+ 'zh' => 'chi',
+ 'cv' => 'chv',
+ 'kw' => 'cor',
+ 'co' => 'cos',
+ 'cr' => 'cre',
+ 'hr' => 'hrv',
+ 'cs' => 'cze',
+ 'da' => 'dan',
+ 'dv' => 'div',
+ 'nl' => 'dut',
+ 'dz' => 'dzo',
+ 'en' => 'eng',
+ 'eo' => 'epo',
+ 'et' => 'est',
+ 'ee' => 'ewe',
+ 'fo' => 'fao',
+ 'fj' => 'fij',
+ 'fi' => 'fin',
+ 'fr' => 'fre',
+ 'ff' => 'ful',
+ 'gl' => 'glg',
+ 'ka' => 'geo',
+ 'de' => 'ger',
+ 'el' => 'gre',
+ 'gn' => 'grn',
+ 'gu' => 'guj',
+ 'ht' => 'hat',
+ 'ha' => 'hau',
+ 'he' => 'heb',
+ 'hz' => 'her',
+ 'hi' => 'hin',
+ ],
+ 'names' => [
+ 'abk' => 'Abkhazian',
+ 'aar' => 'Afar',
+ 'afr' => 'Afrikaans',
+ 'aka' => 'Akan',
+ 'alb' => 'Albanian',
+ 'amh' => 'Amharic',
+ 'ara' => 'Arabic',
+ 'arg' => 'Aragonese',
+ 'arm' => 'Armenian',
+ 'asm' => 'Assamese',
+ 'ava' => 'Avaric',
+ 'ave' => 'Avestan',
+ 'aym' => 'Aymara',
+ 'aze' => 'Azerbaijani',
+ 'bam' => 'Bambara',
+ 'bak' => 'Bashkir',
+ 'baq' => 'Basque',
+ 'bel' => 'Belarusian',
+ 'ben' => 'Bengali',
+ 'bih' => 'Bihari',
+ 'bis' => 'Bislama',
+ 'bos' => 'Bosnian',
+ 'bre' => 'Breton',
+ 'bul' => 'Bulgarian',
+ 'bur' => 'Burmese',
+ 'cat' => 'Catalan',
+ 'cha' => 'Chamorro',
+ 'che' => 'Chechen',
+ 'nya' => 'Chichewa',
+ 'chi' => 'Chinese',
+ 'chv' => 'Chuvash',
+ 'cor' => 'Cornish',
+ 'cos' => 'Corsican',
+ 'cre' => 'Cree',
+ 'hrv' => 'Croatian',
+ 'cze' => 'Czech',
+ 'dan' => 'Danish',
+ 'div' => 'Divehi',
+ 'dut' => 'Dutch',
+ 'dzo' => 'Dzongkha',
+ 'eng' => 'English',
+ 'epo' => 'Esperanto',
+ 'est' => 'Estonian',
+ 'ewe' => 'Ewe',
+ 'fao' => 'Faroese',
+ 'fij' => 'Fijian',
+ 'fin' => 'Finnish',
+ 'fre' => 'French',
+ 'ful' => 'Fulah',
+ 'glg' => 'Gal',
+ 'geo' => 'Georgian',
+ 'ger' => 'German',
+ 'gre' => 'Greek',
+ 'grn' => 'Guarani',
+ 'guj' => 'Gujarati',
+ 'hat' => 'Haitian',
+ 'hau' => 'Hausa',
+ 'heb' => 'Hebrew',
+ 'her' => 'Herero',
+ 'hin' => 'Hindi',
+ 'und' => 'Undetermined',
+ ],
+ ];
+})();
diff --git a/frontend/components/Player.vue b/frontend/components/Player.vue
new file mode 100644
index 00000000..56bdf079
--- /dev/null
+++ b/frontend/components/Player.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
diff --git a/frontend/components/TaskRunnerStatus.vue b/frontend/components/TaskRunnerStatus.vue
new file mode 100644
index 00000000..fba01877
--- /dev/null
+++ b/frontend/components/TaskRunnerStatus.vue
@@ -0,0 +1,82 @@
+
+