├── .gitignore
├── .jshintrc
├── .prettierrc.js
├── .vscode
├── extensions.json
└── settings.json
├── CHANGELOG
├── INSTALL-SERVER.md
├── LICENSE
├── README.md
├── TODO.txt
├── backend
├── accessibility_templates
│ ├── aa-001.xml
│ ├── aa-002.xml
│ ├── aa-003.xml
│ ├── aa-004.xml
│ ├── aa-005.xml
│ ├── aa-006.xml
│ ├── aa-007.xml
│ ├── aa-008.xml
│ ├── aa-009.xml
│ ├── aa-010.xml
│ ├── aa-011.xml
│ ├── aa-012.xml
│ ├── aa-013.xml
│ ├── aa-014.xml
│ └── aa-015.xml
├── channel_icons
│ ├── chicon_akamai.png
│ ├── chicon_br.png
│ ├── chicon_br_1.png
│ ├── chicon_br_hd.png
│ ├── chicon_dvb_s.png
│ ├── chicon_dvb_t.png
│ ├── chicon_dvb_t2.png
│ ├── chicon_harmonic.png
│ ├── chicon_hopetv.png
│ └── outofservice_example.png
├── configuration.php
├── css
│ ├── bootstrap-4.3.1.css
│ ├── dvbi.css
│ └── dvbi.scss
├── delete_servicelist.php
├── dvbi.css
├── dvbi.js
├── extended_program_information-template.xml
├── extended_program_information.xml
├── icons
│ ├── pencil.svg
│ ├── trash.svg
│ └── window.svg
├── images
│ ├── logo_dvb-i.png
│ └── logo_sofiadigital.png
├── index.html
├── js
│ ├── bootstrap-4.3.1.js
│ └── popper.min.js
├── more_episodes.php
├── nownext.png
├── nownext.xml
├── program_information.php
├── program_information_template.xml
├── saved_lists.php
├── schedule.php
├── schedule_event_template.xml
├── schedule_template.xml
├── schedule_templates
│ ├── cgsid_1.xml
│ ├── cgsid_10.xml
│ ├── cgsid_11.xml
│ ├── cgsid_12.xml
│ ├── cgsid_13.xml
│ ├── cgsid_14.xml
│ ├── cgsid_2.xml
│ ├── cgsid_3.xml
│ ├── cgsid_4.xml
│ ├── cgsid_5.xml
│ ├── cgsid_6.xml
│ ├── cgsid_7.xml
│ ├── cgsid_8.xml
│ ├── cgsid_9.xml
│ ├── tag_dvb-i-referenceapp,2023_Parental-1.xml
│ ├── tag_dvb-i-refrecenceapp,2020_Drm-4.xml
│ ├── tag_dvb-i-refrecenceapp,2020_Drm-5.xml
│ ├── tag_dvb.org,2020_AKAMAI-LL.xml
│ ├── tag_dvb.org,2020_CMAF-1.xml
│ ├── tag_dvb.org,2020_CMAF-2.xml
│ ├── tag_dvb.org,2020_CMAF-3.xml
│ ├── tag_dvb.org,2020_DASHIF-LL.xml
│ ├── tag_dvb.org,2020_DOLBY-HDR.xml
│ ├── tag_dvb.org,2020_HARMONIC-LL.xml
│ ├── tag_dvb.org,2020_PHILIPS-HDR.xml
│ ├── tag_dvb.org,2020_SES-HDR-1.xml
│ ├── tag_dvb.org,2020_SES-HDR-2.xml
│ ├── tag_dvb.org,2020_UNIFIED-LL.xml
│ ├── tag_dvb.org,2020_Unified-0.xml
│ ├── tag_dvb.org,2020_Unified-1.xml
│ ├── tag_dvb.org,2020_Unified-2.xml
│ ├── tag_dvb.org,2020_Unified-3.xml
│ ├── tag_dvb.org,2020_Unified-4.xml
│ ├── tag_dvb.org,2020_Unified-7.xml
│ ├── tag_dvb.org,2020_Unified-8.xml
│ └── tag_dvb.org,2020_Unified-mt.xml
├── servicelist.php
├── servicelist_registry.php
├── servicelists
│ ├── .gitignore
│ ├── TM-STREAM0075r1 DVB-DASH_Reference_Streams.xml
│ ├── advanced_codecs.xml
│ ├── drm.xml
│ ├── example.xml
│ ├── example_availability.xml
│ ├── prominence_r6.xml
│ ├── regions.xml
│ └── schemas
│ │ ├── dvbi_service_list_discovery_v1.6.xsd
│ │ ├── dvbi_types_v1.0.xsd
│ │ ├── dvbi_v6.0.xsd
│ │ ├── tva_metadata_3-1.xsd
│ │ └── tva_mpeg7.xsd
├── slepr-master.xml
└── upload_servicelist.php
├── frontend
├── CSmaps.js
├── android
│ ├── images
│ │ ├── License.txt
│ │ ├── apple-touch-icon.png
│ │ ├── arrow-left-short.svg
│ │ ├── bg_chinfo.png
│ │ ├── bg_info.png
│ │ ├── call-to-action.png
│ │ ├── chevron-left.svg
│ │ ├── chevron-right.svg
│ │ ├── closed-captioning.svg
│ │ ├── contrast.png
│ │ ├── empty.png
│ │ ├── gear.svg
│ │ ├── icons-128.png
│ │ ├── icons-512.png
│ │ ├── landingpage_banner.png
│ │ ├── landingpage_ui.png
│ │ ├── lock.svg
│ │ ├── logo_dvbi_sofia.png
│ │ ├── magnifier-glass-zoom-icon.png
│ │ ├── manifest.json
│ │ ├── mixer-vertical.svg
│ │ ├── noun-audio-description-4258567-trim.png
│ │ ├── noun-audio-description-4258567.png
│ │ ├── noun-speaking-5005852-trim.png
│ │ ├── noun-speaking-5005852.png
│ │ ├── noun-subtitles-78795-trim.png
│ │ ├── noun-subtitles-78795.png
│ │ ├── noun-text-to-speech-5024773-trim.png
│ │ ├── noun-text-to-speech-5024773.png
│ │ ├── ons-icon-bsl-large-mono-2.png
│ │ ├── splash-128.png
│ │ ├── splash-512.png
│ │ ├── spoken-subtitles-2.png
│ │ └── x-circle.svg
│ ├── index.html
│ ├── js
│ │ ├── bootstrap-4.3.1.js
│ │ ├── channel.js
│ │ ├── dvbi-mobile.js
│ │ ├── epg.js
│ │ ├── popper.min.js
│ │ └── program.js
│ ├── manifest.json
│ ├── player.html
│ └── styles
│ │ ├── bootstrap-4.3.1.css
│ │ ├── dvbi.css
│ │ └── dvbi.scss
├── android_apk
│ ├── .gitignore
│ ├── AppIcon
│ ├── CHANGELOG.md
│ ├── HeaderImage
│ ├── NotificationIcon
│ ├── README.md
│ ├── app
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── proguard-project.txt
│ │ └── src
│ │ │ ├── main
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── assets
│ │ │ │ ├── .gitignore
│ │ │ │ ├── appConfig.example.json
│ │ │ │ └── offline.html
│ │ │ ├── ic_launcher-playstore.png
│ │ │ ├── ic_launcher_dvb-playstore.png
│ │ │ ├── java
│ │ │ │ └── com
│ │ │ │ │ └── dvb
│ │ │ │ │ └── dvb_i
│ │ │ │ │ ├── AndroidJsInterface.java
│ │ │ │ │ ├── ConfigUtil.java
│ │ │ │ │ ├── DvbiReferenceApplication.java
│ │ │ │ │ ├── HtmlIntercept.java
│ │ │ │ │ ├── MainActivity.java
│ │ │ │ │ ├── UrlNavigation.java
│ │ │ │ │ ├── WebChromeClientCustomPoster.java
│ │ │ │ │ └── WebviewInterface.java
│ │ │ └── res
│ │ │ │ ├── drawable-xxxhdpi
│ │ │ │ └── simple_border.xml
│ │ │ │ ├── drawable
│ │ │ │ ├── dvb_splash.png
│ │ │ │ ├── focus_border.xml
│ │ │ │ ├── ic_banner_dvb.png
│ │ │ │ ├── ic_banner_dvb_foreground.xml
│ │ │ │ ├── ic_banner_foreground_store.xml
│ │ │ │ ├── ic_launcher_background.xml
│ │ │ │ ├── ic_launcher_foreground.xml
│ │ │ │ └── rounded_corners.xml
│ │ │ │ ├── layout
│ │ │ │ └── main_activity.xml
│ │ │ │ ├── mipmap-anydpi-v26
│ │ │ │ ├── ic_banner_dvb.xml
│ │ │ │ ├── ic_launcher_dvb.xml
│ │ │ │ └── ic_launcher_dvb_round.xml
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ ├── ic_launcher_dvb.webp
│ │ │ │ ├── ic_launcher_dvb_foreground.webp
│ │ │ │ └── ic_launcher_dvb_round.webp
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ ├── ic_launcher_dvb.webp
│ │ │ │ ├── ic_launcher_dvb_foreground.webp
│ │ │ │ └── ic_launcher_dvb_round.webp
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ ├── ic_banner_dvb.png
│ │ │ │ ├── ic_launcher_dvb.webp
│ │ │ │ ├── ic_launcher_dvb_foreground.webp
│ │ │ │ └── ic_launcher_dvb_round.webp
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ ├── ic_launcher_dvb.webp
│ │ │ │ ├── ic_launcher_dvb_foreground.webp
│ │ │ │ └── ic_launcher_dvb_round.webp
│ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ ├── ic_launcher_dvb.webp
│ │ │ │ ├── ic_launcher_dvb_foreground.webp
│ │ │ │ └── ic_launcher_dvb_round.webp
│ │ │ │ └── values
│ │ │ │ ├── attrs.xml
│ │ │ │ ├── ic_banner_dvb_background.xml
│ │ │ │ ├── ic_launcher_dvb_background.xml
│ │ │ │ ├── strings.xml
│ │ │ │ └── styles.xml
│ │ │ └── normal
│ │ │ └── java
│ │ │ └── com
│ │ │ └── dvb
│ │ │ └── dvb_i
│ │ │ ├── LeanWebView.java
│ │ │ ├── WebChromeCustomClient.java
│ │ │ ├── WebViewConfiguration.java
│ │ │ ├── WebkitCookieManagerProxy.java
│ │ │ └── WebviewClient.java
│ ├── build.gradle
│ ├── constants.gradle
│ ├── generate-app-icons.sh
│ ├── generate-header-images.sh
│ ├── generate-theme.js
│ ├── generate-tinted-icons.sh
│ ├── gradle.properties
│ ├── gradle
│ │ └── wrapper
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ ├── gradlew
│ ├── gradlew.bat
│ └── settings.gradle
├── channel-common.js
├── common.js
├── configuration.js
├── dvbi-common.js
├── hbbtv
│ ├── CommonUI
│ │ ├── bg_boxitem_image.png
│ │ ├── bg_boxitem_info.png
│ │ ├── bg_channel_info.png
│ │ ├── bg_menu.png
│ │ ├── commonui.css
│ │ ├── dialog.css
│ │ ├── dialog_checkmark.png
│ │ ├── empty.png
│ │ ├── icons.png
│ │ ├── loading_anim.png
│ │ ├── lock_green.png
│ │ ├── lock_red.png
│ │ ├── logo_dvbi_sofia.png
│ │ ├── menu_arrow.png
│ │ └── rating.png
│ ├── alertDialog.js
│ ├── buttonbar.js
│ ├── dialog.js
│ ├── epg
│ │ ├── channel.js
│ │ ├── epg.css
│ │ ├── gridepg.js
│ │ ├── images
│ │ │ ├── bg_plain.png
│ │ │ ├── bg_program_focused.png
│ │ │ ├── bg_timeline.png
│ │ │ ├── bg_verticalTimeLineContainer.png
│ │ │ ├── logo.png
│ │ │ └── up_down_arrows_epg.png
│ │ ├── navigation.js
│ │ ├── program.js
│ │ └── scripts.js
│ ├── index.html
│ ├── launcher
│ │ ├── box.js
│ │ ├── channel.js
│ │ ├── chinfo.css
│ │ ├── images
│ │ │ ├── bg_chinfo.png
│ │ │ └── logo_dvb-i.png
│ │ ├── menu.js
│ │ ├── navi.css
│ │ ├── navigation.js
│ │ ├── program.js
│ │ ├── settings.js
│ │ ├── videoplayer_basic.js
│ │ ├── videoplayer_html5.js
│ │ └── videoplayer_mse-eme.js
│ ├── main.js
│ ├── opapp.aitx
│ └── session.js
├── i18n
│ ├── de.json
│ ├── en.json
│ ├── fi.json
│ ├── i18n.js
│ ├── it.json
│ └── zh.json
├── icon_manager.js
├── index.html
├── isoduration.js
├── localstorage.js
└── network.js
├── identifiers.js
├── index.html
├── jquery-3.7.1.min.js
├── linked_applications
├── android_drm_widevine.html
├── hbbtv_playready.html
└── hbbtv_playready_aitx.php
├── namespaces.js
├── opapp_package.js
├── package-lock.json
└── package.json
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/**
2 | opapp.pkg
3 |
--------------------------------------------------------------------------------
/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "esversion":6,
3 | "-W069": false, /* ['xxxx'] is better written in dot notation. */
4 | "-W107": false, /* Script URL. */
5 | "-W027": false, /* unreachab;e 'break' after 'return' */
6 | "-W014": false, /* Misleading line break before '||'; readers may interpret this as an expression boundary. */
7 | "-W021": false /* Reassignment of 'showInfo', which is a function. Use 'var' or 'let' to declare bindings that may change. */
8 | }
--------------------------------------------------------------------------------
/.prettierrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | arrowParens: 'always',
3 | bracketSpacing: true,
4 | endOfLine: 'lf',
5 | htmlWhitespaceSensitivity: 'strict',
6 | printWidth: 120,
7 | proseWrap: 'never',
8 | quoteProps: 'as-needed',
9 | semi: true,
10 | singleQuote: false,
11 | tabWidth: 2,
12 | trailingComma: 'es5',
13 | useTabs: false,
14 | }
15 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | // See http://go.microsoft.com/fwlink/?LinkId=827846
3 | // for the documentation about the extensions.json format
4 | "recommendations": [
5 | // Format-on-save with Prettier
6 | // https://github.com/prettier/prettier-vscode
7 | "esbenp.prettier-vscode"
8 | ]
9 | }
10 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | // ===
3 | // Spacing
4 | // ===
5 |
6 | "editor.insertSpaces": true,
7 | "editor.tabSize": 2,
8 | "editor.trimAutoWhitespace": true,
9 | "files.trimTrailingWhitespace": true,
10 | "files.eol": "\n",
11 | "files.insertFinalNewline": true,
12 | "files.trimFinalNewlines": true,
13 |
14 | // ===
15 | // Files
16 | // ===
17 |
18 | "files.exclude": {
19 | "**/*.log": true,
20 | "**/*.log*": true,
21 | "**/dist": true,
22 | "**/coverage": true
23 | },
24 | "files.associations": {
25 | ".markdownlintrc": "jsonc",
26 | "string": "cpp"
27 | },
28 |
29 | // ===
30 | // Event Triggers
31 | // ===
32 |
33 | "editor.formatOnSave": true,
34 | "editor.defaultFormatter": "esbenp.prettier-vscode",
35 | "editor.codeActionsOnSave": {
36 | "source.fixAll.stylelint": "explicit",
37 | "source.fixAll.markdownlint": "explicit"
38 | },
39 |
40 | // ===
41 | // HTML
42 | // ===
43 |
44 | "html.format.enable": false,
45 | "emmet.triggerExpansionOnTab": true,
46 |
47 | // ===
48 | // JS(ON)
49 | // ===
50 |
51 | "javascript.format.enable": false,
52 | "json.format.enable": false,
53 |
54 | // ===
55 | // CSS
56 | // ===
57 |
58 | "stylelint.enable": true,
59 | "css.validate": false,
60 | "scss.validate": false,
61 |
62 | // ===
63 | // MARKDOWN
64 | // ===
65 |
66 | "[markdown]": {
67 | "editor.wordWrap": "wordWrapColumn",
68 | "editor.wordWrapColumn": 120
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/INSTALL-SERVER.md:
--------------------------------------------------------------------------------
1 | # Build a DVB-I Server
2 | (This guide assumes some Linux experience, exact system directories, package names and system maintenance commands may vary between Linux distributions)
3 | ## System libraries and modules
4 | ### Install latest PHP 8 (includes Apache 2)
5 | ``sudo apt install php``
6 |
7 | ### Configure PHP to allow execution in user directories
8 | Edit ``/etc/apache2/mods-enabled/php7.4.conf`` to comment out the restrictions on PHP in user directories
9 |
10 | # To re-enable php in user directories comment the following lines
11 | # (from to .) Do NOT set it to On as it
12 | # prevents .htaccess files from disabling it.
13 | #
14 | #
15 | # php_admin_value engine Off
16 | #
17 | #
18 |
19 |
20 | ### Install the PHP SimpleXML library
21 | `sudo apt-get install php-xml`
22 |
23 | ### Restart apache
24 | `sudo /etc/init.d/apache2 restart`
25 |
26 | ## Install DVB-I Reference
27 | ### Load the reference client into the Apache root directory
28 |
29 | git clone https://github.com/DVBProject/DVB-I-Reference-Client ~/dvbi/
30 | sudo ln -s ~/dvbi /var/www/html/MyDVBi
31 |
32 | Note that, you could also create a custom Apache site in `/etc/apache2/sites-available` and enable it with `a2ensite`.
33 |
34 | ### Update files to refer to local endpoints
35 |
36 | In `/var/www/html/frontend/configuration.js`, change the `INSTALL_LOCATION` to the fully qualified URL to your service list registry, i.e.
37 | `var INSTALL_LOCATION = "http://my-www-host/MyDVBi";`. Do not include the trailing slash.
38 |
39 | In `/var/www/html/backend/configuration.php`, change the `$install_location` to the same fully qualified URL to your service list registry, i.e.
40 | `$install_location = "http://my-www-host/MyDVBi";`. Do not include the trailing slash.
41 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Sofia Digital, Ltd.
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/TODO.txt:
--------------------------------------------------------------------------------
1 |
2 | Backend
3 | - include the following in the service list editor
4 | ~
5 | ~
6 |
--------------------------------------------------------------------------------
/backend/accessibility_templates/aa-001.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | eng
7 |
8 | false
9 |
10 |
11 |
--------------------------------------------------------------------------------
/backend/accessibility_templates/aa-002.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | gsg
5 | false
6 |
7 |
8 |
9 | urn:hbbtv:appinformation:standardversion:hbbtv:1.6.1
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/backend/accessibility_templates/aa-003.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | fra
7 |
8 | true
9 |
10 |
11 |
12 | esp
13 |
14 | true
15 |
16 |
17 |
--------------------------------------------------------------------------------
/backend/accessibility_templates/aa-004.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | zh-hans
7 |
8 | false
9 |
10 |
11 |
12 | hun
13 |
14 | false
15 |
16 |
17 |
18 | sgn
19 | false
20 |
21 |
22 |
--------------------------------------------------------------------------------
/backend/accessibility_templates/aa-005.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | cat
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/backend/accessibility_templates/aa-006.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | dan
5 |
6 | true
7 |
8 |
9 |
--------------------------------------------------------------------------------
/backend/accessibility_templates/aa-007.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | nld
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/backend/accessibility_templates/aa-008.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/backend/accessibility_templates/aa-009.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/backend/accessibility_templates/aa-010.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | eng
8 |
9 | false
10 |
11 |
12 |
13 |
14 |
15 | fra
16 |
17 | false
18 |
19 |
--------------------------------------------------------------------------------
/backend/accessibility_templates/aa-011.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | eng
7 |
8 | false
9 |
10 |
11 |
12 |
13 |
14 | eng
15 |
16 | false
17 |
18 |
19 |
--------------------------------------------------------------------------------
/backend/accessibility_templates/aa-012.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | urn:cta:wave:appinformation:standardversion:cta5000e:2022
5 |
6 |
7 | gsg
8 | false
9 |
10 |
11 |
--------------------------------------------------------------------------------
/backend/accessibility_templates/aa-013.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | fra
7 |
8 | false
9 |
10 |
11 |
12 | urn:hbbtv:appinformation:standardversion:hbbtv:1.7.1
13 | urn:hbbtv:appinformation:optionalfeature:hbbtv:2decoder
14 | urn:hbbtv:appinformation:optionalfeature:hbbtv:graphics_02
15 |
16 | esp
17 |
18 | true
19 |
20 |
21 |
--------------------------------------------------------------------------------
/backend/accessibility_templates/aa-014.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | urn:cta:wave:appinformation:standardversion:cta5000e:2022
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/backend/accessibility_templates/aa-015.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | urn:cta:wave:appinformation:standardversion:cta5000f:2023
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/backend/channel_icons/chicon_akamai.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/backend/channel_icons/chicon_akamai.png
--------------------------------------------------------------------------------
/backend/channel_icons/chicon_br.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/backend/channel_icons/chicon_br.png
--------------------------------------------------------------------------------
/backend/channel_icons/chicon_br_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/backend/channel_icons/chicon_br_1.png
--------------------------------------------------------------------------------
/backend/channel_icons/chicon_br_hd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/backend/channel_icons/chicon_br_hd.png
--------------------------------------------------------------------------------
/backend/channel_icons/chicon_dvb_s.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/backend/channel_icons/chicon_dvb_s.png
--------------------------------------------------------------------------------
/backend/channel_icons/chicon_dvb_t.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/backend/channel_icons/chicon_dvb_t.png
--------------------------------------------------------------------------------
/backend/channel_icons/chicon_dvb_t2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/backend/channel_icons/chicon_dvb_t2.png
--------------------------------------------------------------------------------
/backend/channel_icons/chicon_harmonic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/backend/channel_icons/chicon_harmonic.png
--------------------------------------------------------------------------------
/backend/channel_icons/chicon_hopetv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/backend/channel_icons/chicon_hopetv.png
--------------------------------------------------------------------------------
/backend/channel_icons/outofservice_example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/backend/channel_icons/outofservice_example.png
--------------------------------------------------------------------------------
/backend/configuration.php:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/backend/css/dvbi.css:
--------------------------------------------------------------------------------
1 | /* DVB-I Servicelist Generator */
2 | /*
3 | sofia colors
4 | orange: #e47600
5 | light blue: #3996c9
6 | dark: #0b0b0b
7 | grey: #131313
8 | lightgrey: #848484
9 | darkblue: #011927
10 | */
11 | html {
12 | height: 100vh; }
13 |
14 | body {
15 | display: flex;
16 | flex-direction: column;
17 | min-height: 100vh; }
18 |
19 | .main {
20 | flex: 1; }
21 |
22 | .service {
23 | border: 1px solid #848484;
24 | border-radius: 8px;
25 | margin-bottom: 2em;
26 | padding: 0.5em;
27 | box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.1); }
28 | .service .serviceinstance {
29 | border-top: 1px solid #848484;
30 | margin: 1em 0em 0em 0em;
31 | padding: 1em 0.5em; }
32 |
33 | #saved_servicelists .icon {
34 | width: 26px;
35 | height: 26px; }
36 | #saved_servicelists .btn:focus, #saved_servicelists .btn.focus {
37 | box-shadow: none; }
38 |
39 | .btn-outline-blue {
40 | border: 1px solid #3996c9;
41 | border-radius: 0px;
42 | color: #3996c9;
43 | -webkit-transition: all .3s;
44 | transition: all .3s; }
45 | .btn-outline-blue:hover {
46 | background-color: #3996c9;
47 | color: #fff; }
48 |
49 | .card {
50 | box-shadow: 0px 0px 35px rgba(0, 0, 0, 0.1); }
51 |
52 | .btn-orange {
53 | background-color: #e47600;
54 | border-color: #e47600;
55 | color: #fff; }
56 | .btn-orange:hover {
57 | background-color: #ff9018;
58 | color: #fff; }
59 |
60 | .footer {
61 | height: 15vh;
62 | background-color: #011927;
63 | color: #fff; }
64 |
--------------------------------------------------------------------------------
/backend/css/dvbi.scss:
--------------------------------------------------------------------------------
1 | /* DVB-I Servicelist Generator */
2 | /*
3 | sofia colors
4 | orange: #e47600
5 | light blue: #3996c9
6 | dark: #0b0b0b
7 | grey: #131313
8 | lightgrey: #848484
9 | darkblue: #011927
10 | */
11 | $orange-color: #e47600;
12 | $blue-color: #3996c9;
13 | $darkblue-color: #011927;
14 | $lightgrey-color: #848484;
15 |
16 | html {
17 | height: 100vh;
18 | }
19 | body {
20 | display: flex;
21 | flex-direction: column;
22 | min-height: 100vh;
23 | }
24 | .main {
25 | flex: 1;
26 | }
27 | .service {
28 | border: 1px solid $lightgrey-color;
29 | border-radius: 8px;
30 | margin-bottom: 2em;
31 | padding: 0.5em;
32 | box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.1);
33 | .serviceinstance {
34 | border-top: 1px solid $lightgrey-color;
35 | margin: 1em 0em 0em 0em;
36 | padding: 1em 0.5em;
37 | }
38 | }
39 | #saved_servicelists {
40 | .icon {
41 | width: 26px;
42 | height: 26px;
43 | }
44 | .btn:focus,
45 | .btn.focus {
46 | box-shadow: none;
47 | }
48 | }
49 | .btn-outline-blue {
50 | border: 1px solid $blue-color;
51 | border-radius: 0px;
52 | color: $blue-color;
53 | -webkit-transition: all 0.3s;
54 | transition: all 0.3s;
55 | &:hover {
56 | background-color: $blue-color;
57 | color: #fff;
58 | }
59 | }
60 | .card {
61 | box-shadow: 0px 0px 35px rgba(0, 0, 0, 0.1);
62 | }
63 | .btn-orange {
64 | background-color: $orange-color;
65 | border-color: $orange-color;
66 | color: #fff;
67 | &:hover {
68 | background-color: lighten($orange-color, 10%);
69 | color: #fff;
70 | }
71 | }
72 |
73 | .footer {
74 | height: 15vh;
75 | background-color: $darkblue-color;
76 | color: #fff;
77 | }
78 |
--------------------------------------------------------------------------------
/backend/delete_servicelist.php:
--------------------------------------------------------------------------------
1 |
38 |
--------------------------------------------------------------------------------
/backend/dvbi.css:
--------------------------------------------------------------------------------
1 | .service {
2 | border: 1px solid #000000;
3 | width: 500px;
4 | margin: 2px;
5 |
6 | }
7 | .serviceinstance {
8 | border: 1px solid #000000;
9 | width: 400px;
10 | margin: 2px;
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/backend/extended_program_information-template.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Default Detailed Program Information
8 | 默认详细节目信息
9 | 01/01/2014
10 | This is the short description. (up to 90 characters)
11 | 这是简短的描述。 (最多 90 个字符)
12 | This is a medium length description that contains a brief summary of the program. (up to 250 characters)
13 | 这是一个中等长度的描述,包含程序的简短摘要。 (最多 250 个字符)
14 | This is the long description (up to 1200 characters) where we can write quite a bit of synopsis about the program and it's actors with quite an amount of detail.
15 | 这是很长的描述(最多 1200 个字符),我们可以在其中写出有关该节目及其演员的大量详细信息。
16 | FAMILY LIFE
17 | RELATIONSHIPS
18 | Critic’s Choice
19 |
20 |
21 | 15
22 |
23 |
24 |
25 | Contains strong language and flash photography
26 | 包含强烈的语言和闪光摄影
27 |
28 |
29 |
30 | Movieland Studios Limited
31 |
32 |
33 |
34 | Jeremy
35 | Brown
36 |
37 |
38 |
39 |
40 | William
41 | Johnson
42 |
43 |
44 | Billy
45 | Johns
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | https://img-ctv.mdata.co.uk/channel7/bargain_hunt.png
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 | https://channel7.co.uk/ait.aitx?pid=b01myjsy
68 |
69 | https://channel7.co.uk/ait.aitx?template
70 |
71 |
73 |
75 |
76 |
77 |
78 | 576
79 | 512
80 | 16:9
81 |
82 |
83 |
84 |
85 | !!DATE_TEMPLATE!!T11:15:00Z
86 | PT45M
87 |
88 |
89 |
90 |
91 |
--------------------------------------------------------------------------------
/backend/extended_program_information.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Bargain Hunt
8 | 讨价还价
9 | 01/01/2014
10 | The Bargain Hunt teams head to Staffordshire's County Showground.
11 | 谈判小组前往斯塔福德郡的县陈列室。
12 | The Bargain Hunt teams head to Staffordshire's County Showground, where both experts face double trouble.
13 | 讨价还价小组前往斯塔福德郡的县展示场,两位专家都在那里面临双重麻烦。
14 | The Bargain Hunt teams head to Staffordshire's County Showground, where both experts face double trouble. David Harper heads up two Toms for the red team, while twin sisters Elizabeth and Rachel are guided by Jonathan Pratt for the blue team. Tim Wonnacott travels to Bath to visit one of the city's greatest architectural delights.
15 | 讨价还价小组前往斯塔福德郡的县展示场,两位专家都在那里面临双重麻烦。 大卫哈珀带领红队的两个汤姆斯,而双胞胎姐妹伊丽莎白和雷切尔则由乔纳森普拉特带领蓝队。 蒂姆·沃纳科特 (Tim Wonnacott) 前往巴斯参观这座城市最伟大的建筑之一。
16 | FAMILY LIFE
17 | RELATIONSHIPS
18 | Critic’s Choice
19 |
20 |
21 | 15
22 |
23 |
24 |
25 | Contains strong language and flash photography
26 | 包含强烈的语言和闪光摄影
27 |
28 |
29 |
30 | ITV Studios Limited
31 |
32 |
33 |
34 | Jeremy
35 | Brown
36 |
37 |
38 |
39 |
40 | William
41 | Johnson
42 |
43 |
44 | Billy
45 | Johns
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | https://img-ctv.mdata.co.uk/channel7/bargain_hunt.png
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 | https://channel7.co.uk/ait.aitx?pid=b01myjsy
65 |
66 | https://channel7.co.uk/ait.aitx?template
67 |
68 |
70 |
72 |
73 |
74 |
75 | 576
76 | 512
77 | 16:9
78 |
79 |
80 |
81 |
82 | 2013-09-25T11:15:00Z
83 | PT45M
84 |
85 |
86 |
87 |
88 |
--------------------------------------------------------------------------------
/backend/icons/pencil.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/icons/trash.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/icons/window.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/images/logo_dvb-i.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/backend/images/logo_dvb-i.png
--------------------------------------------------------------------------------
/backend/images/logo_sofiadigital.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/backend/images/logo_sofiadigital.png
--------------------------------------------------------------------------------
/backend/more_episodes.php:
--------------------------------------------------------------------------------
1 |
25 |
--------------------------------------------------------------------------------
/backend/nownext.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/backend/nownext.png
--------------------------------------------------------------------------------
/backend/nownext.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 | Bargain Hunt
10 | 讨价还价
11 | 01/01/2014
12 | The Bargain Hunt teams head to Staffordshire's County Showground.
13 | 谈判小组前往斯塔福德郡的县陈列室。
14 | The Bargain Hunt teams head to
15 | Staffordshire's County Showground, where both experts face double
16 | trouble.
17 | 讨价还价小组前往斯塔福德郡的县展示场,两位专家都在那里面临双重麻烦。
18 |
19 |
20 | 15
21 |
22 |
23 |
24 | Contains strong language and flash photography
25 | 包含强烈的语言和闪光摄影
26 |
27 |
28 |
29 |
30 | INSTALL~~LOCATION/backend/nownext.png
31 |
32 |
33 |
34 |
35 |
36 |
37 | BBC News at One
38 | The latest national and international
39 | news stories from the BBC News team, followed by weather
40 |
41 |
42 | 0
43 |
44 |
45 |
47 | Contains scenes of violence and strong language.
48 | 包含强烈的语言和闪光摄影
49 |
50 |
51 |
52 |
53 | INSTALL~~LOCATION/backend/nownext.png
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | 2013-09-25T11:15:00Z
64 | PT45M
65 |
66 |
67 |
68 | 2013-09-25T12:00:00Z
69 | PT30M
70 |
71 |
72 |
73 |
74 |
75 |
--------------------------------------------------------------------------------
/backend/program_information.php:
--------------------------------------------------------------------------------
1 | ";
22 | $random_accessibilility .= file_get_contents($aa_template);
23 |
24 | $programInf =str_replace("",$random_accessibilility,$programInf);
25 |
26 | echo $programInf;
27 | ?>
28 |
--------------------------------------------------------------------------------
/backend/program_information_template.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Bargain Hunt
4 | 讨价还价
5 | 01/01/2014
6 | The Bargain Hunt teams head to Staffordshire's County Showground.
7 | 谈判小组前往斯塔福德郡的县陈列室。
8 | The Bargain Hunt teams head to Staffordshire's County Showground, where both experts face double
9 | trouble.
10 | 讨价还价小组前往斯塔福德郡的县展示场,两位专家都在那里面临双重麻烦。
11 |
12 |
13 | 15
14 |
15 |
16 |
17 | Contains strong language and flash photography
18 | 包含强烈的语言和闪光摄影
19 |
20 |
21 |
22 |
23 | INSTALL~~LOCATION/backend/nownext.png
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/backend/saved_lists.php:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/backend/schedule_event_template.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | START_TIME_TEMPLATE
4 | DURATION_TEMPLATE
5 |
6 |
--------------------------------------------------------------------------------
/backend/schedule_template.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb-i-refrecenceapp,2020_Drm-4.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | FTA program
8 | Live AAC + AVC + clear + ads inserted via AWS MT by Unified Streaming
9 |
10 |
11 | 15
12 |
13 |
14 |
15 | Contains strong language and flash photography
16 | 包含强烈的语言和闪光摄影
17 |
18 |
19 |
20 |
21 |
22 | Playready DRM protected program
23 | Live AAC + AVC + clear + ads inserted via AWS MT by Unified Streaming
24 |
25 |
26 | 15
27 |
28 |
29 |
30 | Contains strong language and flash photography
31 | 包含强烈的语言和闪光摄影
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | DATE_TEMPLATET00:00:00Z
41 | PT12H
42 |
43 |
44 |
45 |
46 | drm-cp-1
47 |
48 | DATE_TEMPLATET12:00:00Z
49 | PT12H
50 |
51 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb-i-refrecenceapp,2020_Drm-5.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | FTA program
8 | Live AAC + AVC + clear + ads inserted via AWS MT by Unified Streaming
9 |
10 |
11 | 15
12 |
13 |
14 |
15 | Contains strong language and flash photography
16 | 包含强烈的语言和闪光摄影
17 |
18 |
19 |
20 |
21 |
22 | Widevine DRM protected program
23 | Live AAC + AVC + clear + ads inserted via AWS MT by Unified Streaming
24 |
25 |
26 | 15
27 |
28 |
29 |
30 | Contains strong language and flash photography
31 | 包含强烈的语言和闪光摄影
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 | drm-cp-2
42 |
43 | DATE_TEMPLATET00:00:00Z
44 | PT12H
45 |
46 |
47 |
48 | DATE_TEMPLATET12:00:00Z
49 | PT12H
50 |
51 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_AKAMAI-LL.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Test stream by akamai chunked segment, $number, SegTemp no DVB URN, ffmpeg
8 | Test stream by akamai chunked segment, $number, SegTemp no DVB URN, ffmpeg
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_CMAF-1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Tears of steel DASH HEVC only
8 | Tears of steel DASH HEVC only by MPEG
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_CMAF-2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Tears of steel DASH with ttml + mp4 subtitles
8 | Tears of steel DASH with ttml + mp4 subtitles by MPEG
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_CMAF-3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Tears of steel DASH with vtt + mp4 subtitles
8 | Tears of steel DASH with vtt + mp4 subtitles by MPEG
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_DASHIF-LL.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Low latency test stream by DASH-IF livesim (livesim)
8 | Low latency test stream by DASH-IF livesim (livesim) by DASH Industry Forum
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_DOLBY-HDR.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | PQ10 transport stream with HDR DM using 2094-10 SEI messages Version provided by Dolby. THIS FILE HAS NOT BEEN VALIDATED OFFICIALLY BY DVB!
8 | PQ10 transport stream with HDR DM using 2094-10 SEI messages Version provided by Dolby. THIS FILE HAS NOT BEEN VALIDATED OFFICIALLY BY DVB!
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_HARMONIC-LL.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Test stream by harmonic short segment, $Number$, SegTemp, no DVB urn, no service description
8 | Test stream by harmonic short segment, $Number$, SegTemp, no DVB urn, no service description
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_PHILIPS-HDR.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | PQ10 transport stream with HDR DM using SL-HDR2 SEI messages Version provided by Philips. THIS FILE HAS NOT BEEN VALIDATED OFFICIALLY BY DVB!
8 | PQ10 transport stream with HDR DM using SL-HDR2 SEI messages Version provided by Philips. THIS FILE HAS NOT BEEN VALIDATED OFFICIALLY BY DVB!
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_SES-HDR-1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | PQ10 transport stream with HDR DM using SL-HDR2 SEI messages switching on - off - on in 1 minute sections Version provided by SES. THIS FILE HAS NOT BEEN VALIDATED OFFICIALLY BY DVB!
8 | PQ10 transport stream with HDR DM using SL-HDR2 SEI messages switching on - off - on in 1 minute sections Version provided by SES. THIS FILE HAS NOT BEEN VALIDATED OFFICIALLY BY DVB!
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_SES-HDR-2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | PQ10 transport stream with HDR DM using 2094-10 SEI messages switching on - off - on in 1 minute sections Version provided by SES. THIS FILE HAS NOT BEEN VALIDATED OFFICIALLY BY DVB!
8 | PQ10 transport stream with HDR DM using 2094-10 SEI messages switching on - off - on in 1 minute sections Version provided by SES. THIS FILE HAS NOT BEEN VALIDATED OFFICIALLY BY DVB!
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_UNIFIED-LL.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Test stream by unified streaming Short segment, service Description, segment Timeline $Time$, unified origin
8 | Test stream by unified streaming Short segment, service Description, segment Timeline $Time$, unified origin
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_Unified-0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Live Clear AVC + AAC
8 | Live Clear AVC + AAC by Unified Streaming
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_Unified-1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Live 'cbcs' AVC + AAC
8 | Live 'cbcs' AVC + AAC by Unified Streaming
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_Unified-2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | ToS Live Clear AVC + AAC + WVTT + TTML
8 | ToS Live Clear AVC + AAC + WVTT + TTML Unified Streaming
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_Unified-3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Live 'cbcs' AVC + AAC, ad periods in clear
8 | Live 'cbcs' AVC + AAC, ad periods in clear by Unified Streaming
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_Unified-4.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | ToS Live Clear AVC + AAC + WVTT + TTML, ads without subtitles
8 | ToS Live Clear AVC + AAC + WVTT + TTML, ads without subtitlesby Unified Streaming
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_Unified-7.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Live AAC + AVC ads inserted
8 | Live AAC + AVC ads inserted by Unified Streaming
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_Unified-8.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Live AAC + AVC + 'cbcs' + ads inserted
8 | Live AAC + AVC + 'cbcs' + ads inserted by Unified Streaming
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/schedule_templates/tag_dvb.org,2020_Unified-mt.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Live AAC + AVC + clear + ads inserted via AWS MT
8 | Live AAC + AVC + clear + ads inserted via AWS MT by Unified Streaming
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | DATE_TEMPLATET00:00:00Z
18 | PT12H
19 |
20 |
21 |
22 | DATE_TEMPLATET12:00:00Z
23 | PT12H
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/backend/servicelists/.gitignore:
--------------------------------------------------------------------------------
1 | **
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/backend/servicelists/advanced_codecs.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | Advanced codecs Service list
6 | DVB
7 |
8 |
9 |
10 |
11 |
12 |
13 | tag:dvb.org,2021:advsid1
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | https://d311iqjvb3q514.cloudfront.net/dolbyac4/manifest.mpd
24 |
25 |
26 |
27 | HEVC UHD video + AC4 audio
28 | Dolby
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/backend/servicelists/example_availability.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 | DVB-I Reference app availability example
7 | DVB
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | DVB-I Reference Application
16 |
17 | INSTALL~~LOCATION/backend/schedule.php
18 |
19 |
20 | INSTALL~~LOCATION/backend/program_information.php
21 |
22 |
23 | INSTALL~~LOCATION/backend/more_episodes.php
24 |
25 |
26 |
27 | tag:dvb.org,2020:rev1sid1
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 | https://refapp.hbbtv.org/livesim/02_llamanofragv1/manifest.mpd
37 |
38 |
39 |
40 | Not available service
41 | Ei saatavilla palvelu
42 | 没有可用的服务
43 | DVB
44 |
45 |
46 |
47 | INSTALL~~LOCATION/backend/channel_icons/outofservice_example.png
48 |
49 |
50 |
51 |
52 |
53 | tag:dvb.org,2020:rev1sid2
54 |
55 |
56 |
57 | https://refapp.hbbtv.org/livesim/02_llamanofragv1/manifest.mpd
58 |
59 |
60 |
61 | Available service
62 | Saatavilla palvelu
63 | 可用服务
64 | DVB
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/backend/servicelists/schemas/dvbi_service_list_discovery_v1.6.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/backend/upload_servicelist.php:
--------------------------------------------------------------------------------
1 | preserveWhiteSpace = false;
32 | $dom->formatOutput = true;
33 | // End initial block
34 |
35 | $dom->loadXML($data);
36 | $out = $dom->saveXML();
37 |
38 | $ret = @file_put_contents($target, $out,LOCK_EX);
39 | if($ret === false) {
40 | http_response_code (400);
41 | echo('There was an error writing this file');
42 | }
43 | }
44 | else {
45 | http_response_code (400);
46 | echo('Error saving servicelist!');
47 | }
48 | ?>
49 |
--------------------------------------------------------------------------------
/frontend/android/images/License.txt:
--------------------------------------------------------------------------------
1 | License
2 |
3 | noun-subtitles-78795.png
4 | Subtitles by Vicons Design from Noun Project (CC BY 3.0)
5 |
6 | noun-audio-description-4258567.png
7 | audio description by Fran Couto from Noun Project (CC BY 3.0)
8 |
9 | noun-speaking-5005852.png
10 | speaking by Didan Farhan from Noun Project (CC BY 3.0)
11 |
12 | noun-text-to-speech-5024773.png
13 | Text to speech by Daniel T. from Noun Project (CC BY 3.0)
14 |
15 |
--------------------------------------------------------------------------------
/frontend/android/images/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/apple-touch-icon.png
--------------------------------------------------------------------------------
/frontend/android/images/arrow-left-short.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/frontend/android/images/bg_chinfo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/bg_chinfo.png
--------------------------------------------------------------------------------
/frontend/android/images/bg_info.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/bg_info.png
--------------------------------------------------------------------------------
/frontend/android/images/call-to-action.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/call-to-action.png
--------------------------------------------------------------------------------
/frontend/android/images/chevron-left.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/frontend/android/images/chevron-right.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/frontend/android/images/closed-captioning.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/frontend/android/images/contrast.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/contrast.png
--------------------------------------------------------------------------------
/frontend/android/images/empty.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/empty.png
--------------------------------------------------------------------------------
/frontend/android/images/gear.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/frontend/android/images/icons-128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/icons-128.png
--------------------------------------------------------------------------------
/frontend/android/images/icons-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/icons-512.png
--------------------------------------------------------------------------------
/frontend/android/images/landingpage_banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/landingpage_banner.png
--------------------------------------------------------------------------------
/frontend/android/images/landingpage_ui.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/landingpage_ui.png
--------------------------------------------------------------------------------
/frontend/android/images/lock.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/frontend/android/images/logo_dvbi_sofia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/logo_dvbi_sofia.png
--------------------------------------------------------------------------------
/frontend/android/images/magnifier-glass-zoom-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/magnifier-glass-zoom-icon.png
--------------------------------------------------------------------------------
/frontend/android/images/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "Video",
3 | "name": "Video player for mobile devices",
4 | "icons": [
5 | {
6 | "src": "images/icons-128.png",
7 | "type": "image/png",
8 | "sizes": "192x192"
9 | },
10 | {
11 | "src": "images/icons-512.png",
12 | "type": "image/png",
13 | "sizes": "512x512"
14 | }
15 | ],
16 | "start_url": "index.html",
17 | "background_color": "#000000",
18 | "display": "fullscreen",
19 | "orientation": "landscape",
20 | "scope": "",
21 | "theme_color": "#0098f4"
22 | }
--------------------------------------------------------------------------------
/frontend/android/images/mixer-vertical.svg:
--------------------------------------------------------------------------------
1 |
9 |
--------------------------------------------------------------------------------
/frontend/android/images/noun-audio-description-4258567-trim.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/noun-audio-description-4258567-trim.png
--------------------------------------------------------------------------------
/frontend/android/images/noun-audio-description-4258567.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/noun-audio-description-4258567.png
--------------------------------------------------------------------------------
/frontend/android/images/noun-speaking-5005852-trim.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/noun-speaking-5005852-trim.png
--------------------------------------------------------------------------------
/frontend/android/images/noun-speaking-5005852.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/noun-speaking-5005852.png
--------------------------------------------------------------------------------
/frontend/android/images/noun-subtitles-78795-trim.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/noun-subtitles-78795-trim.png
--------------------------------------------------------------------------------
/frontend/android/images/noun-subtitles-78795.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/noun-subtitles-78795.png
--------------------------------------------------------------------------------
/frontend/android/images/noun-text-to-speech-5024773-trim.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/noun-text-to-speech-5024773-trim.png
--------------------------------------------------------------------------------
/frontend/android/images/noun-text-to-speech-5024773.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/noun-text-to-speech-5024773.png
--------------------------------------------------------------------------------
/frontend/android/images/ons-icon-bsl-large-mono-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/ons-icon-bsl-large-mono-2.png
--------------------------------------------------------------------------------
/frontend/android/images/splash-128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/splash-128.png
--------------------------------------------------------------------------------
/frontend/android/images/splash-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/splash-512.png
--------------------------------------------------------------------------------
/frontend/android/images/spoken-subtitles-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android/images/spoken-subtitles-2.png
--------------------------------------------------------------------------------
/frontend/android/images/x-circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/frontend/android/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | DVB-I RefApp
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
Add DVB-I RefApp to your Home screen:
34 |
35 | - Tap the menu icon
36 | - Tap Add to homescreen.
37 |
38 |
39 |
40 |

41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/frontend/android/js/epg.js:
--------------------------------------------------------------------------------
1 | function EPG(channels) {
2 | this.channels = channels;
3 | for (var i = 0; i < this.channels.length; i++) {
4 | this.channels[i].epg = this;
5 | }
6 | this.displayIndex = 0;
7 | var date = new Date();
8 | date.setHours(0, 0, 0, 0);
9 | this.start = Math.round(date.getTime() / 1000);
10 | this.end = this.start + 24 * 60 * 60;
11 | this.open = false;
12 | }
13 |
14 | EPG.prototype.populate = function (start, end) {
15 | var self = this;
16 | var count = self.channels.length;
17 | if (self.element == null) {
18 | self.element = document.createElement("div");
19 | self.element.addClass("row epgchannels");
20 | } else {
21 | $(self.element).empty();
22 | }
23 | var serviceIndex = self.displayIndex;
24 | for (var i = serviceIndex; i < serviceIndex + 3 && i < self.channels.length; i++) {
25 | self.element.appendChild(self.channels[i].showEPG(start, end));
26 | }
27 |
28 | return self.element;
29 | };
30 |
31 | EPG.prototype.showChannel = function (service, start, end) {
32 | var serviceIndex = 0;
33 | if (service != null) {
34 | for (var i = 0; i < this.channels.length; i++) {
35 | if (this.channels[i].getServiceRef() === service.getServiceRef()) {
36 | serviceIndex = i;
37 | break;
38 | }
39 | }
40 | }
41 | this.displayIndex = Math.min(serviceIndex, this.channels.length - 3);
42 | if (this.displayIndex < 0) {
43 | this.displayIndex = 0;
44 | }
45 | return this.populate(start, end);
46 | };
47 |
48 | EPG.prototype.showNextChannel = function (start, end) {
49 | if (this.displayIndex < this.channels.length - 3) {
50 | this.displayIndex++;
51 | this.populate();
52 | }
53 | return this.displayIndex < this.channels.length - 3;
54 | };
55 |
56 | EPG.prototype.showPreviousChannel = function (start, end) {
57 | if (this.displayIndex > 0) {
58 | this.displayIndex--;
59 | this.populate();
60 | }
61 | return this.displayIndex > 0;
62 | };
63 |
64 | EPG.prototype.showNextDay = function () {
65 | for (var i = 0; i < this.channels.length; i++) {
66 | this.channels[i].programs = null;
67 | }
68 | this.start = this.start + 24 * 60 * 60;
69 | this.end = this.start + 24 * 60 * 60;
70 | this.populate(this.start, this.start + 24 * 60 * 60);
71 | };
72 |
73 | EPG.prototype.showPreviousDay = function () {
74 | for (var i = 0; i < this.channels.length; i++) {
75 | this.channels[i].programs = null;
76 | }
77 | this.start = this.start - 24 * 60 * 60;
78 | this.end = this.start + 24 * 60 * 60;
79 | this.populate();
80 | };
81 |
82 | function showNext() {
83 | if (!epg.showNextChannel()) {
84 | if (!$("#next_channel").hasClass("end")) {
85 | $("#next_channel").addClass("end");
86 | }
87 | } else if ($("#previous_channel").hasClass("end")) {
88 | $("#previous_channel").removeClass("end");
89 | }
90 | }
91 |
92 | function showPrevious() {
93 | if (!epg.showPreviousChannel()) {
94 | if (!$("#previous_channel").hasClass("end")) {
95 | $("#previous_channel").addClass("end");
96 | }
97 | } else if ($("#next_channel").hasClass("end")) {
98 | $("#next_channel").removeClass("end");
99 | }
100 | }
101 |
102 | function nextDay() {
103 | epg.showNextDay();
104 | var epgdate = new Date(epg.start * 1000);
105 | $("#epg_date").text(epgdate.getDate() + "." + (epgdate.getMonth() + 1) + ".");
106 | }
107 |
108 | function previousDay() {
109 | epg.showPreviousDay();
110 | var epgdate = new Date(epg.start * 1000);
111 | $("#epg_date").text(epgdate.getDate() + "." + (epgdate.getMonth() + 1) + ".");
112 | }
113 |
--------------------------------------------------------------------------------
/frontend/android/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "DVB-I RefApp",
3 | "name": "DVB-I RefApp",
4 | "icons": [
5 | {
6 | "src": "images/icons-128.png",
7 | "type": "image/png",
8 | "sizes": "192x192"
9 | },
10 | {
11 | "src": "images/icons-512.png",
12 | "type": "image/png",
13 | "sizes": "512x512"
14 | }
15 | ],
16 | "start_url": "player.html",
17 | "background_color": "#000000",
18 | "display": "fullscreen",
19 | "orientation": "landscape",
20 | "scope": "",
21 | "theme_color": "#0098f4"
22 | }
--------------------------------------------------------------------------------
/frontend/android_apk/.gitignore:
--------------------------------------------------------------------------------
1 | *~
2 | # Gradle files
3 | .gradle/
4 | build/
5 |
6 | # Local configuration file (sdk path, etc)
7 | local.properties
8 |
9 | # User properties
10 | user.properties
11 |
12 | # Log/OS Files
13 | *.log
14 |
15 | # Android Studio generated files and folders
16 | captures/
17 | .externalNativeBuild/
18 | .cxx/
19 | *.apk
20 | output.json
21 | output-metadata.json
22 |
23 | # IntelliJ
24 | *.iml
25 | .idea/
26 |
27 | # Keystore files
28 | *.jks
29 | *.keystore
30 |
31 | # Google Services (e.g. APIs or Firebase)
32 | google-services.json
33 |
34 | # Android Profiling
35 | *.hprof
36 |
37 | .DS_Store
38 | *.keystore
39 | user.properties
40 | app/normal/
41 | appConfig.json
42 |
--------------------------------------------------------------------------------
/frontend/android_apk/AppIcon:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/AppIcon
--------------------------------------------------------------------------------
/frontend/android_apk/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | ## 2014-01-04
4 |
5 | - Fix a crash on reload with no page loaded.
6 |
7 | ## 2015-01-02
8 |
9 | - Update to latest gradle and build tools versions, making the project compatible with Android Studio 1.0.
10 | - Fix bugs related to syncing of tabs with sidebar menu.
11 |
12 | ## 2014-12-23
13 |
14 | - Allow setting of viewport while preserving ability to zoom.
15 | - Allow dynamic config of navigation title image URLs.
16 | - Various bug fixes involving javascript after page load, and tab coloring, tab animations, and a crash on application resume.
17 |
18 | ## 2014-12-22
19 |
20 | - Fix various threading bugs where UI methods were called from non-UI threads.
21 |
22 | ## 2014-12-05
23 |
24 | - Support showing the navigation title image on specific URLs.
25 |
26 | ## 2014-12-03
27 |
28 | - Support customizing user agent per URL.
29 | - Add color styling options for tabs.
30 |
31 | ## 2014-11-30
32 |
33 | - New tabs with better material design and animations.
34 | - Fix some automatic icon generation scripts.
35 |
36 | ## 2014-11-26
37 |
38 | - Fix a crash involving webview pools.
39 |
40 | ## 2014-11-25
41 |
42 | - Add support for custom actions in action bar.
43 |
--------------------------------------------------------------------------------
/frontend/android_apk/HeaderImage:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/HeaderImage
--------------------------------------------------------------------------------
/frontend/android_apk/NotificationIcon:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/NotificationIcon
--------------------------------------------------------------------------------
/frontend/android_apk/README.md:
--------------------------------------------------------------------------------
1 | # dvb-i-demo-android
2 |
3 | Android layer for DVB-I reference application. Android - javascript interface for DVB-I NIP implementation
4 |
5 | The APK provides a WebView for the Android version of the reference app
6 |
7 | ## DVB-I NIP implementation
8 |
9 | Android layer provides the following Javascript API for DVB-I NIP service discovery:
10 |
11 | - `android_interface.startNIPDiscovery()` Starts the DVB-I service discovery process. Return value: void
12 | - `android_interface.getServices()` Returns the found services as a string containing a JSON array:
13 |
14 | ```json
15 | [
16 | {
17 | "service_name": "my-gw",
18 | "dvbi_sl": "https://dvb-i-reference.dvb.org/client/backend/servicelist.php?list=example.xml"
19 | },
20 | {
21 | "service_name": "example_gw",
22 | "dvbi_sep": "https://dvb-i-reference.dvb.org/client/backend/servicelist_registry.php",
23 | "orb_pos_A": "1",
24 | "orb_pos_B": "2",
25 | "orb_pos_C": "3",
26 | "orb_pos_D": "3"
27 | }
28 | ]
29 | ```
30 |
31 | - `android_interface.getTest()` Test funtion to determine if the android API is working. Returns string: `Android JS interface test success`
32 |
33 | When the android application discovers a service it will call a global javascript function if it is defined: `window.nip.serviceDiscovered(service)`. The service paramer is an object, same as the objects returned in the getServices() return value array: `{"dvbi_sl":"https://dvb-i-reference.dvb.org/client/backend/servicelist.php?list=example.xml"}`
34 |
35 | ## Building
36 |
37 | Project can be build using the Android Studio. Open the android_apk directory in the Android studio and build the project from the Build menu.
38 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/.gitignore:
--------------------------------------------------------------------------------
1 | build/
2 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 | apply from: '../constants.gradle'
3 |
4 | tasks.register('copyFiles', Copy) {
5 | from new File("$projectDir/../../../")
6 | into "${layout.projectDirectory}/src/main/assets/"
7 | include 'identifiers.js'
8 | include 'jquery-3.7.1.min.js'
9 | include 'namespaces.js'
10 | include 'frontend/i18n/**'
11 | include 'frontend/*.js'
12 | include 'frontend/android/**'
13 | }
14 | android {
15 | compileSdkVersion 33
16 |
17 | defaultConfig {
18 | minSdkVersion 24
19 | targetSdkVersion 33
20 | applicationId "com.dvb.dvb_i.DvbiReferenceApplication"
21 | versionCode 38
22 | versionName "38"
23 |
24 | manifestPlaceholders = [manifestApplicationId: "${applicationId}"]
25 | setProperty("archivesBaseName", applicationId + "-v" + versionCode)
26 | }
27 |
28 | compileOptions {
29 | sourceCompatibility JavaVersion.VERSION_1_8
30 | targetCompatibility JavaVersion.VERSION_1_8
31 | }
32 |
33 | buildTypes {
34 | debug {
35 | applicationIdSuffix ".debug"
36 | }
37 | release {
38 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
39 | zipAlignEnabled true
40 | }
41 | }
42 |
43 | flavorDimensions "webview"
44 |
45 | productFlavors {
46 | normal {
47 | dimension "webview"
48 | }
49 | }
50 | lint {
51 | abortOnError true
52 | checkReleaseBuilds true
53 | }
54 |
55 | namespace 'com.dvb.dvb_i'
56 | }
57 |
58 | preBuild.dependsOn(copyFiles)
59 |
60 | dependencies {
61 | implementation 'androidx.appcompat:appcompat:1.3.1'
62 | implementation 'com.google.android.gms:play-services-gcm:17.0.0'
63 | implementation 'com.google.code.gson:gson:2.8.7'
64 |
65 | implementation 'androidx.tvprovider:tvprovider:1.1.0-alpha01'
66 |
67 | implementation("com.squareup.okhttp3:okhttp:4.9.0")
68 | implementation("androidx.security:security-crypto:1.1.0-alpha03")
69 | implementation 'androidx.recyclerview:recyclerview:' + project.ext.jetpackVersion // (344 KB) https://mvnrepository.com/artifact/androidx.recyclerview/recyclerview?repo=google
70 |
71 | implementation "androidx.constraintlayout:constraintlayout:2.1.0"
72 | implementation "androidx.tvprovider:tvprovider:"
73 | implementation 'pub.devrel:easypermissions:3.0.0'
74 |
75 | // Minimal version for suitest is 25.2.0, you can use any higher.
76 | debugImplementation 'org.java-websocket:Java-WebSocket:1.5.1'
77 | }
--------------------------------------------------------------------------------
/frontend/android_apk/app/proguard-project.txt:
--------------------------------------------------------------------------------
1 | # To enable ProGuard in your project, edit project.properties
2 | # to define the proguard.config property as described in that file.
3 | #
4 | # Add project specific ProGuard rules here.
5 | # By default, the flags in this file are appended to flags specified
6 | # in ${sdk.dir}/tools/proguard/proguard-android.txt
7 | # You can edit the include path and order by changing the ProGuard
8 | # include property in project.properties.
9 | #
10 | # For more details, see
11 | # http://developer.android.com/guide/developing/tools/proguard.html
12 |
13 | # Add any project specific keep options here:
14 |
15 | # If your project uses WebView with JS, uncomment the following
16 | # and specify the fully qualified class name to the JavaScript interface
17 | # class:
18 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
19 | # public *;
20 | #}
21 |
22 | # webview interfaces
23 |
24 | -keepattributes JavascriptInterface
25 |
26 | -keepclassmembers class com.dvb.dvb_i.AndroidJsInterface {
27 | public *;
28 | }
29 |
30 | # stuff for google play services
31 | -keep class * extends java.util.ListResourceBundle {
32 | protected Object[][] getContents();
33 | }
34 |
35 | -keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
36 | public static final *** NULL;
37 | }
38 |
39 | -keepnames @com.google.android.gms.common.annotation.KeepName class *
40 | -keepclassmembernames class * {
41 | @com.google.android.gms.common.annotation.KeepName *;
42 | }
43 |
44 | -keepnames class * implements android.os.Parcelable {
45 | public static final ** CREATOR;
46 | }
47 |
48 | # Google Cloud Messaging
49 | -keep class com.google.android.gms.** { *; }
50 | -keep interface com.google.android.gms.** { *; }
51 |
52 | # appcompat library
53 | -dontwarn android.support.v4.**
54 | -keep class android.support.v4.** { *; }
55 | -keep interface android.support.v4.** { *; }
56 | -dontwarn android.support.v7.**
57 | -keep class android.support.v7.** { *; }
58 | -keep interface android.support.v7.** { *; }
59 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
8 |
10 |
12 |
14 |
16 |
18 |
20 |
22 |
23 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
44 |
45 |
47 |
48 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/assets/.gitignore:
--------------------------------------------------------------------------------
1 | frontend/**
2 | identifiers.js
3 | jquery-3.7.1.min.js
4 | namespaces.js
5 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/assets/appConfig.example.json:
--------------------------------------------------------------------------------
1 | {
2 | "_COMMENT": "Please create matching appConfig.json file - this is only example",
3 | "initialUrl": "file:///android_asset/frontend/android/player.html",
4 | "client": "dvb"
5 | }
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/assets/offline.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | DVB-I Demo
5 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/ic_launcher-playstore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/ic_launcher-playstore.png
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/ic_launcher_dvb-playstore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/ic_launcher_dvb-playstore.png
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/java/com/dvb/dvb_i/ConfigUtil.java:
--------------------------------------------------------------------------------
1 | package com.dvb.dvb_i;
2 |
3 | import android.app.Activity;
4 |
5 | import org.json.JSONException;
6 | import org.json.JSONObject;
7 |
8 | import java.io.IOException;
9 | import java.io.InputStream;
10 |
11 | public class ConfigUtil {
12 |
13 | public ConfigUtil() {
14 | }
15 |
16 | public static AppConfig getAppConfig(Activity activity) {
17 | String json = null;
18 | try {
19 | InputStream is = activity.getAssets().open("appConfig.json");
20 | int size = is.available();
21 | byte[] buffer = new byte[size];
22 | is.read(buffer);
23 | is.close();
24 | json = new String(buffer, "UTF-8");
25 | JSONObject jsonObject = new JSONObject(json);
26 | String initialUrl = jsonObject.getString("initialUrl");
27 | String client = jsonObject.getString("client");
28 | return new AppConfig(initialUrl, client);
29 | } catch (IOException | JSONException ex) {
30 | ex.printStackTrace();
31 | return null;
32 | }
33 | }
34 |
35 | public static class AppConfig {
36 | private String initialUrl;
37 | private String client;
38 |
39 | public AppConfig(String initialUrl, String client) {
40 | this.initialUrl = initialUrl;
41 | this.client = client;
42 | }
43 |
44 | public String getInitialUrl() {
45 | return initialUrl;
46 | }
47 |
48 | public String getClient() {
49 | return client;
50 | }
51 |
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/java/com/dvb/dvb_i/DvbiReferenceApplication.java:
--------------------------------------------------------------------------------
1 | package com.dvb.dvb_i;
2 |
3 | import android.app.Application;
4 | import android.os.Message;
5 | import android.webkit.ValueCallback;
6 |
7 | public class DvbiReferenceApplication extends Application {
8 |
9 | private Message webviewMessage;
10 | private ValueCallback webviewValueCallback;
11 |
12 | @Override
13 | public void onCreate() {
14 | super.onCreate();
15 | }
16 |
17 | public Message getWebviewMessage() {
18 | return webviewMessage;
19 | }
20 |
21 | public void setWebviewMessage(Message webviewMessage) {
22 | this.webviewMessage = webviewMessage;
23 | }
24 |
25 | // Needed for Crosswalk
26 | @SuppressWarnings("unused")
27 | public ValueCallback getWebviewValueCallback() {
28 | return webviewValueCallback;
29 | }
30 |
31 | public void setWebviewValueCallback(ValueCallback webviewValueCallback) {
32 | this.webviewValueCallback = webviewValueCallback;
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/java/com/dvb/dvb_i/HtmlIntercept.java:
--------------------------------------------------------------------------------
1 | package com.dvb.dvb_i;
2 |
3 | import android.content.Context;
4 | import android.webkit.WebResourceResponse;
5 |
6 | public class HtmlIntercept {
7 |
8 | private Context context;
9 | private String interceptUrl;
10 |
11 | HtmlIntercept(Context context) {
12 | this.context = context;
13 | }
14 |
15 | public void setInterceptUrl(String interceptUrl) {
16 | this.interceptUrl = interceptUrl;
17 | }
18 |
19 | public WebResourceResponse interceptHtml(WebviewInterface view, String url, String referer) {
20 | return null;
21 | }
22 |
23 | }
24 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/java/com/dvb/dvb_i/WebChromeClientCustomPoster.java:
--------------------------------------------------------------------------------
1 | package com.dvb.dvb_i;
2 |
3 | import android.graphics.Bitmap;
4 | import android.util.Log;
5 | import android.webkit.ConsoleMessage;
6 | import android.webkit.PermissionRequest;
7 | import android.webkit.WebChromeClient;
8 |
9 | public class WebChromeClientCustomPoster extends WebChromeClient {
10 | @Override
11 | public Bitmap getDefaultVideoPoster() {
12 | return Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
13 | }
14 | @Override
15 | public void onPermissionRequest(PermissionRequest request) {
16 | String[] resources = request.getResources();
17 | for (int i = 0; i < resources.length; i++) {
18 | if (PermissionRequest.RESOURCE_PROTECTED_MEDIA_ID.equals(resources[i])) {
19 | request.grant(resources);
20 | return;
21 | }
22 | }
23 | super.onPermissionRequest(request);
24 | }
25 |
26 | @Override
27 | public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
28 | Log.d("com.dv.dvb_i.DvbiReferenceApplication.debug", consoleMessage.message() + " -- From line " +
29 | consoleMessage.lineNumber() + " of " + consoleMessage.sourceId());
30 | return true;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/java/com/dvb/dvb_i/WebviewInterface.java:
--------------------------------------------------------------------------------
1 | package com.dvb.dvb_i;
2 |
3 | import android.view.ViewParent;
4 |
5 | public interface WebviewInterface {
6 | void loadUrl(String url);
7 | void loadUrlDirect(String url);
8 | String getUrl();
9 | void reload();
10 | boolean canGoBack();
11 | void goBack();
12 | void onPause();
13 | void onResume();
14 | void stopLoading();
15 | ViewParent getParent();
16 | void destroy();
17 | int getProgress();
18 | void runJavascript(String js);
19 | }
20 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/drawable-xxxhdpi/simple_border.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/drawable/dvb_splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/drawable/dvb_splash.png
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/drawable/focus_border.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/drawable/ic_banner_dvb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/drawable/ic_banner_dvb.png
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/drawable/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
14 |
17 |
20 |
23 |
26 |
29 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/drawable/rounded_corners.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/layout/main_activity.xml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
14 |
15 |
20 |
21 |
26 |
27 |
38 |
39 |
40 |
41 |
50 |
51 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-anydpi-v26/ic_banner_dvb.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-anydpi-v26/ic_launcher_dvb.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-anydpi-v26/ic_launcher_dvb_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-hdpi/ic_launcher_dvb.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/mipmap-hdpi/ic_launcher_dvb.webp
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-hdpi/ic_launcher_dvb_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/mipmap-hdpi/ic_launcher_dvb_foreground.webp
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-hdpi/ic_launcher_dvb_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/mipmap-hdpi/ic_launcher_dvb_round.webp
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-mdpi/ic_launcher_dvb.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/mipmap-mdpi/ic_launcher_dvb.webp
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-mdpi/ic_launcher_dvb_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/mipmap-mdpi/ic_launcher_dvb_foreground.webp
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-mdpi/ic_launcher_dvb_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/mipmap-mdpi/ic_launcher_dvb_round.webp
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-xhdpi/ic_banner_dvb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/mipmap-xhdpi/ic_banner_dvb.png
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-xhdpi/ic_launcher_dvb.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/mipmap-xhdpi/ic_launcher_dvb.webp
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-xhdpi/ic_launcher_dvb_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/mipmap-xhdpi/ic_launcher_dvb_foreground.webp
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-xhdpi/ic_launcher_dvb_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/mipmap-xhdpi/ic_launcher_dvb_round.webp
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-xxhdpi/ic_launcher_dvb.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/mipmap-xxhdpi/ic_launcher_dvb.webp
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-xxhdpi/ic_launcher_dvb_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/mipmap-xxhdpi/ic_launcher_dvb_foreground.webp
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-xxhdpi/ic_launcher_dvb_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/mipmap-xxhdpi/ic_launcher_dvb_round.webp
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-xxxhdpi/ic_launcher_dvb.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/mipmap-xxxhdpi/ic_launcher_dvb.webp
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-xxxhdpi/ic_launcher_dvb_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/mipmap-xxxhdpi/ic_launcher_dvb_foreground.webp
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/mipmap-xxxhdpi/ic_launcher_dvb_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/app/src/main/res/mipmap-xxxhdpi/ic_launcher_dvb_round.webp
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/values/ic_banner_dvb_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #000000
4 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/values/ic_launcher_dvb_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #000000
4 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | DVB-I Reference client
4 | Error establishing SSL Connection
5 | SSL certificate has expired
6 | Invalid SSL certificate
7 |
8 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
15 |
16 |
19 |
20 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/normal/java/com/dvb/dvb_i/LeanWebView.java:
--------------------------------------------------------------------------------
1 | package com.dvb.dvb_i;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.view.View;
6 | import android.webkit.WebView;
7 | import android.webkit.WebViewClient;
8 |
9 | public class LeanWebView extends WebView implements WebviewInterface {
10 | private WebViewClient mClient = null;
11 |
12 | public LeanWebView(Context context) {
13 | super(context);
14 | }
15 |
16 | public LeanWebView(Context context, AttributeSet attrs) {
17 | super(context, attrs);
18 | }
19 |
20 | public LeanWebView(Context context, AttributeSet attrs, int defStyle) {
21 | super(context, attrs, defStyle);
22 | }
23 |
24 | @Override
25 | protected void onWindowVisibilityChanged(int visibility) {
26 | if (visibility != View.GONE && visibility != View.INVISIBLE) super.onWindowVisibilityChanged(visibility);
27 | }
28 |
29 | @Override
30 | public void setWebViewClient(WebViewClient client) {
31 | mClient = client;
32 | super.setWebViewClient(client);
33 | }
34 |
35 | @Override
36 | public void setWebChromeClient(android.webkit.WebChromeClient client) {
37 | super.setWebChromeClient(client);
38 | }
39 |
40 | @Override
41 | public void loadUrl(String url) {
42 | if (url == null) return;
43 |
44 | if (url.startsWith("javascript:"))
45 | runJavascript(url.substring("javascript:".length()));
46 | else if (mClient == null || !mClient.shouldOverrideUrlLoading(this, url)) {
47 | super.loadUrl(url);
48 | }
49 | }
50 |
51 | @Override
52 | public void reload() {
53 | if (mClient == null || !(mClient instanceof WebviewClient)) super.reload();
54 | else if(!((WebviewClient)mClient).shouldOverrideUrlLoading(this, getUrl(), true))
55 | super.reload();
56 | }
57 |
58 | @Override
59 | public void goBack() {
60 | runJavascript("javascript:document.dispatchEvent(new KeyboardEvent('keydown',{'keyCode':8}));\n");
61 | }
62 |
63 | public void loadUrlDirect(String url) {
64 | super.loadUrl(url);
65 | }
66 |
67 | public void runJavascript(String js) {
68 | evaluateJavascript(js, null);
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/normal/java/com/dvb/dvb_i/WebChromeCustomClient.java:
--------------------------------------------------------------------------------
1 | package com.dvb.dvb_i;
2 |
3 | import android.os.Message;
4 | import android.webkit.WebView;
5 |
6 | class WebChromeCustomClient extends WebChromeClientCustomPoster {
7 | private MainActivity mainActivity;
8 | private UrlNavigation urlNavigation;
9 |
10 | public WebChromeCustomClient(MainActivity mainActivity, UrlNavigation urlNavigation) {
11 | this.mainActivity = mainActivity;
12 | this.urlNavigation = urlNavigation;
13 | }
14 |
15 | @Override
16 | public void onCloseWindow(WebView window) {
17 | if (mainActivity.isNotRoot()) mainActivity.finish();
18 | }
19 |
20 | @Override
21 | public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
22 | return urlNavigation.createNewWindow(resultMsg);
23 | }
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/normal/java/com/dvb/dvb_i/WebViewConfiguration.java:
--------------------------------------------------------------------------------
1 | package com.dvb.dvb_i;
2 |
3 | import android.annotation.SuppressLint;
4 | import android.content.Context;
5 | import android.os.Build;
6 | import android.os.Message;
7 | import android.util.Log;
8 | import android.webkit.CookieManager;
9 | import android.webkit.WebSettings;
10 | import android.webkit.WebView;
11 |
12 | public class WebViewConfiguration {
13 | private static final String TAG = WebViewConfiguration.class.getName();
14 |
15 | public static void setupWebviewForApplication(WebviewInterface webview, MainActivity activity) {
16 | if (!(webview instanceof LeanWebView)) {
17 | Log.e(TAG, "Expected webview to be of class LeanWebView and not " + webview.getClass().getName());
18 | return;
19 | }
20 |
21 | LeanWebView wv = (LeanWebView)webview;
22 |
23 | setupWebview(wv, activity);
24 |
25 | UrlNavigation urlNavigation = new UrlNavigation(activity);
26 | urlNavigation.setCurrentWebviewUrl(webview.getUrl());
27 |
28 | wv.setWebChromeClient(new WebChromeCustomClient(activity, urlNavigation));
29 | wv.setWebViewClient(new WebviewClient(activity, urlNavigation));
30 | WebView.setWebContentsDebuggingEnabled(true);
31 |
32 | wv.removeJavascriptInterface("android_interface");
33 | wv.addJavascriptInterface(activity.getAndroidJsInterface(), "android_interface");
34 |
35 | wv.getSettings().setUserAgentString("dvb-i-reference-application-" + Build.VERSION.SDK_INT);
36 |
37 | if (activity.getIntent().getBooleanExtra(MainActivity.EXTRA_WEBVIEW_WINDOW_OPEN, false)) {
38 | // send to other webview
39 | Message resultMsg = ((DvbiReferenceApplication)activity.getApplication()).getWebviewMessage();
40 | if (resultMsg != null) {
41 | WebView.WebViewTransport transport = (WebView.WebViewTransport)resultMsg.obj;
42 | if (transport != null) {
43 | transport.setWebView(wv);
44 | resultMsg.sendToTarget();
45 | }
46 | }
47 | }
48 | }
49 |
50 | @SuppressWarnings("deprecation")
51 | @SuppressLint("SetJavaScriptEnabled")
52 | public static void setupWebview(WebviewInterface webview, Context context) {
53 | if (!(webview instanceof LeanWebView)) {
54 | Log.e(TAG, "Expected webview to be of class LeanWebView and not " + webview.getClass().getName());
55 | return;
56 | }
57 |
58 | LeanWebView wv = (LeanWebView)webview;
59 | WebSettings webSettings = wv.getSettings();
60 |
61 | webSettings.setBuiltInZoomControls(false);
62 | webSettings.setDomStorageEnabled(true);
63 | webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
64 | webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
65 |
66 | webSettings.setDisplayZoomControls(false);
67 | webSettings.setLoadWithOverviewMode(true);
68 | webSettings.setUseWideViewPort(true);
69 |
70 | webSettings.setJavaScriptEnabled(true);
71 | webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
72 |
73 | webSettings.setMinimumFontSize(1);
74 | webSettings.setMinimumLogicalFontSize(1);
75 |
76 | webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
77 | CookieManager.getInstance().setAcceptThirdPartyCookies(wv, true);
78 |
79 | wv.setDrawingCacheEnabled(false);
80 | webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
81 |
82 | webSettings.setSaveFormData(false);
83 | webSettings.setSavePassword(false);
84 | webSettings.setUserAgentString("android");
85 | webSettings.setSupportMultipleWindows(true);
86 | webSettings.setGeolocationEnabled(false);
87 | webSettings.setMediaPlaybackRequiresUserGesture(false);
88 | webSettings.setAllowUniversalAccessFromFileURLs(true);
89 | }
90 |
91 | public static void removeCallbacks(LeanWebView webview) {
92 | webview.setWebViewClient(null);
93 | webview.setWebChromeClient(null);
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/normal/java/com/dvb/dvb_i/WebkitCookieManagerProxy.java:
--------------------------------------------------------------------------------
1 | package com.dvb.dvb_i;
2 |
3 | import java.io.IOException;
4 | import java.net.CookiePolicy;
5 | import java.net.CookieStore;
6 | import java.net.URI;
7 | import java.util.Arrays;
8 | import java.util.List;
9 | import java.util.Map;
10 |
11 | // this syncs cookies between webkit (webview) and java.net classes
12 | public class WebkitCookieManagerProxy extends java.net.CookieManager {
13 | private static final String TAG = WebkitCookieManagerProxy.class.getName();
14 | private android.webkit.CookieManager webkitCookieManager;
15 |
16 | public WebkitCookieManagerProxy()
17 | {
18 | this(null, null);
19 | }
20 |
21 | WebkitCookieManagerProxy(CookieStore store, CookiePolicy cookiePolicy)
22 | {
23 | super(null, cookiePolicy);
24 |
25 | this.webkitCookieManager = android.webkit.CookieManager.getInstance();
26 | }
27 |
28 | // java.net.CookieManager overrides
29 | @Override
30 | public void put(URI uri, Map> responseHeaders) throws IOException
31 | {
32 | // make sure our args are valid
33 | if ((uri == null) || (responseHeaders == null)) return;
34 |
35 | // go over the headers
36 | for (String headerKey : responseHeaders.keySet())
37 | {
38 | // ignore headers which aren't cookie related
39 | if ((headerKey == null) || !(headerKey.equalsIgnoreCase("Set-Cookie2") || headerKey.equalsIgnoreCase("Set-Cookie"))) continue;
40 |
41 | }
42 | }
43 |
44 | @Override
45 | public Map> get(URI uri, Map> requestHeaders) throws IOException
46 | {
47 | // make sure our args are valid
48 | if ((uri == null) || (requestHeaders == null)) throw new IllegalArgumentException("Argument is null");
49 |
50 | // save our url once
51 | String url = uri.toString();
52 |
53 | // prepare our response
54 | Map> res = new java.util.HashMap>();
55 |
56 | // get the cookie
57 | String cookie = this.webkitCookieManager.getCookie(url);
58 |
59 | // return it
60 | if (cookie != null) res.put("Cookie", Arrays.asList(cookie));
61 | return res;
62 | }
63 |
64 | @Override
65 | public CookieStore getCookieStore()
66 | {
67 | // we don't want anyone to work with this cookie store directly
68 | throw new UnsupportedOperationException();
69 | }
70 |
71 | }
72 |
--------------------------------------------------------------------------------
/frontend/android_apk/app/src/normal/java/com/dvb/dvb_i/WebviewClient.java:
--------------------------------------------------------------------------------
1 | package com.dvb.dvb_i;
2 |
3 | import android.annotation.TargetApi;
4 | import android.content.Context;
5 | import android.graphics.Bitmap;
6 | import android.graphics.Color;
7 | import android.net.http.SslError;
8 | import android.os.Build;
9 | import android.os.Message;
10 | import android.view.View;
11 | import android.webkit.ClientCertRequest;
12 | import android.webkit.SslErrorHandler;
13 | import android.webkit.WebResourceError;
14 | import android.webkit.WebResourceRequest;
15 | import android.webkit.WebResourceResponse;
16 | import android.webkit.WebView;
17 | import android.webkit.WebViewClient;
18 |
19 | import androidx.annotation.RequiresApi;
20 |
21 | public class WebviewClient extends WebViewClient{
22 | private static final String TAG = WebviewClient.class.getName();
23 | private UrlNavigation urlNavigation;
24 | private Context context;
25 |
26 | public WebviewClient(MainActivity mainActivity, UrlNavigation urlNavigation) {
27 | this.urlNavigation = urlNavigation;
28 | this.context = mainActivity;
29 | }
30 |
31 | @Override
32 | public boolean shouldOverrideUrlLoading(WebView view, String url) {
33 | return urlNavigation.shouldOverrideUrlLoading((WebviewInterface)view, url);
34 | }
35 |
36 | public boolean shouldOverrideUrlLoading(WebView view, String url, boolean isReload) {
37 | return urlNavigation.shouldOverrideUrlLoading((WebviewInterface)view, url, isReload);
38 | }
39 |
40 | @Override
41 | public void onPageStarted(WebView view, String url, Bitmap favicon) {
42 | super.onPageStarted(view, url, favicon);
43 | urlNavigation.onPageStarted(url);
44 | view.setBackgroundColor(Color.TRANSPARENT);
45 | view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
46 | }
47 |
48 | @Override
49 | public void onPageFinished(WebView view, String url) {
50 | super.onPageFinished(view, url);
51 | urlNavigation.onPageFinished((WebviewInterface)view, url);
52 | }
53 |
54 | @Override
55 | public void onFormResubmission(WebView view, Message dontResend, Message resend) {
56 | urlNavigation.onFormResubmission((WebviewInterface)view, dontResend, resend);
57 | }
58 |
59 | @Override
60 | public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
61 | urlNavigation.doUpdateVisitedHistory((WebviewInterface)view, url, isReload);
62 | }
63 |
64 | @Override
65 | public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
66 | urlNavigation.onReceivedError((WebviewInterface) view, errorCode, description, failingUrl);
67 | }
68 |
69 | @TargetApi(Build.VERSION_CODES.M)
70 | @Override
71 | public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
72 | urlNavigation.onReceivedError((WebviewInterface) view, error.getErrorCode(),
73 | error.getDescription().toString(), request.getUrl().toString());
74 | }
75 |
76 | @Override
77 | public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
78 | handler.cancel();
79 | urlNavigation.onReceivedSslError(error);
80 | }
81 |
82 | @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
83 | @Override
84 | public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) {
85 | urlNavigation.onReceivedClientCertRequest(view.getUrl(), request);
86 | }
87 |
88 | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
89 | @Override
90 | public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
91 | String method = request.getMethod();
92 | if (method == null || !method.equalsIgnoreCase("GET")) return null;
93 |
94 | android.net.Uri uri = request.getUrl();
95 | if (uri == null || !uri.getScheme().startsWith("http")) return null;
96 |
97 | return shouldInterceptRequest(view, uri.toString());
98 | }
99 |
100 |
101 |
102 | }
103 |
--------------------------------------------------------------------------------
/frontend/android_apk/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 | buildscript {
3 | repositories {
4 | google()
5 | mavenCentral()
6 | }
7 | dependencies {
8 | classpath 'com.android.tools.build:gradle:8.5.0'
9 | classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21'
10 | classpath 'com.google.gms:google-services:4.3.10'
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | mavenCentral()
18 | flatDir {
19 | dirs 'libs'
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/frontend/android_apk/constants.gradle:
--------------------------------------------------------------------------------
1 | project.ext {
2 | jetpackVersion = '1.0.0'
3 | }
4 |
--------------------------------------------------------------------------------
/frontend/android_apk/generate-header-images.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | BASEDIR=$(dirname $0)
4 |
5 | sips --resampleHeight 36 -s format png --out $BASEDIR/app/src/main/res/drawable-mdpi/ic_actionbar.png $BASEDIR/HeaderImage 2>&1
6 | sips --resampleHeight 54 -s format png --out $BASEDIR/app/src/main/res/drawable-hdpi/ic_actionbar.png $BASEDIR/HeaderImage 2>&1
7 | sips --resampleHeight 72 -s format png --out $BASEDIR/app/src/main/res/drawable-xhdpi/ic_actionbar.png $BASEDIR/HeaderImage 2>&1
8 | sips --resampleHeight 108 -s format png --out $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_actionbar.png $BASEDIR/HeaderImage 2>&1
9 | sips --resampleHeight 144 -s format png --out $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_actionbar.png $BASEDIR/HeaderImage 2>&1
10 |
11 | optipng $BASEDIR/app/src/main/res/drawable-mdpi/ic_actionbar.png 2>&1
12 | optipng $BASEDIR/app/src/main/res/drawable-hdpi/ic_actionbar.png 2>&1
13 | optipng $BASEDIR/app/src/main/res/drawable-xhdpi/ic_actionbar.png 2>&1
14 | optipng $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_actionbar.png 2>&1
15 | optipng $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_actionbar.png 2>&1
16 |
--------------------------------------------------------------------------------
/frontend/android_apk/generate-tinted-icons.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | set -e
3 |
4 | DARK_ICONS=(
5 | ic_refresh_white_24dp.png
6 | ic_search_white_24dp.png
7 | ic_share_white_24dp.png
8 | )
9 |
10 | LIGHT_ICONS=(
11 | ic_refresh_black_24dp.png
12 | ic_search_black_24dp.png
13 | ic_share_black_24dp.png
14 | )
15 |
16 | DARK_DEFAULT_COLOR=ffffff
17 | LIGHT_DEFAULT_COLOR=000000
18 |
19 | BASEDIR=$(dirname $0)
20 |
21 | function showHelp {
22 | echo "Usage: $0 (dark|light) tintColor"
23 | echo "Example: $0 light 0000ff"
24 | exit 1
25 |
26 | }
27 |
28 | if [[ $# -ne 2 ]]; then
29 | showHelp
30 | fi
31 |
32 | theme=`echo $1 | tr '[:upper:]' '[:lower:]'`
33 | tintColor=`echo $2 | tr '[:upper:]' '[:lower:]'`
34 |
35 | if [[ $theme = light ]]; then
36 | icons=("${LIGHT_ICONS[@]}")
37 | defaultColor=$LIGHT_DEFAULT_COLOR
38 | elif [[ $theme = dark ]]; then
39 | icons=("${DARK_ICONS[@]}")
40 | defaultColor=$DARK_DEFAULT_COLOR
41 | else
42 | showHelp
43 | fi
44 |
45 | if [[ ${#tintColor} -ne 6 ]]; then
46 | showHelp
47 | fi
48 |
49 | if [[ $tintColor = $defaultColor ]]; then
50 | echo "Requested color $tintColor is same as default for theme. Exiting."
51 | exit
52 | fi
53 |
54 | for drawable in `ls -d $BASEDIR/app/src/main/res/drawable*`; do
55 | for file in "${icons[@]}"; do
56 | filePath=$drawable/$file
57 | if [[ -s "$filePath" ]]; then
58 | echo Tinting $filePath
59 | convert $filePath -fill "#$tintColor" -colorize 100% $filePath
60 | optipng $filePath
61 | fi
62 | done
63 | done
64 |
--------------------------------------------------------------------------------
/frontend/android_apk/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 | android.defaults.buildfeatures.buildconfig=true
5 | android.nonTransitiveRClass=false
6 | android.nonFinalResIds=false
--------------------------------------------------------------------------------
/frontend/android_apk/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/android_apk/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/frontend/android_apk/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Thu Feb 22 15:59:16 EET 2024
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
5 | zipStoreBase=GRADLE_USER_HOME
6 | zipStorePath=wrapper/dists
7 |
--------------------------------------------------------------------------------
/frontend/android_apk/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/frontend/android_apk/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------
/frontend/configuration.js:
--------------------------------------------------------------------------------
1 | // DVB-I Reference installation location -- also backend/configuration.php
2 | var INSTALL_LOCATION = "https://dvb-i-reference.dvb.org/client";
3 |
4 | // set to true to include channels that are not included in the selected LCN table.
5 | var INCLUDE_NON_LCN_CHANNELS = false;
6 |
--------------------------------------------------------------------------------
/frontend/hbbtv/CommonUI/bg_boxitem_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/CommonUI/bg_boxitem_image.png
--------------------------------------------------------------------------------
/frontend/hbbtv/CommonUI/bg_boxitem_info.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/CommonUI/bg_boxitem_info.png
--------------------------------------------------------------------------------
/frontend/hbbtv/CommonUI/bg_channel_info.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/CommonUI/bg_channel_info.png
--------------------------------------------------------------------------------
/frontend/hbbtv/CommonUI/bg_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/CommonUI/bg_menu.png
--------------------------------------------------------------------------------
/frontend/hbbtv/CommonUI/dialog_checkmark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/CommonUI/dialog_checkmark.png
--------------------------------------------------------------------------------
/frontend/hbbtv/CommonUI/empty.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/CommonUI/empty.png
--------------------------------------------------------------------------------
/frontend/hbbtv/CommonUI/icons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/CommonUI/icons.png
--------------------------------------------------------------------------------
/frontend/hbbtv/CommonUI/loading_anim.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/CommonUI/loading_anim.png
--------------------------------------------------------------------------------
/frontend/hbbtv/CommonUI/lock_green.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/CommonUI/lock_green.png
--------------------------------------------------------------------------------
/frontend/hbbtv/CommonUI/lock_red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/CommonUI/lock_red.png
--------------------------------------------------------------------------------
/frontend/hbbtv/CommonUI/logo_dvbi_sofia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/CommonUI/logo_dvbi_sofia.png
--------------------------------------------------------------------------------
/frontend/hbbtv/CommonUI/menu_arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/CommonUI/menu_arrow.png
--------------------------------------------------------------------------------
/frontend/hbbtv/CommonUI/rating.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/CommonUI/rating.png
--------------------------------------------------------------------------------
/frontend/hbbtv/epg/images/bg_plain.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/epg/images/bg_plain.png
--------------------------------------------------------------------------------
/frontend/hbbtv/epg/images/bg_program_focused.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/epg/images/bg_program_focused.png
--------------------------------------------------------------------------------
/frontend/hbbtv/epg/images/bg_timeline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/epg/images/bg_timeline.png
--------------------------------------------------------------------------------
/frontend/hbbtv/epg/images/bg_verticalTimeLineContainer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/epg/images/bg_verticalTimeLineContainer.png
--------------------------------------------------------------------------------
/frontend/hbbtv/epg/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/epg/images/logo.png
--------------------------------------------------------------------------------
/frontend/hbbtv/epg/images/up_down_arrows_epg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/epg/images/up_down_arrows_epg.png
--------------------------------------------------------------------------------
/frontend/hbbtv/epg/scripts.js:
--------------------------------------------------------------------------------
1 | Element.prototype.lastProgram = function () {
2 | for (var i = this.childNodes.length - 1; i >= 0; i--) {
3 | if (this.childNodes[i].hasClass("program")) {
4 | return this.childNodes[i];
5 | }
6 | }
7 | return null;
8 | };
9 |
10 | Element.prototype.firstProgram = function () {
11 | var firstprogram = null;
12 | for (var i = 0; i < this.childNodes.length; i++) {
13 | if (this.childNodes[i].hasClass("program")) {
14 | firstprogram = this.childNodes[i];
15 | break;
16 | }
17 | }
18 | return firstprogram;
19 | };
20 |
21 | function htmlDecode(value) {
22 | return $("").html(value).text();
23 | }
24 | function loadJSON(url, callback) {
25 | try {
26 | var xmlhttp = new XMLHttpRequest();
27 | xmlhttp.overrideMimeType("application/json");
28 | xmlhttp.open("GET", url, true);
29 | xmlhttp.onreadystatechange = function () {
30 | if (this.readyState == 4) {
31 | if (this.status == "200") {
32 | callback(this.responseText);
33 | } else {
34 | setLoading(false);
35 | }
36 | }
37 | };
38 | xmlhttp.send(null);
39 | } catch (e) {
40 | setLoading(false);
41 | console.log(e);
42 | }
43 | }
44 |
45 | function getProgramById(id) {
46 | for (var channel in epgdict) {
47 | for (var program in epgdict[channel]) {
48 | if (epgdict[channel][program]["id"].toString() == id.toString()) {
49 | return epgdict[channel][program];
50 | }
51 | }
52 | }
53 | return null;
54 | }
55 |
56 | function dateObjectToString(dateobj) {
57 | var str = "";
58 | str += dateobj.getFullYear() + "-";
59 | str += addZeroPrefix(Number(dateobj.getMonth() + 1)) + "-";
60 | str += addZeroPrefix(dateobj.getDate()) + "T";
61 | str += addZeroPrefix(dateobj.getHours()) + ":";
62 | str += addZeroPrefix(dateobj.getMinutes()) + ":";
63 | str += addZeroPrefix(dateobj.getSeconds());
64 | return str;
65 | }
66 |
67 | function focusProgram(programID) {
68 | var programs = document.getElementsByClassName("program");
69 | for (var i = 0; i < programs.length; i++) {
70 | if (programs[i].getAttribute("data-programid") == programID) {
71 | if (focusElement(programs[i])) {
72 | scrollFocusToCenter();
73 | return true;
74 | }
75 | }
76 | }
77 | return false;
78 | }
79 |
80 | function setLoading(load) {
81 | if (load) {
82 | document.getElementById("loading").removeClass("hide");
83 | document.getElementById("loading").addClass("show");
84 | } else {
85 | document.getElementById("loading").removeClass("show");
86 | document.getElementById("loading").addClass("hide");
87 | }
88 | loading = load;
89 | }
90 |
91 | function getElementByAttributeValue(elementArray, attributeName, attributeValue) {
92 | try {
93 | for (var i = 0; i < elementArray.length; i++) {
94 | if (elementArray[i].getAttribute(attributeName) == attributeValue) {
95 | return elementArray[i];
96 | }
97 | }
98 | return null;
99 | } catch (e) {
100 | console.log(e);
101 | }
102 | }
103 |
104 | function convertToDateObject(datestr) {
105 | if (datestr != null) {
106 | return new Date(
107 | datestr.substring(0, 4),
108 | Number(datestr.substring(5, 7)) - 1,
109 | datestr.substring(8, 10),
110 | datestr.substring(11, 13),
111 | datestr.substring(14, 16),
112 | datestr.substring(17, 19),
113 | 0
114 | );
115 | }
116 | return null;
117 | }
118 |
--------------------------------------------------------------------------------
/frontend/hbbtv/launcher/chinfo.css:
--------------------------------------------------------------------------------
1 | /* CSS Document */
2 | #chinfo {
3 | position: absolute;
4 | left: 0px;
5 | color: #FFF;
6 | font-size: 22px;
7 | line-height: 1;
8 |
9 | opacity: 1;
10 | -o-transition: all 0.3s;
11 | -moz-transition: all 0.3s;
12 | -webkit-transition: all 0.3s;
13 | transition: all 0.3s;
14 |
15 | height: 140px;
16 | width: 1280px;
17 | top: 580px;
18 | /*
19 | background-image: url(../CommonUI/bg_buttonbar_player.png);
20 | background-repeat: repeat-x;
21 | */
22 | background-image: url(images/bg_chinfo.png);
23 | background-repeat: repeat-x;
24 | background-position: bottom;
25 |
26 | height: 720px;
27 | top: 0px;
28 | }
29 | #chinfo div {
30 | position: absolute;
31 | }
32 | #chinfo.hide {
33 | opacity: 0;
34 | display: block !important;
35 | }
36 | #chinfo_chname {
37 | top: 500px;
38 | left: 85px;
39 | font-size: 26px;
40 | color: #fff;
41 | }
42 | #chinfo_chnumber {
43 | top: 450px;
44 | left: 85px;
45 | color: #0090f1;
46 | font-size: 48px;
47 | text-align: left;
48 | width: 200px;
49 | }
50 | #chinfo_chicon {
51 | left: 85px;
52 | top: 360px;
53 | height: 80px;
54 | line-height: 80px;
55 | display: flex;
56 | align-items: center;
57 | justify-content: center;
58 | }
59 | #chinfo_chicon img {
60 |
61 | }
62 | #chinfo_now {
63 | left: 90px;
64 | top: 580px;
65 | height: 80px;
66 | }
67 |
68 |
69 | #chinfo_starttime {
70 | top: 50px;
71 | left: 200px;
72 | font-size: 18px;
73 | }
74 |
75 | #chinfo_endtime {
76 | top: 50px;
77 | left: 410px;
78 | font-size: 18px;
79 | }
80 | /* progressbar */
81 | #chinfo_progressbar {
82 | top: 65px;
83 | height: 5px;
84 | left: 150px;
85 | width: 130px;
86 | border-radius: 1px;
87 | overflow: hidden;
88 | }
89 | #chinfo_progressbarbg {
90 | top: 0px;
91 | left: 0px;
92 | background-color: rgba(0,0,0,0.8);
93 | width: 100%;
94 | height: 5px;
95 | }
96 | #chinfo_progressbarTime {
97 | background-color: #0098f4;
98 | height: 5px;
99 | top: 0px;
100 | left: 0px;
101 | }
102 | /* next program */
103 | #chinfo_next {
104 | left: 640px;
105 | top: 580px;
106 | height: 80px;
107 | }
108 | #chinfo_next > div {
109 | color: #BBBBBB;
110 | }
111 | #chinfo_now_header,
112 | #chinfo_next_header {
113 | left: 0px;
114 | font-size: 32px;
115 | text-align: left;
116 | width: 70px;
117 | color: rgba(233,233,233,0.5) !important;
118 | width: 500px;
119 | white-space: nowrap;
120 | margin-top: -30px;
121 | }
122 | #chinfo_now_title,
123 | #chinfo_next_title {
124 | left: 150px;
125 | overflow: hidden;
126 | white-space: nowrap;
127 | width: 400px;
128 | text-overflow: ellipsis;
129 | height: 30px;
130 | line-height: 30px;
131 | font-size: 24px;
132 | text-shadow: 0px 0px 5px #000;
133 | }
134 | #chinfo_now_starttime,
135 | #chinfo_next_starttime {
136 | left: 150px;
137 | font-size: 18px;
138 | top: 35px;
139 | width: 150px;
140 | text-shadow: 0px 0px 5px #000;
141 |
142 | }
143 | #chinfo_now_endtime,
144 | #chinfo_next_endtime {
145 | left: 215px;
146 | font-size: 18px;
147 | top: 35px;
148 | text-shadow: 0px 0px 5px #000;
149 |
150 | }
151 |
152 | #chinfo_next_image,
153 | #chinfo_now_image {
154 | left: 0px;
155 | top: 0px;
156 | height: 80px;
157 | width: 140px;
158 | background-color: #000;
159 | text-align: center;
160 | line-height: 80px;
161 | }
162 | #chinfo_next_image img,
163 | #chinfo_now_image img{
164 | height: 100%;
165 | object-fit: contain;
166 | max-width: 140px;
167 | }
168 | #chinfo_logo {
169 | position: absolute;
170 | top: 50px;
171 | left: 90px;
172 | }
173 |
174 | #list_logo {
175 | width: 180px;
176 | }
177 |
178 | #chinfo_next_protected,#chinfo_now_protected {
179 | top:34px;
180 | left: 270px;
181 | }
182 |
--------------------------------------------------------------------------------
/frontend/hbbtv/launcher/images/bg_chinfo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/launcher/images/bg_chinfo.png
--------------------------------------------------------------------------------
/frontend/hbbtv/launcher/images/logo_dvb-i.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DVBProject/DVB-I-Reference-Client/6788c049b841b2fb84a49d4871604e797f3fa1c3/frontend/hbbtv/launcher/images/logo_dvb-i.png
--------------------------------------------------------------------------------
/frontend/hbbtv/launcher/program.js:
--------------------------------------------------------------------------------
1 | /********* Program ***********/
2 | function Program(programdata, element_id, channelObject) {
3 | this.element_id = element_id;
4 | this.init(programdata);
5 | this.visible = false;
6 | this.scrollStartTimeout = null;
7 | this.timeouts = [];
8 |
9 | this.getChannel = function () {
10 | return channelObject;
11 | };
12 | }
13 |
14 | Program.prototype.init = function (programdata) {
15 | for (var field in programdata) {
16 | this[field] = programdata[field];
17 | }
18 | if (this.start && this.end) {
19 | this.start_date_obj = this.start;
20 | this.end_date_obj = this.end;
21 | }
22 | };
23 |
24 | Program.prototype.getTitle = function () {
25 | if (this.titles.length == 1) {
26 | return this.titles[0].text;
27 | } else if (this.titles.length > 1) {
28 | var defaultTitle = null;
29 | for (var i = 0; i < this.titles.length; i++) {
30 | if (this.titles[i].type == "main" && this.titles[i].lang == languages.ui_language) {
31 | return this.titles[i].text;
32 | } else if (this.titles[i].type == "main" && this.titles[i].lang == "default") {
33 | defaultTitle = this.titles[i].text;
34 | }
35 | }
36 | if (defaultTitle != null) {
37 | return defaultTitle;
38 | } else {
39 | return this.titles[0].text;
40 | }
41 | }
42 | return "";
43 | };
44 |
45 | Program.prototype.getLongDescription = function () {
46 | var defaultDesc = null;
47 | for (var i = 0; i < this.descriptions.length; i++) {
48 | if (this.descriptions[i].lang == languages.ui_language && this.descriptions[i].textLength == "long") {
49 | return this.descriptions[i].text;
50 | } else if (this.descriptions[i].lang == "default" && this.descriptions[i].textLength == "long") {
51 | defaultDesc = this.descriptions[i].text;
52 | }
53 | }
54 | if (defaultDesc != null) {
55 | return defaultDesc;
56 | }
57 | return null;
58 | };
59 |
60 | Program.prototype.getDescription = function () {
61 | if (this.descriptions.length == 1) {
62 | return this.descriptions[0].text;
63 | } else if (this.descriptions.length > 1) {
64 | var defaultDesc = null;
65 | for (var i = 0; i < this.descriptions.length; i++) {
66 | if (this.descriptions[i].lang == languages.ui_language) {
67 | return this.descriptions[i].text;
68 | } else if (this.descriptions[i].lang == "default") {
69 | defaultDesc = this.descriptions[i].text;
70 | }
71 | }
72 | if (defaultDesc != null) {
73 | return defaultDesc;
74 | } else {
75 | return this.descriptions[0].text;
76 | }
77 | }
78 | return "No description";
79 | };
80 |
--------------------------------------------------------------------------------
/frontend/hbbtv/opapp.aitx:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 | DVB-I Reference Application
10 |
11 | 123
12 | 456
13 |
14 |
15 |
16 | application/vnd.hbbtv.opapp.pkg
17 |
18 | AUTOSTART
19 | VISIBLE_ALL
20 | false
21 | 1
22 | 1
23 |
24 | 0
25 | 1
26 | 3
27 | 1
28 |
29 | 8
30 |
31 |
32 | urn:hbbtv:opapp:privileged:2017
33 |
34 |
35 | https://operator.example.com/
36 |
37 | dvb-i-reference-application/frontend/hbbtv/opapp.pkg
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/frontend/i18n/i18n.js:
--------------------------------------------------------------------------------
1 | function I18n() {
2 | this.languages = [
3 | { lang: "en", name: "English" },
4 | { lang: "zh", name: "Chinese" },
5 | { lang: "de", name: "German" },
6 | { lang: "fi", name: "Suomi" },
7 | { lang: "it", name: "Italian" },
8 | ];
9 | this.languageData = null;
10 | this.currentLanguage = null;
11 | this.texts = [
12 | "epg_button",
13 | "settings_button",
14 | "subtitle_button",
15 | "audio_button",
16 | "settings_title",
17 | "close_button",
18 | "pause_button",
19 | "play_button",
20 | "epg_page_title",
21 | "tune_to_channel",
22 | "stats_video_resolution",
23 | "stats_video_bitrate",
24 | "stats_audio_bitrate",
25 | "stats_latency",
26 | "stats_settings",
27 | "minutes_abbreviation",
28 | "minimum_age_label",
29 | "rating_label",
30 | "reason_label",
31 | "more_episodes_label",
32 | "sl_select_page",
33 | "select_sl",
34 | "select_nip",
35 | "select_region",
36 | "default_region",
37 | "registry_provider",
38 | "slrquery_params_title",
39 | "slrquery_params_serverside_filtering",
40 | "slrquery_postcode_field",
41 | "slrquery_postcode_examples",
42 | "slrquery_postcode_examples_note",
43 | "slrquery_postcode_query",
44 | "slrquery_provider_field",
45 | "slrquery_language_field",
46 | "slrquery_genre_field",
47 | "slrquery_country_field",
48 | "slrquery_regulator_field",
49 | "slrquery_multi_vals",
50 | "slrquery_filter_button",
51 | "settings_menu_latency",
52 | "settings_menu_parental",
53 | "settings_menu_language",
54 | "settings_menu_servicelist",
55 | "settings_menu_streaminfo",
56 | "low_latency_settings_page",
57 | "ll_mode",
58 | "ll_target",
59 | "ll_min_drift",
60 | "ll_catchup_rate",
61 | "parental_settings_page",
62 | "parental_block_enabled",
63 | "parental_min_age",
64 | "parental_pin",
65 | "parental_pin_reenter",
66 | "language_settings_page",
67 | "language_setting_subtitle",
68 | "language_setting_audio",
69 | "language_setting_accessible_audio",
70 | "language_setting_ui",
71 | "request_region",
72 | "region_select_postcode",
73 | "region_filter_button",
74 | "label_keywords",
75 | "label_none",
76 | "prod_co",
77 | "presenter",
78 | "actor",
79 | "genre_movie",
80 | "genre_news",
81 | "genre_game",
82 | "genre_sports",
83 | "genre_childrens",
84 | "genre_music",
85 | "genre_arts",
86 | "genre_social",
87 | "genre_education",
88 | "genre_leisure",
89 | "genre_special",
90 | "genre_adult",
91 | ];
92 | }
93 |
94 | I18n.prototype.getSupportedLanguages = function () {
95 | return this.languages;
96 | };
97 |
98 | I18n.prototype.loadLanguage = function (language, callback) {
99 | var found = false;
100 | for (var i = 0; i < this.languages.length; i++) {
101 | if (this.languages[i].lang == language) {
102 | found = true;
103 | break;
104 | }
105 | }
106 | if (!found) {
107 | return false;
108 | }
109 | var jsFileLocation = $("script[src*=i18n]").attr("src"); // the js file path
110 | jsFileLocation = jsFileLocation.replace("i18n.js", "");
111 | console.log(language);
112 | var self = this;
113 | this.currentLanguage = language;
114 | $.get(
115 | jsFileLocation + language + ".json",
116 | function (data) {
117 | self.languageData = data;
118 | if (typeof callback == "function") {
119 | callback.call();
120 | }
121 | },
122 | "json"
123 | );
124 | return true;
125 | };
126 |
127 | I18n.prototype.getString = function (key) {
128 | if (this.languageData == null) {
129 | return null;
130 | }
131 | return this.languageData[key];
132 | };
133 |
134 | I18n.prototype.getLanguageName = function (lang) {
135 | if (this.languageData == null) {
136 | return lang;
137 | }
138 | let langStr = this.languageData[`lang_${lang.toLowerCase()}`];
139 | return langStr ? langStr : lang;
140 | };
141 |
142 | I18n.prototype.getCurrentLanguage = function () {
143 | return this.currentLanguage;
144 | };
145 |
--------------------------------------------------------------------------------
/frontend/i18n/zh.json:
--------------------------------------------------------------------------------
1 | {
2 | "settings_button": "设定",
3 | "parental_block": "被父母控制阻止",
4 | "epg_button": "节目指南",
5 | "subtitle_button": "字幕",
6 | "audio_button": "声音的",
7 | "close_button": "关闭",
8 | "pause_button": "暂停",
9 | "play_button": "播放",
10 | "epg_page_title": "节目单",
11 | "tune_to_channel": "调到频道",
12 | "stats_video_resolution": "视频分辨率",
13 | "stats_video_bitrate": "视频比特率",
14 | "stats_audio_bitrate": "音频比特率",
15 | "stats_latency": "延迟",
16 | "stats_settings": "设置",
17 | "minutes_abbreviation": "分钟",
18 | "minimum_age_label": "最低年龄",
19 | "rating_label": "评分",
20 | "reason_label": "原因",
21 | "more_episodes_label": "更多剧集",
22 | "sl_select_page": "服务列表选择",
23 | "select_sl": "选择服务列表",
24 | "select_region": "选择地区",
25 | "default_region": "默认",
26 | "registry_provider": "注册提供商",
27 | "slrquery_params_title": "過濾服務清單",
28 | "slrquery_params_serverside_filtering": "伺服器端篩選所選服務清單",
29 | "slrquery_postcode_field": "用嚟篩選伺服器端嘅郵遞區號",
30 | "slrquery_postcode_examples": "「 DVB / 地區清單」嘅郵遞區號例子:",
31 | "slrquery_postcode_examples_note": "注意:伺服器端篩選最適合用喺「 DVB/區域清單」服務清單",
32 | "slrquery_postcode_query": "查詢參數加咗去服務清單網址:",
33 | "slrquery_provider_field": "提供者",
34 | "slrquery_language_field": "语",
35 | "slrquery_genre_field": "类型",
36 | "slrquery_country_field": "国家",
37 | "slrquery_regulator_field": "监管者名单",
38 | "slrquery_multi_vals": "多个值可以用逗号分隔",
39 | "slrquery_filter_button": "询问",
40 | "settings_menu_latency": "低延迟设置",
41 | "settings_menu_parental": "家长设置",
42 | "settings_menu_language": "语言设定 (Language)",
43 | "settings_menu_servicelist": "选择服务列表",
44 | "settings_menu_streaminfo": "显示流信息",
45 | "low_latency_settings_page": "低延迟设置",
46 | "ll_mode": "低延迟模式",
47 | "ll_target": "目标延迟",
48 | "ll_min_drift": "最小漂移(秒)",
49 | "ll_catchup_rate": "追赶播放率(%)",
50 | "parental_settings_page": "家长设置",
51 | "parental_block_enabled": "启用家长屏蔽",
52 | "parental_min_age": "最低年龄",
53 | "parental_pin": "家长密码",
54 | "parental_pin_reenter": "重新输入家长密码",
55 | "language_settings_page": "语言设定",
56 | "language_setting_subtitle": "字幕语言 (subtitle)",
57 | "language_setting_audio": "音频语言 (audio)",
58 | "language_setting_accessible_audio": "无障碍音频 (accessible audio)",
59 | "language_setting_ui": "界面语言 (UI)",
60 | "request_region": "区域选择",
61 | "region_select_postcode": "邮政编码",
62 | "region_filter_button": "询问",
63 | "label_keywords": "关键词",
64 | "label_none": "没有任何",
65 |
66 | "prod_co": "制作公司",
67 | "presenter": "主持人",
68 | "actor": "主持人",
69 |
70 | "genre_movie": "电影/戏剧",
71 | "genre_news": "新闻/时事",
72 | "genre_game": "节目/游戏节目",
73 | "genre_sports": "运动的",
74 | "genre_childrens": "儿童/青少年节目",
75 | "genre_music": "音乐/芭蕾/舞蹈",
76 | "genre_arts": "艺术/文化",
77 | "genre_social": "社会/政治问题/经济",
78 | "genre_education": "教育/科学/事实主题",
79 | "genre_leisure": "休闲爱好",
80 | "genre_special": "特色",
81 | "genre_adult": "成人",
82 |
83 | "subtitle_purpose_translation": "翻译",
84 | "subtitle_purpose_hard_of_hearing": "很难听清",
85 | "subtitle_purpose_audio_description": "音频描述",
86 | "subtitle_purpose_commentary": "评论",
87 | "subtitle_purpose_forced_narrative": "强迫叙述",
88 |
89 | "lang_eng": "英语",
90 | "lang_fra": "法语",
91 | "lang_esp": "西班牙语",
92 | "lang_deu": "德语",
93 | "lang_fin": "芬兰",
94 | "lang_ita": "意大利语",
95 | "lang_zhn": "普通话",
96 | "lang_swe": "瑞典",
97 | "lang_nld": "荷兰语",
98 |
99 | "textMagnification": "文字放大",
100 | "magnifierGlass": "放大镜",
101 | "screenZoom": "屏幕缩放",
102 | "largeLayout": "大布局",
103 | "monochrome": "单色",
104 | "maleVoice": "男声",
105 | "femaleVoice": "女声",
106 | "configurableVerbosity": "可配置的详细程度",
107 | "speed": "速度",
108 | "audio": "声音的",
109 | "visual": "视觉的",
110 | "haptic": "触觉"
111 | }
112 |
--------------------------------------------------------------------------------
/frontend/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | DVB-I Reference Application
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |

