├── 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 `