diff --git a/docs/addon.md b/docs/addon.md
index 6792d8e..0729920 100644
--- a/docs/addon.md
+++ b/docs/addon.md
@@ -5,14 +5,19 @@
Über die Verwaltungsseite kann eine signiertes Firefox Add-on "MyMediathek" heruntergeladen werden, welches es ermöglicht Beiträge von den ARD, ZDF, 3SAT und ARTE Mediatheken direkt in die Merkliste zu übernehmen oder mit dem Standardplayer abzuspielen.
+Hinweis:
+Das Addon steht auf der Mozilla Addon Seite [https://addons.mozilla.org/de/firefox/](https://addons.mozilla.org/de/firefox/addon/mymediathek) unter dem Namen '[MyMediathek](https://addons.mozilla.org/de/firefox/addon/mymediathek)' zur Verfügung.
+
## Installation in Firefox ##
-- Nach dem Herunterladen im Firefox Add-on Menü die Option "Add-on aus Datei installieren" auswählen um das Add-on zu Firefox hinzufügen:
+- Beim Laden des Addons mit Firefox kann dieses dirkt installiert werden. Ansonsten nach dem Herunterladen im Firefox Add-on Menü die Option "Add-on aus Datei installieren" auswählen um das Add-on zu Firefox hinzufügen:
+Damit das Addon mit 'MyMediathek' zusammen arbeitet, muß in diesem noch die Adresse des Servers eingetragen werden. Dazu:
+
- Die Verwaltung des Add-ons aufrufen - Im Punktemenü auf Verwalten gehen:
@@ -23,7 +28,7 @@
Und mit "Speichern" sichern.
- Anschliesend kann mit dem Button "Teste Serververbeindung" geprüft werden, ob der (richtige) Server erreicht wirden kann.
+ Anschliesend kann mit dem Button "Teste Serververbindung" geprüft werden, ob der (richtige) Server erreicht wirden kann.
diff --git a/gruntfile.js b/gruntfile.js
index 551e362..a1d1b04 100644
--- a/gruntfile.js
+++ b/gruntfile.js
@@ -40,8 +40,7 @@ module.exports = function (grunt) {
"**//*.css",
"**//*.svg",
"**//*.png",
- "**//*.yaml",
- "**//*.xpi",
+ "**//*.yaml"
],
expand: true
},
@@ -78,6 +77,7 @@ module.exports = function (grunt) {
"uninstall.sh",
"start.sh",
"my*.sh",
+ "update*.sh",
],
dest: 'scripts/',
expand: true
@@ -100,7 +100,6 @@ module.exports = function (grunt) {
"**//*.svg",
"**//*.png",
"**//*.yaml",
- "**//*.xpi",
],
expand: true
},
diff --git a/package.json b/package.json
index 2cd9bb6..112f164 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "myMediathek",
- "version": "0.9.1",
+ "version": "0.9.2",
"scripts": {
"start": "run-script-os",
"start:default": "echo 'not supported platform'",
diff --git a/scripts/mymediathek.sh b/scripts/mymediathek.sh
index 19fb089..5285a5f 100644
--- a/scripts/mymediathek.sh
+++ b/scripts/mymediathek.sh
@@ -30,7 +30,7 @@ update() {
sudo chmod a+w "$myInstallPath";
echo " * Installationsverzeichnis ${myInstallPath} wurde schreibbar gemacht"
fi
- echo " * Server Dateien nach $myInstallPath kopieren ..."
+ echo -n " * Server Dateien nach $myInstallPath kopieren ..."
sudo cp -r "$installDir"/server/. "$myInstallPath"/server
sudo cp -r "$installDir"/scripts/. "$myInstallPath"/scripts
sudo chmod +x "$myInstallPath"/scripts/*.sh
@@ -39,6 +39,14 @@ update() {
sudo chmod a+x "$myInstallPath"/start.sh
echo " Fertig"
+ echo -n " * Zusätzliche Update Aufgaben durchführen: "
+ if [[ -f "${installDir}/scripts/updateadditionaltask.sh" ]]; then
+ source ${installDir}/scripts/updateadditionaltask.sh
+ else
+ echo " keine konfiguriert"
+ fi
+
+
echo -n " * Dateien dem Benutzer ${myUserName} zuweisen ..."
sudo chown -R "${myUser}":"${myUser}" "$myInstallPath"
echo " Fertig"
diff --git a/scripts/start.bat b/scripts/start.bat
index fecd162..478146b 100644
--- a/scripts/start.bat
+++ b/scripts/start.bat
@@ -3,7 +3,7 @@ goto :init
:usage
- echo Starte MyMediathek 0.9.1 (13/01/2023) - Optionen
+ echo Starte MyMediathek Vx.x - Optionen
echo.
echo %__BAT_NAME% [flags]
echo.
@@ -36,7 +36,7 @@ goto :init
:main
- echo Starte MyMediathek 0.9.1 (13/01/2023)
+ echo Starte MyMediathek Vx.x
echo.
if defined OptVerbose (
diff --git a/scripts/updateadditionaltask.sh b/scripts/updateadditionaltask.sh
new file mode 100644
index 0000000..e168763
--- /dev/null
+++ b/scripts/updateadditionaltask.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+#
+# (c) 2022-2023 Klaus Wich
+#
+# Additional update task(s)
+#
+# This file is copyright under the latest version of the EUPL.
+# Please see LICENSE file for your rights under this license
+
+echo
+echo " - Start cleanup:"
+echo " - Installationsverzeichnis : $myInstallPath"
+echo " - Benutzer : $myUser"
+
+if [[ -d "${myInstallPath}/server/api/static/addon" ]]; then
+ echo " - Remove Addon directory"
+ sudo rm -r ${myInstallPath}/server/api/static/addon
+fi
+
+echo " Cleanup done"
diff --git a/src/api/__init__.py b/src/api/__init__.py
index bf00006..d42ce73 100644
--- a/src/api/__init__.py
+++ b/src/api/__init__.py
@@ -20,7 +20,7 @@ def printInfo():
print ("\n Einstellungen:")
print (" * INI Datei : " + inifile)
print (" * Database Datei : " + dbname)
- print (" * Bassisverzeichnis : " + str(basedir))
+ print (" * Basisverzeichnis : " + str(basedir))
print (" * Debugmodus : " + ("aktiv" if cfgConfig.getboolean("develop","enable_debug_mode", fallback=False) else "inaktiv"))
if cfgConfig.getboolean("develop","enable_swagger_ui", fallback=False):
print (" * Swagger UI : aktiv")
@@ -62,12 +62,9 @@ def printInfo():
log = logging.getLogger('werkzeug')
log.setLevel(loglevel)
-# Build the Sqlite ULR for SqlAlchemy
-sqlite_url = "sqlite:///" + dbname
-
# Configure the SqlAlchemy part of the app instance
app.config["SQLALCHEMY_ECHO"] = False
-app.config["SQLALCHEMY_DATABASE_URI"] = sqlite_url
+app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + dbname
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# Configure the Flask part of the app instance
diff --git a/src/api/static/admin.html b/src/api/static/admin.html
index 573dd74..6c3afc9 100644
--- a/src/api/static/admin.html
+++ b/src/api/static/admin.html
@@ -134,7 +134,7 @@
Erweiterungen:
diff --git a/src/api/static/css/kw.css b/src/api/static/css/kw.css
index a9bd869..f38a80c 100644
--- a/src/api/static/css/kw.css
+++ b/src/api/static/css/kw.css
@@ -614,7 +614,7 @@ h3.container {
}
#wait {
- animation: 0.3s waitmove 3s infinite;
+ animation: waitmove 3s linear 0.3s infinite;
height: 100px;
left: 50%;
margin-left: -50px;
diff --git a/src/api/static/js/main.js b/src/api/static/js/main.js
index 6e222ae..4e38aa9 100644
--- a/src/api/static/js/main.js
+++ b/src/api/static/js/main.js
@@ -184,7 +184,7 @@ function getARDInfoMovieListSuccess(response) {
let ts = sender.getARDExpiryStringFromJSON(json);
let imgsrc = sender.getARDImageURLFromJSON(json);
let res = sender.getARDStreamQuality(json, currentQueryObj.getAttribute("data-url"));
- updateMovieExpiryImageAndStream(ts, imgsrc, res.quality, (res.found ? null : res.stream));
+ updateMovieExpiryImageAndStream(ts, imgsrc, res.quality); // (res.found ? null : res.stream));
}
util.utilSetWait(false);
showExtended(currentQueryObj, movieList, header);
@@ -196,8 +196,8 @@ function getARTEInfoMovieListSuccess(response) {
if (json) {
let ts = sender.getARTEExpiryStringFromJSON(json);
let imgsrc = sender.getARTEImageURLFromJSON(json);
- let res = sender.getARTEStreamQuality(json, currentQueryObj.getAttribute("data-url"));
- updateMovieExpiryImageAndStream(ts, imgsrc, res.quality, (res.found ? null : res.stream));
+ let res = sender.getARTEStreamQuality(json.data.attributes.streams, currentQueryObj.getAttribute("data-url"));
+ updateMovieExpiryImageAndStream(ts, imgsrc, res.quality); // (res.found ? null : res.stream));
}
util.utilSetWait(false);
showExtended(currentQueryObj, movieList, header);
@@ -217,7 +217,7 @@ function getZDF3SATInfoMovieListSuccess(response) {
}
-function updateMovieExpiryImageAndStream(ts, imgurl, quality = null, stream = null, details = null) {
+function updateMovieExpiryImageAndStream(ts, imgurl, quality, stream, details) {
if (details) {
currentQueryObj.children[0].children[1].innerHTML = currentQueryObj.children[0].children[1].innerHTML + " (Folge: " + details + ")";
}
@@ -1159,7 +1159,6 @@ function playbookmarkurl(event) {
function playBookmarkResponse() {
util.utilViewPopUp("Film wurde gestartet");
util.utilSendHttpRequest("PATCH", gBookmarkServerUrl + "/api/bookmarks/" + bookList.currentCard.getAttribute("data-hash") + "/seen?seen=true", null, false, setCurrentSeen);
- //setCurrentSeen();
}
diff --git a/src/api/static/js/sender.js b/src/api/static/js/sender.js
index b082bbe..0989b80 100644
--- a/src/api/static/js/sender.js
+++ b/src/api/static/js/sender.js
@@ -1,5 +1,5 @@
/**
- * MyMediathek: Sender specific export export functions
+ * Sender specific export functions
**/
"use strict";
@@ -11,7 +11,7 @@ import {cfgCORS_ProxyServer} from "../config/config.js";
* Checks if given url points to ARD and triggers retrieval of movie info
* @return {boolean} True if ARD movie URL, False if other or error occurred
*/
-export function checkAndQueryARDMovieInfo(url, successFunc, errorFunc = null) {
+export function checkAndQueryARDMovieInfo(url, successFunc, errorFunc) {
let rc = false;
if (url && url.indexOf("ardmediathek") > -1) {
// get ARD id
@@ -30,7 +30,7 @@ export function checkAndQueryARDMovieInfo(url, successFunc, errorFunc = null) {
* Checks if given url points to ARTE and triggers retrieval of movie info
* @return {boolean} True if ARTE movie URL, False if other or error in url occurred
*/
-export function checkAndQueryARTEMovieInfo(url, successFunc, errorFunc = null) {
+export function checkAndQueryARTEMovieInfo(url, successFunc, errorFunc) {
let rc = false;
if (url && url.indexOf("www.arte.tv") > -1) {
// get ARTE id
@@ -40,9 +40,11 @@ export function checkAndQueryARTEMovieInfo(url, successFunc, errorFunc = null) {
idx = surl.indexOf("/");
if (idx > -1) {
surl = surl.substring(0, idx);
- let addheader = {name:"X-Requested-With", content:"BookmarkServer"};
- utilSendHttpRequest("GET", cfgCORS_ProxyServer + "https://api.arte.tv/api/player/v2/config/de/" + surl + "?platform=ARTE_NEXT", null, false, successFunc, errorFunc, addheader) ;
- rc = true;
+ if (surl.length > 5 && surl.indexOf("fernsehfilme") == -1) {
+ let addheader = {name:"X-Requested-With", content:"MyMediathek"};
+ utilSendHttpRequest("GET", cfgCORS_ProxyServer + "https://api.arte.tv/api/player/v2/config/de/" + surl + "?platform=ARTE_NEXT", null, false, successFunc, errorFunc, addheader) ;
+ rc = true;
+ }
}
}
}
@@ -54,7 +56,7 @@ export function checkAndQueryARTEMovieInfo(url, successFunc, errorFunc = null) {
* Checks if given url points to ZDF and triggers retrieval of movie info
* @return {boolean} True if ZDF movie URL, False if other
*/
-export function checkAndQueryZDFMovieInfo(url, successFunc, errorFunc = null) {
+export function checkAndQueryZDFMovieInfo(url, successFunc, errorFunc) {
let rc = false;
if (url && url.indexOf("www.zdf.de") > -1) {
// get ZDF Name id
@@ -71,7 +73,7 @@ export function checkAndQueryZDFMovieInfo(url, successFunc, errorFunc = null) {
* Checks if given url points to ZDF and triggers retrieval of movie info
* @return {boolean} True if ZDF movie URL, False if other
*/
-export function checkAndQuery3SATMovieInfo(url, successFunc, errorFunc = null) {
+export function checkAndQuery3SATMovieInfo(url, successFunc, errorFunc) {
let rc = false;
if (url && url.indexOf("www.3sat.de") > -1) {
// get ZDF Name id
@@ -85,7 +87,7 @@ export function checkAndQuery3SATMovieInfo(url, successFunc, errorFunc = null) {
-// --------- ZDF/3SAT specific export functions -------------------------
+// --------- ZDF/3SAT specific functions -------------------------
export function getZDF3SATImageURLFromJSON(json) {
try {
return json.teaserImageRef.layouts["768x432"];
@@ -148,41 +150,78 @@ export function getARTEExpiryStringFromJSON(json) {
return rstr;
}
+const arteQualityMap = new Map([
+ ["360p", 1],
+ ["720p", 2],
+ ["1080p", 3],
+]);
-export function getARTEStreamQuality(json, url) {
- let maxidx = "";
- let found = "";
- try {
- let maxheight = -1;
- let sarr = json.data.attributes.streams;
+function betterQuality(first, second) {
+ let x = arteQualityMap.has(first) ? arteQualityMap.get(first) : -1;
+ let y = arteQualityMap.has(second) ? arteQualityMap.get(second) : -1;
+ return x > y;
+}
+
+export function getARTEStreamQuality(json) {
+ let sarr = json;
+ let maxidx = -1;
+ let maxquality = -1;
+ let quality = "";
+ let omu = false;
+ let originalversion = false; // Originalfassung
+ let live = false;
+ for (const x in sarr) {
+ if (sarr[x].versions[0].shortLabel == "DE") {
+ quality = sarr[x].mainQuality.label;
+ if (betterQuality(quality, maxquality)) {
+ maxquality = quality;
+ maxidx = x;
+ }
+ }
+ }
+ if (maxidx == -1) {
for (const x in sarr) {
- if (sarr[x].versionShortLibelle == "DE") {
- if (sarr[x].url == url) {
- found = x;
- maxheight = sarr[x].height;
- }
- if (sarr[x].height > maxheight) {
- maxheight = sarr[x].height;
+ if (sarr[x].versions[0].shortLabel == "OmU" && sarr[x].versions[0].label.indexOf("deutsch") > -1) {
+ quality = sarr[x].mainQuality.label;
+ if (betterQuality(quality, maxquality)) {
+ maxquality = quality;
maxidx = x;
+ omu = true;
}
}
}
- if (found != "") {
- if (sarr[found].height < maxheight) { // There is a better stream
- found = -1;
- }
- else {
- maxidx = found;
+ }
+ if (maxidx == -1) {
+ for (const x in sarr) {
+ if (sarr[x].versions[0].shortLabel == "OV") {
+ quality = sarr[x].mainQuality.label;
+ if (betterQuality(quality, maxquality)) {
+ maxquality = quality;
+ maxidx = x;
+ originalversion = true;
+ }
}
}
}
- catch(err) {
- // Do Nothing
+ if (maxidx == -1) {
+ for (const x in sarr) {
+ if (sarr[x].versions[0].shortLabel == "liveDE") {
+ quality = sarr[x].mainQuality.label;
+ if (betterQuality(quality, maxquality)) {
+ maxquality = quality;
+ maxidx = x;
+ live = true;
+ }
+ }
+ }
}
return {
- "found": found != "",
- "quality": maxidx == "" ? null : sarr[maxidx].height + "p",
- "stream": maxidx == "" ? null : sarr[maxidx].url
+ "found" : (maxidx > -1),
+ "quality": maxidx > -1 ? sarr[maxidx].mainQuality.label : null,
+ "stream" : maxidx > -1 ? sarr[maxidx].url : null,
+ "omu" : omu,
+ "live" : live,
+ "ov" : originalversion
};
}
diff --git a/src/main.py b/src/main.py
index 5e3ef3b..77c5b50 100644
--- a/src/main.py
+++ b/src/main.py
@@ -110,6 +110,6 @@ def proxy(url):
bmServerPort = cfgConfig.get('general', 'serverport', fallback = 8081)
#import pdb; pdb.set_trace()
cli = sys.modules['flask.cli']
- cli.show_server_banner = lambda *x: click.echo("\n------------------------------------------------------\nDie Webseite kann jetzt im Browser unter der Adresse\n http://" + serverip + ":" + str(bmServerPort) +" geöffnet werden.\n------------------------------------------------------\n\n")
+ cli.show_server_banner = lambda *x: click.echo("\n------------------------------------------------------\nDie Webseite kann jetzt im Browser unter der Adresse\n http://" + serverip + ":" + str(bmServerPort) +" geoeffnet werden.\n------------------------------------------------------\n\n")
connex_app.run(port=bmServerPort, host=bmServerMode, debug=cfgConfig.getboolean("develop","enable_debug_mode", fallback=None))
diff --git a/src/swagger.yaml b/src/swagger.yaml
index bb17fed..ff65f4b 100644
--- a/src/swagger.yaml
+++ b/src/swagger.yaml
@@ -82,7 +82,7 @@ paths:
description: "Number of days before expiry day, a movie gets a warning"
example:
- { "name": "MyMediathek Server", "version": "0.9.0", "defaultplayer": -1, "players": [], "config": {"searchChannelInclude": ["ARD", "ZDF"], "searchTitleFilter" : [], "searchTopicFilter": [], "minMovieStateAge" : 183, "expiryWarningDays" : 5}}
+ { "name": "MyMediathek Server", "version": "0.9.2", "defaultplayer": -1, "players": [], "config": {"searchChannelInclude": ["ARD", "ZDF"], "searchTitleFilter" : [], "searchTopicFilter": [], "minMovieStateAge" : 183, "expiryWarningDays" : 5}}
/info/config: