├── doc
├── img
│ ├── test-plugin.jpg
│ └── basic-plugins.jpg
├── tutorial
│ ├── pi_side_left_1.jpg
│ ├── pi_side_left_2.jpg
│ ├── pi_inline_mode_1.jpg
│ ├── pi_inline_mode_2.jpg
│ ├── pi_side_right_1.jpg
│ ├── pi_side_right_2.jpg
│ ├── quality_selector.jpg
│ ├── video_thumbnail.jpg
│ ├── button_description.jpg
│ ├── pi_handler_visible.jpg
│ ├── pi_remaining_hidden.jpg
│ ├── pi_show_total_false.jpg
│ ├── pi_show_total_true.jpg
│ ├── draw_background_false.jpg
│ ├── draw_background_true.jpg
│ ├── localization_example.jpg
│ ├── pi_parent_container_pi.jpg
│ ├── pi_remaining_visible.jpg
│ ├── video_container_button.jpg
│ ├── video_layout_selector.jpg
│ ├── default_preview_landscape.jpg
│ ├── frame_control_button_plugin.jpg
│ ├── prev_next_slide_nav_center.jpg
│ ├── prev_next_slide_nav_right.jpg
│ ├── prev_next_slide_navigator.jpg
│ ├── prev_slide_nav_wrong_order.jpg
│ ├── slide_map_progress_bar_plugin.jpg
│ ├── pi_parent_container_button_area.jpg
│ ├── index.md
│ ├── create_custom_plugin.md
│ └── quality_selector.md
├── video_canvas_plugin.md
├── roadmap.md
├── audio_canvas_plugin.md
├── user_interface_plugin.md
├── loader.md
├── dom_utilities.md
├── video_container_message.md
├── styles.md
├── preferences.md
├── audio_video_plugin.md
├── progress_indicator_plugin.md
├── playback_bar.md
├── debug.md
├── captions_plugins.md
└── time_line_pop_up.md
├── config
├── default_preview_landscape.jpg
├── default_preview_portrait.jpg
├── present-mode-1.svg
├── schema
│ └── v1
│ │ ├── plugin.schema.json
│ │ ├── canvas-button-plugin.schema.json
│ │ ├── video-layout-plugin.schema.json
│ │ └── button-plugin.schema.json
├── present-mode-2.svg
└── present-mode-3.svg
├── .babelrc
├── repository_test
└── repository
│ ├── hls-embedded-captions
│ ├── preview.jpg
│ └── data.json
│ ├── portrait
│ └── data.json
│ ├── audio-no-frames
│ └── data.json
│ ├── hls-live
│ └── data.json
│ ├── error-hls-video
│ └── data.json
│ ├── hls-single
│ └── data.json
│ ├── ll-hls
│ └── data.json
│ ├── live-tv-apunt
│ └── data.json
│ ├── hls-captions
│ └── data.json
│ ├── different-length-master-larger-1
│ └── data.json
│ ├── different-length-master-shorter-1
│ └── data.json
│ ├── portrait-dual
│ └── data.json
│ ├── hls-multiquality
│ └── data.json
│ ├── bug-test
│ └── data.json
│ ├── hls-multiaudio
│ └── data.json
│ ├── error-video
│ └── data.json
│ ├── n-stream
│ └── data.json
│ ├── test-firefox
│ └── data.json
│ ├── dfxp-captions
│ └── data.json
│ ├── 6-streams
│ └── data.json
│ ├── webvtt-captions
│ └── data.json
│ ├── audio-only
│ └── data.json
│ ├── belmar-16-9-hls
│ └── data.json
│ └── belmar-single
│ └── data.json
├── src
├── js
│ ├── core
│ │ ├── PlayerResource.js
│ │ ├── PlayerState.js
│ │ ├── UserInterfacePlugin.js
│ │ ├── PluginModule.js
│ │ ├── ErrorContainer.js
│ │ ├── ProgressIndicatorPlugin.js
│ │ ├── Loader.js
│ │ ├── Plugin.js
│ │ ├── AudioTrackData.js
│ │ ├── EventLogPlugin.js
│ │ ├── VideoQualityItem.js
│ │ ├── CookieConsent.js
│ │ ├── initFunctions.js
│ │ ├── ProgressIndicatorTimer.js
│ │ ├── dom.js
│ │ ├── Events.js
│ │ └── Preferences.js
│ ├── plugins
│ │ ├── es.upv.paella.testCaptionsPlugin.js
│ │ ├── es.upv.paella.testButtonGroupPlugin.js
│ │ ├── PaellaCorePlugins.js
│ │ ├── es.upv.paella.nonInteractiveButtonTest.js
│ │ ├── es.upv.paella.testPopUpButton.js
│ │ ├── es.upv.paella.dynamicWidthButton.js
│ │ ├── es.upv.paella.collisionTestShortucts.js
│ │ ├── es.upv.paella.testEventLogPlugin.js
│ │ ├── es.upv.paella.canvasButtonPluginTest.js
│ │ ├── es.upv.paella.testPopUp2Button.js
│ │ ├── es.upv.paella.testProgressIndicatorPlugin.js
│ │ ├── es.upv.paella.testMenuTitleElement.js
│ │ ├── es.upv.paella.testFoldableButton.js
│ │ ├── es.upv.paella.testVideoContainerButton.js
│ │ ├── es.upv.paella.vttManifestCaptionsPlugin.js
│ │ ├── es.upv.paella.playPauseButton.js
│ │ └── es.upv.paella.dfxpManifestCaptionsPlugin.js
│ ├── layouts
│ │ ├── PaellaCoreLayouts.js
│ │ └── es.upv.paella.nStreams.js
│ ├── data
│ │ ├── PaellaCoreDataPlugins.js
│ │ ├── es.upv.paella.cookieDataPlugin.js
│ │ └── es.upv.paella.localStorageDataPlugin.js
│ ├── videoFormats
│ │ └── PaellaCoreVideoFormats.js
│ ├── default-dictionaries.js
│ ├── canvas
│ │ ├── es.upv.paella.audioCanvas.js
│ │ ├── es.upv.paella.videoCanvas.js
│ │ └── es.upv.paella.testVideoCanvas.js
│ └── captions
│ │ ├── CaptionsPlugin.js
│ │ ├── DFXPParser.js
│ │ ├── WebVTTParser.js
│ │ └── Captions.js
├── test.js
├── debug.css
├── captions.html
├── test.html
├── nomanifest.html
├── css
│ ├── PreviewContainer.css
│ ├── TimeLinePopUp.css
│ ├── VideoLayout.css
│ ├── ForcedColors.css
│ ├── sizes.css
│ ├── colors.css
│ ├── base.css
│ ├── Error.css
│ ├── Loader.css
│ ├── CaptionCanvas.css
│ ├── MenuButton.css
│ ├── VideoCanvas.css
│ └── VideoContainerMessage.css
├── skins
│ ├── test1
│ │ ├── style.css
│ │ ├── skin.json
│ │ └── play-icon.svg
│ ├── test-icon-error
│ │ ├── style.css
│ │ └── skin.json
│ ├── test-embedded-icon
│ │ ├── style.css
│ │ └── skin.json
│ └── test-embedded-css
│ │ └── skin.json
├── icons
│ ├── minimize.svg
│ ├── pause.svg
│ ├── play.svg
│ ├── minimize-2.svg
│ ├── dual-video.svg
│ ├── volume-mute.svg
│ ├── maximize.svg
│ ├── error.svg
│ ├── screen.svg
│ ├── replay.svg
│ ├── icon_side_by_side.svg
│ ├── volume-low.svg
│ ├── close.svg
│ ├── play_icon_fullscreen.svg
│ ├── icon_switch_side.svg
│ ├── icon_rotate.svg
│ ├── icon_pip.svg
│ ├── minimize-3.svg
│ ├── volume-mid.svg
│ ├── progress_indicator.svg
│ └── volume-high.svg
├── nomanifest.js
├── captions.js
└── index.html
├── .gitignore
├── jsconfig.json
├── .github
├── dependabot.yml
├── workflows
│ ├── publish.yml
│ ├── playwright.yml
│ └── check-merge-conflict.yml
└── ISSUE_TEMPLATE
│ └── bug_report.md
├── plugin_directories.js
├── webpack.config.js
├── .vscode
└── launch.json
├── webpack.test.js
├── webpack.captions.js
├── webpack.nomanifest.js
├── webpack.debug.js
├── README.md
├── tests
├── utils.js
└── trimming.spec.js
├── webpack.common.js
├── .eslintrc.js
└── package.json
/doc/img/test-plugin.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/img/test-plugin.jpg
--------------------------------------------------------------------------------
/doc/img/basic-plugins.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/img/basic-plugins.jpg
--------------------------------------------------------------------------------
/doc/tutorial/pi_side_left_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/pi_side_left_1.jpg
--------------------------------------------------------------------------------
/doc/tutorial/pi_side_left_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/pi_side_left_2.jpg
--------------------------------------------------------------------------------
/doc/tutorial/pi_inline_mode_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/pi_inline_mode_1.jpg
--------------------------------------------------------------------------------
/doc/tutorial/pi_inline_mode_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/pi_inline_mode_2.jpg
--------------------------------------------------------------------------------
/doc/tutorial/pi_side_right_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/pi_side_right_1.jpg
--------------------------------------------------------------------------------
/doc/tutorial/pi_side_right_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/pi_side_right_2.jpg
--------------------------------------------------------------------------------
/doc/tutorial/quality_selector.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/quality_selector.jpg
--------------------------------------------------------------------------------
/doc/tutorial/video_thumbnail.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/video_thumbnail.jpg
--------------------------------------------------------------------------------
/config/default_preview_landscape.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/config/default_preview_landscape.jpg
--------------------------------------------------------------------------------
/config/default_preview_portrait.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/config/default_preview_portrait.jpg
--------------------------------------------------------------------------------
/doc/tutorial/button_description.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/button_description.jpg
--------------------------------------------------------------------------------
/doc/tutorial/pi_handler_visible.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/pi_handler_visible.jpg
--------------------------------------------------------------------------------
/doc/tutorial/pi_remaining_hidden.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/pi_remaining_hidden.jpg
--------------------------------------------------------------------------------
/doc/tutorial/pi_show_total_false.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/pi_show_total_false.jpg
--------------------------------------------------------------------------------
/doc/tutorial/pi_show_total_true.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/pi_show_total_true.jpg
--------------------------------------------------------------------------------
/doc/tutorial/draw_background_false.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/draw_background_false.jpg
--------------------------------------------------------------------------------
/doc/tutorial/draw_background_true.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/draw_background_true.jpg
--------------------------------------------------------------------------------
/doc/tutorial/localization_example.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/localization_example.jpg
--------------------------------------------------------------------------------
/doc/tutorial/pi_parent_container_pi.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/pi_parent_container_pi.jpg
--------------------------------------------------------------------------------
/doc/tutorial/pi_remaining_visible.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/pi_remaining_visible.jpg
--------------------------------------------------------------------------------
/doc/tutorial/video_container_button.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/video_container_button.jpg
--------------------------------------------------------------------------------
/doc/tutorial/video_layout_selector.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/video_layout_selector.jpg
--------------------------------------------------------------------------------
/doc/tutorial/default_preview_landscape.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/default_preview_landscape.jpg
--------------------------------------------------------------------------------
/doc/tutorial/frame_control_button_plugin.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/frame_control_button_plugin.jpg
--------------------------------------------------------------------------------
/doc/tutorial/prev_next_slide_nav_center.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/prev_next_slide_nav_center.jpg
--------------------------------------------------------------------------------
/doc/tutorial/prev_next_slide_nav_right.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/prev_next_slide_nav_right.jpg
--------------------------------------------------------------------------------
/doc/tutorial/prev_next_slide_navigator.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/prev_next_slide_navigator.jpg
--------------------------------------------------------------------------------
/doc/tutorial/prev_slide_nav_wrong_order.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/prev_slide_nav_wrong_order.jpg
--------------------------------------------------------------------------------
/doc/tutorial/slide_map_progress_bar_plugin.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/slide_map_progress_bar_plugin.jpg
--------------------------------------------------------------------------------
/doc/tutorial/pi_parent_container_button_area.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/doc/tutorial/pi_parent_container_button_area.jpg
--------------------------------------------------------------------------------
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "test": {
4 | "plugins": ["@babel/plugin-transform-modules-commonjs", "transform-require-context"]
5 | }
6 | }
7 | }
--------------------------------------------------------------------------------
/repository_test/repository/hls-embedded-captions/preview.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polimediaupv/paella-core/HEAD/repository_test/repository/hls-embedded-captions/preview.jpg
--------------------------------------------------------------------------------
/src/js/core/PlayerResource.js:
--------------------------------------------------------------------------------
1 |
2 | export default class PlayerResource {
3 | constructor(player) {
4 | this._player = player;
5 | }
6 |
7 | get player() { return this._player; }
8 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | repository_test/repository/local-mp4
3 | dist/paella-core.js.LICENSE.txt
4 |
5 | .DS_Store
6 | coverage
7 | /test-results/
8 | /playwright-report/
9 | /playwright/.cache/
10 |
--------------------------------------------------------------------------------
/src/test.js:
--------------------------------------------------------------------------------
1 | import Paella from 'paella-core/js/Paella';
2 | import * as utils from 'paella-core/js/core/utils';
3 | import "./debug.css";
4 |
5 | window.Paella = Paella;
6 |
7 | console.log(utils);
8 |
9 | window.utils = utils;
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | // jsconfig.json
2 | {
3 | "compilerOptions": {
4 | "baseUrl": ".",
5 | "paths": {
6 | "paella-core/styles/*": ["src/css/*"],
7 | "paella-core/*": ["src/*"],
8 | }
9 | }
10 | }
--------------------------------------------------------------------------------
/src/debug.css:
--------------------------------------------------------------------------------
1 | .player-container {
2 | width: 100vw;
3 | height: calc(100vh - 60px);
4 | left: 0vw;
5 | top: 0vh;
6 | font-family: helvetica, arial, sans-serif;
7 | }
8 |
9 | body {
10 | margin: 0px;
11 | }
12 |
13 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | # Enable version updates for npm
4 | - package-ecosystem: "npm"
5 | directory: "/"
6 | schedule:
7 | interval: "weekly"
8 | open-pull-requests-limit: 10
9 | reviewers:
10 | - ferserc1
11 |
--------------------------------------------------------------------------------
/src/captions.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Paella Player
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/js/core/PlayerState.js:
--------------------------------------------------------------------------------
1 |
2 | const PlayerState = Object.freeze({
3 | UNLOADED: 0,
4 | LOADING_MANIFEST: 1,
5 | MANIFEST: 2,
6 | LOADING_PLAYER: 3,
7 | LOADED: 4,
8 | UNLOADING_MANIFEST: 5,
9 | UNLOADING_PLAYER: 6,
10 | ERROR: 7
11 | });
12 |
13 | export default PlayerState;
14 |
15 |
--------------------------------------------------------------------------------
/plugin_directories.js:
--------------------------------------------------------------------------------
1 | export default [
2 | require.context("./src/js/plugins", true, /\.js/),
3 | require.context("./src/js/layouts", true, /\.js/),
4 | require.context("./src/js/videoFormats", true, /\.js/),
5 | require.context("./src/js/canvas", true, /\.js/),
6 | require.context("./src/js/data", true, /\.js/)
7 | ]
--------------------------------------------------------------------------------
/src/test.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Paella Player
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/nomanifest.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Paella Player
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/js/core/UserInterfacePlugin.js:
--------------------------------------------------------------------------------
1 | import Plugin from './Plugin';
2 |
3 | export default class UserInterfacePlugin extends Plugin {
4 | constructor(player,config,name) {
5 | super(player,config,name);
6 | this.__uiPlugin = true;
7 | }
8 |
9 | async getDictionaries() {
10 | return null;
11 | }
12 | }
--------------------------------------------------------------------------------
/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const config = require('./webpack.common');
3 |
4 | module.exports = config;
5 | config.entry = './src/index.js';
6 | config.output = {
7 | path: path.join(__dirname, "dist"),
8 | filename: 'paella-core.js',
9 | library: "paella-core",
10 | libraryTarget: "umd"
11 | }
12 |
--------------------------------------------------------------------------------
/src/js/plugins/es.upv.paella.testCaptionsPlugin.js:
--------------------------------------------------------------------------------
1 | import CaptionsPlugin from 'paella-core/js/captions/CaptionsPlugin';
2 |
3 | import PaellaCorePlugins from './PaellaCorePlugins';
4 |
5 | export default class TestCaptionsPlugin extends CaptionsPlugin {
6 | getPluginModuleInstance() {
7 | return PaellaCorePlugins.Get();
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/css/PreviewContainer.css:
--------------------------------------------------------------------------------
1 | .preview-container {
2 | background-color: var(--preview-container-background-color);
3 | width: 100%;
4 | height: 100%;
5 | display: flex;
6 | align-items: center;
7 | justify-content: center;
8 | cursor: pointer;
9 | position: absolute;
10 | top: 50%;
11 | transform: translateY(-50%);
12 | }
13 |
--------------------------------------------------------------------------------
/src/skins/test1/style.css:
--------------------------------------------------------------------------------
1 | :root {
2 | --main-fg-color: #F9FAFB;
3 | --main-bg-color: #1F2937;
4 | --main-bg-color-hover: #1F2937;
5 | --main-bg-gradient: #1F2937;
6 | --secondary-bg-color-hover: #1F2937;
7 |
8 | --highlight-bg-color: #3073B8;
9 | --highlight-bg-color-hover: #3a8bdd;
10 |
11 | --base-video-rect-background-color: #9CA3AF;
12 | }
13 |
--------------------------------------------------------------------------------
/src/skins/test-icon-error/style.css:
--------------------------------------------------------------------------------
1 | :root {
2 | --main-fg-color: #F9FAFB;
3 | --main-bg-color: #1F2937;
4 | --main-bg-color-hover: #1F2937;
5 | --main-bg-gradient: #1F2937;
6 | --secondary-bg-color-hover: #1F2937;
7 |
8 | --highlight-bg-color: #3073B8;
9 | --highlight-bg-color-hover: #3a8bdd;
10 |
11 | --base-video-rect-background-color: #9CA3AF;
12 | }
13 |
--------------------------------------------------------------------------------
/src/skins/test-embedded-icon/style.css:
--------------------------------------------------------------------------------
1 | :root {
2 | --main-fg-color: #F9FAFB;
3 | --main-bg-color: #1F2937;
4 | --main-bg-color-hover: #1F2937;
5 | --main-bg-gradient: #1F2937;
6 | --secondary-bg-color-hover: #1F2937;
7 |
8 | --highlight-bg-color: #3073B8;
9 | --highlight-bg-color-hover: #3a8bdd;
10 |
11 | --base-video-rect-background-color: #9CA3AF;
12 | }
13 |
--------------------------------------------------------------------------------
/doc/video_canvas_plugin.md:
--------------------------------------------------------------------------------
1 | # Video canvas plugin
2 |
3 | It is used to play streams containing videos that can be displayed using a `