27 |
28 |
29 |
30 |
31 |
32 |
Welcome to DVB-I Reference Application
33 |
Frontend:
34 |
39 |
Backend:
40 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/frontend/isoduration.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Edited from ISO8601-duration from https://github.com/tolu/ISO8601-duration
3 | * under MIT licence
4 | */
5 |
6 | // PnYnMnDTnHnMnS
7 | var numbers = "\\d+(?:[\\.,]\\d{0,3})?";
8 | var weekPattern = "(" + numbers + "W)";
9 | var datePattern = "(" + numbers + "Y)?(" + numbers + "M)?(" + numbers + "D)?";
10 | var timePattern = "T(" + numbers + "H)?(" + numbers + "M)?(" + numbers + "S)?";
11 |
12 | var iso8601 = "P(?:" + weekPattern + "|" + datePattern + "(?:" + timePattern + ")?)";
13 | var objMap = ["weeks", "years", "months", "days", "hours", "minutes", "seconds"];
14 |
15 | /**
16 | * The ISO8601 regex for matching / testing durations
17 | */
18 | var pattern = new RegExp(iso8601);
19 | /** Parse PnYnMnDTnHnMnS format to object
20 | * @param {string} durationString - PnYnMnDTnHnMnS formatted string
21 | * @return {Object} - With a property for each part of the pattern
22 | */
23 | function parseISO8601(durationString) {
24 | // Slice away first entry in match-array
25 | return durationString
26 | .match(pattern)
27 | .slice(1)
28 | .reduce(function (prev, next, idx) {
29 | prev[objMap[idx]] = parseFloat(next) || 0;
30 | return prev;
31 | }, {});
32 | }
33 |
34 | /**
35 | * Convert ISO8601 duration object to an end Date.
36 | *
37 | * @param {Object} duration - The duration object
38 | * @param {Date} startDate - The starting Date for calculating the duration
39 | * @return {Date} - The resulting end Date
40 | */
41 | function iso6801end(durationString, startDate) {
42 | var duration = parseISO8601(durationString);
43 | // Create two equal timestamps, add duration to 'then' and return time difference
44 | var timestamp = startDate ? startDate.getTime() : Date.now();
45 | var then = new Date(timestamp);
46 |
47 | then.setFullYear(then.getFullYear() + duration.years);
48 | then.setMonth(then.getMonth() + duration.months);
49 | then.setDate(then.getDate() + duration.days);
50 | then.setHours(then.getHours() + duration.hours);
51 | then.setMinutes(then.getMinutes() + duration.minutes);
52 | // Then.setSeconds(then.getSeconds() + duration.seconds);
53 | then.setMilliseconds(then.getMilliseconds() + duration.seconds * 1000);
54 | // Special case weeks
55 | then.setDate(then.getDate() + duration.weeks * 7);
56 |
57 | return then;
58 | }
59 |
60 | /**
61 | * Convert ISO8601 duration object to seconds
62 | *
63 | * @param {Object} duration - The duration object
64 | * @param {Date} startDate - The starting point for calculating the duration
65 | * @return {Number}
66 | */
67 | var iso6801toSeconds = function toSeconds(durationString, startDate) {
68 | var duration = parseISO8601(durationString);
69 | var timestamp = startDate ? startDate.getTime() : Date.now();
70 | var now = new Date(timestamp);
71 | var then = end(duration, startDate);
72 |
73 | var seconds = (then.getTime() - now.getTime()) / 1000;
74 | return seconds;
75 | };
76 |
--------------------------------------------------------------------------------
/frontend/network.js:
--------------------------------------------------------------------------------
1 | function NetworkRequest(url, settings) {
2 | // settings.accepts= { mycustomtype: "application/vnd.dvb.dvbi.r6" },
3 |
4 | settings.beforeSend = function (req) {
5 | // Chrome:: Refused to set unsafe header "User-Agent"
6 | // req.setRequestHeader("User-Agent", "DVB-I/A177r6");
7 | req.setRequestHeader("Accept", "text/plain, */*, application/vnd.dvb.dvbi.r6");
8 | };
9 |
10 | settings.url = url;
11 | return $.ajax(settings);
12 | }
13 |
--------------------------------------------------------------------------------
/identifiers.js:
--------------------------------------------------------------------------------
1 | var TVA_HowRelated_href = "urn:tva:metadata:cs:HowRelatedCS:2012";
2 | var DVBi_HowRelated_href = "urn:dvb:metadata:cs:HowRelatedCS:2021";
3 |
4 | var DVBi_LinkedApplication_CS = "urn:dvb:metadata:cs:LinkedApplicationCS:2019";
5 |
6 | var DVB_Content_Subject_CS = "urn:dvb:metadata:cs:ContentSubject:2019";
7 |
8 | var TVA_Promotional_Still_Image = TVA_HowRelated_href + ":19";
9 |
10 | var DVBi_Out_Of_Service_Logo = DVBi_HowRelated_href + ":1000.1";
11 | var DVBi_Service_List_Logo = DVBi_HowRelated_href + ":1001.1";
12 | var DVBi_Service_Logo = DVBi_HowRelated_href + ":1001.2";
13 | var DVBi_Content_Guide_Logo = DVBi_HowRelated_href + ":1002.1";
14 |
15 | var DVBi_App_In_Parallel = DVBi_LinkedApplication_CS + ":1.1";
16 | var DVBi_App_Controlling_Media = DVBi_LinkedApplication_CS + ":1.2";
17 |
18 | var AIT_MIME = "application/vnd.dvb.ait+xml";
19 | var DASH_MIME = "application/dash+xml";
20 | var XML_MIME = "text/xml";
21 | var XHTML_MIME = "application/xhtml+xml";
22 |
23 | var JPEG_MIME = "image/jpg";
24 | var PNG_MIME = "image/png";
25 |
26 | var SouceTypes = "urn:dvb:metadata:source";
27 | var SOURCE_DVB_C = SouceTypes + ":dvb-c";
28 | var SOURCE_DVB_S = SouceTypes + ":dvb-s";
29 | var SOURCE_DVB_T = SouceTypes + ":dvb-t";
30 | var SOURCE_DVB_DASH = SouceTypes + ":dvb-dash";
31 | var SOURCE_DVB_IPTV = SouceTypes + ":dvb-iptv";
32 | var SOURCE_DVB_APPLICATION = SouceTypes + ":application";
33 |
34 | var TVA_Schema = "urn:tva:metadata:2024";
35 | var DVBi_Service_Discovery_Types_Schema = "urn:dvb:metadata:servicediscovery-types:2023";
36 | var DVBi_Service_List_Discovery_Schema = "urn:dvb:metadata:servicelistdiscovery:2024";
37 | var DVBi_Service_Discovery_Schema = "urn:dvb:metadata:servicediscovery:2024";
38 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | DVB-I Reference Application
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |

27 |
28 |
29 |
30 |
31 |
32 |
Welcome to DVB-I Reference Application
33 |
Frontend:
34 |
39 |
Backend:
40 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/linked_applications/android_drm_widevine.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Widevine DRM
6 |
7 |
8 |
23 |
24 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/linked_applications/hbbtv_playready.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | HbbTV playready linked applicationn
5 |
6 |
7 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/linked_applications/hbbtv_playready_aitx.php:
--------------------------------------------------------------------------------
1 | \n";
7 |
8 | $str = <<
10 |
11 |
12 |
13 | Playready DRM
14 |
15 | 7
16 | 1
17 |
18 |
19 |
20 | application/vnd.hbbtv.xhtml+xml
21 |
22 | AUTOSTART
23 | VISIBLE_ALL
24 | false
25 | 5
26 | 00
27 |
28 | 0
29 | 1
30 | 4
31 | 1
32 |
33 |
34 |
35 | $install_location/linked_applications/
36 |
37 | hbbtv_playready.html
38 |
39 |
40 |
41 |
42 | EOD;
43 | echo $str;
44 | ?>
--------------------------------------------------------------------------------
/namespaces.js:
--------------------------------------------------------------------------------
1 | // used for use with getElementsByTagNameNS() to effectively ignore namespace tags
2 |
3 | var MPEG7_ns = "*"; /* "urn:tva:mpeg7:2008" */
4 | var TVA_ns = "*"; /* "urn:tva:metadata:2024" */
5 | var DVBi_TYPES_ns = "*"; /* "urn:dvb:metadata:servicediscovery-types:2023" */
6 | var DVBi_ns = "*"; /* "urn:dvb:metadata:servicediscovery:2024" */
7 |
--------------------------------------------------------------------------------
/opapp_package.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const archiver = require("archiver");
3 |
4 | const output = fs.createWriteStream("opapp.pkg");
5 | var archive = archiver("zip");
6 |
7 | output.on("close", function () {
8 | console.log("opapp.pkg generated successfully");
9 | });
10 |
11 | archive.on("error", function (err) {
12 | throw err;
13 | });
14 |
15 | archive.pipe(output);
16 |
17 | // append files from a sub-directory, putting its contents at the root of archive
18 | archive.directory("frontend/hbbtv/", false);
19 | archive.finalize();
20 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "dvb-i-reference-application",
3 | "version": "1.0.0",
4 | "description": "Script to package HbbTV client as an operator application package",
5 | "main": "opapp_package.js",
6 | "repository": {
7 | "type": "git",
8 | "url": "https://github.com/DVBProject/DVB-I-Reference-Client.git"
9 | },
10 | "author": "",
11 | "license": "MIT",
12 | "bugs": {
13 | "url": "https://github.com/DVBProject/DVB-I-Reference-Client/issues"
14 | },
15 | "homepage": "https://github.com/DVBProject/DVB-I-Reference-Client#readme",
16 | "dependencies": {
17 | "archiver": "^5.3.1"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------