From 6b4eac3ba145dd6ae96ea3200f424bd85b2db311 Mon Sep 17 00:00:00 2001 From: CvH Date: Thu, 21 Jun 2018 10:56:17 +0200 Subject: [PATCH] chrome: initial add-on --- packages/addons/browser/chrome/changelog.txt | 2 + .../addons/browser/chrome/config/Xdefaults | 1 + .../browser/chrome/config/pango.modules | 13 ++ packages/addons/browser/chrome/config/pangorc | 10 ++ .../chrome/config/pixbuf.loaders.cache | 104 ++++++++++++++++ packages/addons/browser/chrome/icon/icon.png | Bin 0 -> 36803 bytes packages/addons/browser/chrome/package.mk | 117 ++++++++++++++++++ .../chrome/source/bin/chrome-downloader | 94 ++++++++++++++ .../browser/chrome/source/bin/chrome-start | 113 +++++++++++++++++ .../addons/browser/chrome/source/default.py | 116 +++++++++++++++++ .../resources/language/English/strings.po | 46 +++++++ .../chrome/source/resources/settings.xml | 15 +++ .../chrome/source/settings-default.xml | 10 ++ 13 files changed, 641 insertions(+) create mode 100644 packages/addons/browser/chrome/changelog.txt create mode 100644 packages/addons/browser/chrome/config/Xdefaults create mode 100644 packages/addons/browser/chrome/config/pango.modules create mode 100644 packages/addons/browser/chrome/config/pangorc create mode 100644 packages/addons/browser/chrome/config/pixbuf.loaders.cache create mode 100644 packages/addons/browser/chrome/icon/icon.png create mode 100644 packages/addons/browser/chrome/package.mk create mode 100644 packages/addons/browser/chrome/source/bin/chrome-downloader create mode 100644 packages/addons/browser/chrome/source/bin/chrome-start create mode 100644 packages/addons/browser/chrome/source/default.py create mode 100644 packages/addons/browser/chrome/source/resources/language/English/strings.po create mode 100644 packages/addons/browser/chrome/source/resources/settings.xml create mode 100644 packages/addons/browser/chrome/source/settings-default.xml diff --git a/packages/addons/browser/chrome/changelog.txt b/packages/addons/browser/chrome/changelog.txt new file mode 100644 index 0000000000..fbac0f5bdd --- /dev/null +++ b/packages/addons/browser/chrome/changelog.txt @@ -0,0 +1,2 @@ +100 +- initial release diff --git a/packages/addons/browser/chrome/config/Xdefaults b/packages/addons/browser/chrome/config/Xdefaults new file mode 100644 index 0000000000..95307ee3db --- /dev/null +++ b/packages/addons/browser/chrome/config/Xdefaults @@ -0,0 +1 @@ +Xft.dpi: 96 diff --git a/packages/addons/browser/chrome/config/pango.modules b/packages/addons/browser/chrome/config/pango.modules new file mode 100644 index 0000000000..bd3e97457d --- /dev/null +++ b/packages/addons/browser/chrome/config/pango.modules @@ -0,0 +1,13 @@ +/storage/.kodi/addons/browser.chrome/pango-modules/pango-arabic-lang.so ArabicScriptEngineLang PangoEngineLang PangoRenderNone arabic:* +/storage/.kodi/addons/browser.chrome/pango-modules/pango-basic-fc.so BasicScriptEngineFc PangoEngineShape PangoRenderFc common: +/storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so devaIndicScriptEngineLang PangoEngineLang PangoRenderNone devanagari:* +/storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so bengIndicScriptEngineLang PangoEngineLang PangoRenderNone bengali:* +/storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so guruIndicScriptEngineLang PangoEngineLang PangoRenderNone gurmukhi:* +/storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so gujrIndicScriptEngineLang PangoEngineLang PangoRenderNone gujarati:* +/storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so oryaIndicScriptEngineLang PangoEngineLang PangoRenderNone oriya:* +/storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so tamlIndicScriptEngineLang PangoEngineLang PangoRenderNone tamil:* +/storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so teluIndicScriptEngineLang PangoEngineLang PangoRenderNone telugu:* +/storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so kndaIndicScriptEngineLang PangoEngineLang PangoRenderNone kannada:* +/storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so mlymIndicScriptEngineLang PangoEngineLang PangoRenderNone malayalam:* +/storage/.kodi/addons/browser.chrome/pango-modules/pango-indic-lang.so sinhIndicScriptEngineLang PangoEngineLang PangoRenderNone sinhala:* + diff --git a/packages/addons/browser/chrome/config/pangorc b/packages/addons/browser/chrome/config/pangorc new file mode 100644 index 0000000000..49fb9237bb --- /dev/null +++ b/packages/addons/browser/chrome/config/pangorc @@ -0,0 +1,10 @@ +# +# pangorc file for uninstalled operation. If pango-viewer is run with +# this file in the current directory it will set it as PANGO_RC_FILE +# + +[Pango] +ModuleFiles = /storage/.kodi/addons/browser.chrome/config/pango.modules + +[PangoX] +AliasFiles = /storage/.kodi/addons/browser.chrome/config/pangx.aliases diff --git a/packages/addons/browser/chrome/config/pixbuf.loaders.cache b/packages/addons/browser/chrome/config/pixbuf.loaders.cache new file mode 100644 index 0000000000..9effded69b --- /dev/null +++ b/packages/addons/browser/chrome/config/pixbuf.loaders.cache @@ -0,0 +1,104 @@ +# How to generate those file +# cd /LE/build.LibreELEC-Generic/gdk-pixbuf-2.36.12/.install_pkg/usr/lib/gdk-pixbuf-2.0/2.10.0/loaders +# cp /LE/build.LibreELEC-Generic/gdk-pixbuf-2.36.12/.install_pkg/usr/bin/gdk-pixbuf-query-loaders . +# ./gdk-pixbuf-query-loaders *.so > pixbuf.loaders.cache + + +# GdkPixbuf Image Loader Modules file +# Automatically generated file, do not edit +# Created by gdk-pixbuf-query-loaders from gdk-pixbuf-2.36.12 +# +"/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-ani.so" +"ani" 4 "gdk-pixbuf" "Windows animated cursor" "LGPL" +"application/x-navi-animation" "" +"ani" "" +"RIFF ACON" " xxxx " 100 + +"/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-bmp.so" +"bmp" 5 "gdk-pixbuf" "BMP" "LGPL" +"image/bmp" "image/x-bmp" "image/x-MS-bmp" "" +"bmp" "" +"BM" "" 100 + +"/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-gif.so" +"gif" 4 "gdk-pixbuf" "GIF" "LGPL" +"image/gif" "" +"gif" "" +"GIF8" "" 100 + +"/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-icns.so" +"icns" 4 "gdk-pixbuf" "MacOS X icon" "GPL" +"image/x-icns" "" +"icns" "" +"icns" "" 100 + +"/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-ico.so" +"ico" 5 "gdk-pixbuf" "Windows icon" "LGPL" +"image/x-icon" "image/x-ico" "image/x-win-bitmap" "image/vnd.microsoft.icon" "application/ico" "image/ico" "image/icon" "text/ico" "" +"ico" "cur" "" +" \001 " "zz znz" 100 +" \002 " "zz znz" 100 + +"/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-jpeg.so" +"jpeg" 5 "gdk-pixbuf" "JPEG" "LGPL" +"image/jpeg" "" +"jpeg" "jpe" "jpg" "" +"\377\330" "" 100 + +"/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-png.so" +"png" 5 "gdk-pixbuf" "PNG" "LGPL" +"image/png" "" +"png" "" +"\211PNG\r\n\032\n" "" 100 + +"/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-pnm.so" +"pnm" 4 "gdk-pixbuf" "PNM/PBM/PGM/PPM" "LGPL" +"image/x-portable-anymap" "image/x-portable-bitmap" "image/x-portable-graymap" "image/x-portable-pixmap" "" +"pnm" "pbm" "pgm" "ppm" "" +"P1" "" 100 +"P2" "" 100 +"P3" "" 100 +"P4" "" 100 +"P5" "" 100 +"P6" "" 100 + +"/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-qtif.so" +"qtif" 4 "gdk-pixbuf" "QuickTime" "LGPL" +"image/x-quicktime" "image/qtif" "" +"qtif" "qif" "" +"abcdidsc" "xxxx " 100 +"abcdidat" "xxxx " 100 + +"/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-tga.so" +"tga" 4 "gdk-pixbuf" "Targa" "LGPL" +"image/x-tga" "" +"tga" "targa" "" +" \001\001" "x " 100 +" \001\t" "x " 100 +" \002" "xz " 99 +" \003" "xz " 100 +" \n" "xz " 100 +" \v" "xz " 100 + +"/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-tiff.so" +"tiff" 5 "gdk-pixbuf" "TIFF" "LGPL" +"image/tiff" "" +"tiff" "tif" "" +"MM *" " z " 100 +"II* " " z" 100 +"II* \020 CR\002 " " z zzz z" 0 + +"/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-xbm.so" +"xbm" 4 "gdk-pixbuf" "XBM" "LGPL" +"image/x-xbitmap" "" +"xbm" "" +"#define " "" 100 +"/*" "" 50 + +"/storage/.kodi/addons/browser.chrome/gdk-pixbuf-modules/libpixbufloader-xpm.so" +"xpm" 4 "gdk-pixbuf" "XPM" "LGPL" +"image/x-xpixmap" "" +"xpm" "" +"/* XPM */" "" 100 + + diff --git a/packages/addons/browser/chrome/icon/icon.png b/packages/addons/browser/chrome/icon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0baf8a323497ac26f4c7f143524b16da27eb0a00 GIT binary patch literal 36803 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 literal 0 HcmV?d00001 diff --git a/packages/addons/browser/chrome/package.mk b/packages/addons/browser/chrome/package.mk new file mode 100644 index 0000000000..d1d9755f09 --- /dev/null +++ b/packages/addons/browser/chrome/package.mk @@ -0,0 +1,117 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2016-present Team LibreELEC +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ + +PKG_NAME="chrome" +PKG_VERSION="1.0" +PKG_REV="100" +PKG_ARCH="x86_64" +PKG_LICENSE="Custom" +PKG_SITE="http://www.google.com/chrome" +PKG_DEPENDS_TARGET="toolchain at-spi2-atk atk cairo chrome-libXcomposite \ + chrome-libXdamage chrome-libXfixes chrome-libXi chrome-libXrender \ + chrome-libXtst chrome-libxcb cups gdk-pixbuf gtk3 harfbuzz \ + libXcursor libxss nss pango scrnsaverproto unclutter" +PKG_SECTION="browser" +PKG_SHORTDESC="Google Chrome Browser" +PKG_LONGDESC="Google Chrome Browser" +PKG_TOOLCHAIN="manual" + +PKG_IS_ADDON="yes" +PKG_ADDON_NAME="Chrome" +PKG_ADDON_TYPE="xbmc.python.script" +PKG_ADDON_PROVIDES="executable" + +make_target() { + : +} + +addon() { + mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/bin \ + $ADDON_BUILD/$PKG_ADDON_ID/config \ + $ADDON_BUILD/$PKG_ADDON_ID/gdk-pixbuf-modules \ + $ADDON_BUILD/$PKG_ADDON_ID/lib + + # config + cp -P $PKG_DIR/config/* $ADDON_BUILD/$PKG_ADDON_ID/config + + # atk + cp -PL $(get_build_dir atk)/.install_pkg/usr/lib/libatk-1.0.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # cairo + cp -PL $(get_build_dir cairo)/.install_pkg/usr/lib/libcairo-gobject.so.2 $ADDON_BUILD/$PKG_ADDON_ID/lib + cp -PL $(get_build_dir cairo)/.install_pkg/usr/lib/libcairo.so.2 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # gdk-pixbuf + cp -PL $(get_build_dir gdk-pixbuf)/.install_pkg/usr/lib/libgdk_pixbuf-2.0.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # gdk-pixbuf modules + cp -PL $(get_build_dir gdk-pixbuf)/.install_pkg/usr/lib/gdk-pixbuf-2.0/2.10.0/loaders/* $ADDON_BUILD/$PKG_ADDON_ID/gdk-pixbuf-modules + + # gtk3 gdk3 + cp -PL $(get_build_dir gtk3)/.install_pkg/usr/lib/libgtk-3.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib + cp -PL $(get_build_dir gtk3)/.install_pkg/usr/lib/libgdk-3.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # harfbuzz + cp -PL $(get_build_dir harfbuzz)/.install_pkg/usr/lib/libharfbuzz.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib + cp -PL $(get_build_dir harfbuzz)/.install_pkg/usr/lib/libharfbuzz-icu.so* $ADDON_BUILD/$PKG_ADDON_ID/lib + + # libatk-bridge + cp -PL $(get_build_dir at-spi2-atk)/.install_pkg/usr/lib/libatk-bridge-2.0.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # libatspi + cp -PL $(get_build_dir at-spi2-core)/.install_pkg/usr/lib/libatspi.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # libcups + cp -PL $(get_build_dir cups)/cups/libcups.so.2 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # libxcb + cp -PL $(get_build_dir chrome-libxcb)/.install_pkg/usr/lib/libxcb.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # libXcomposite + cp -PL $(get_build_dir chrome-libXcomposite)/.install_pkg/usr/lib/libXcomposite.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # libXcursor + cp -PL $(get_build_dir libXcursor)/.install_pkg/usr/lib/libXcursor.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # libXdamage + cp -PL $(get_build_dir chrome-libXdamage)/.install_pkg/usr/lib/libXdamage.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # libXfixes + cp -PL $(get_build_dir chrome-libXfixes)/.install_pkg/usr/lib/libXfixes.so.3 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # libXi + cp -PL $(get_build_dir chrome-libXi)/.install_pkg/usr/lib/libXi.so.6 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # libXrender + cp -PL $(get_build_dir chrome-libXrender)/.install_pkg/usr/lib/libXrender.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # libxss + cp -PL $(get_build_dir libxss)/.install_pkg/usr/lib/libXss.so.1 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # libXtst + cp -PL $(get_build_dir chrome-libXtst)/.install_pkg/usr/lib/libXtst.so.6 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # pango + cp -PL $(get_build_dir pango)/.install_pkg/usr/lib/libpangocairo-1.0.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib + cp -PL $(get_build_dir pango)/.install_pkg/usr/lib/libpango-1.0.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib + cp -PL $(get_build_dir pango)/.install_pkg/usr/lib/libpangoft2-1.0.so.0 $ADDON_BUILD/$PKG_ADDON_ID/lib + + # unclutter + cp -P $(get_build_dir unclutter)/.install_pkg/usr/bin/unclutter $ADDON_BUILD/$PKG_ADDON_ID/bin + +} diff --git a/packages/addons/browser/chrome/source/bin/chrome-downloader b/packages/addons/browser/chrome/source/bin/chrome-downloader new file mode 100644 index 0000000000..6ee97c3cc2 --- /dev/null +++ b/packages/addons/browser/chrome/source/bin/chrome-downloader @@ -0,0 +1,94 @@ +#!/bin/bash +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2018-present Team LibreELEC +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ + +. /etc/profile +oe_setup_addon browser.chrome + +ICON=$ADDON_DIR/resources/icon.png +CONTROL_FILE=/tmp/curl.done +DATA_FILE=/tmp/curl.data + +# check chrome version +case "$1" in + 'latest') + CHROME_VER="$(curl -s https://dl.google.com/linux/chrome/rpm/stable/x86_64/repodata/other.xml.gz | \ + gzip -df | awk -F\" '/pkgid.*-stable/{ print $10 }')" + ;; + 'repo') + CHROME_VER="67.0.3396.87" + ;; + *) + echo "Usage $0 { latest | repo }" + exit 0; + ;; +esac + +# check for enough free disk space +if [ $(df . | awk 'END {print $4}') -lt 400000 ]; then + kodi-send --action="Notification(Not enough disk space, at least 400mb are required,30000,${ICON})" >/dev/null + exit 0; +fi + +# remove install status and folders +if [ -f $ADDON_DIR/extract.ok ]; then + rm $ADDON_DIR/extract.ok +fi + +if [ -d $ADDON_DIR/chrome-bin ]; then + rm -rf $ADDON_DIR/chrome-bin +fi + +if [ -d $ADDON_DIR/tmp_download ]; then + rm -rf $ADDON_DIR/tmp_download +fi + +# create tmp download dir +mkdir -p $ADDON_DIR/tmp_download +cd $ADDON_DIR/tmp_download + +echo "Downloading Chrome version $CHROME_VER" + +# download chrome +rm -f ${CONTROL_FILE} ${DATA_FILE} +( + curl -# -O -C - http://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_$CHROME_VER-1_amd64.deb 2>${DATA_FILE} + touch ${CONTROL_FILE} +) | \ + while [ : ]; do + [ -f ${DATA_FILE} ] && prog="$(tr '\r' '\n' < ${DATA_FILE} | tail -n 1 | sed -r 's/^[# ]+/#/;s/^[^0-9]*//g')" || prog= + kodi-send --action="Notification(Downloading Chrome,"${prog:-0.0%}",3000,${ICON})" >/dev/null + [ -f ${CONTROL_FILE} ] && break + sleep 4 + done + +rm -f ${CONTROL_FILE} ${DATA_FILE} + +## extract chrome +# extrat chrome.deb +kodi-send --action="Notification(Extracting Chrome,starting,1000,${ICON})" >/dev/null +ar -x google-chrome-stable_$CHROME_VER-1_amd64.deb + +# extract data.tar.xz to chrome-bin directory +mkdir $ADDON_DIR/chrome-bin +tar xf data.tar.xz --strip-components=4 -C $ADDON_DIR/chrome-bin ./opt/google/chrome + +# cleanup +rm -rf $ADDON_DIR/tmp_download +touch $ADDON_DIR/extract.ok +kodi-send --action="Notification(Extracting Chrome,finished,1000,${ICON})" >/dev/null diff --git a/packages/addons/browser/chrome/source/bin/chrome-start b/packages/addons/browser/chrome/source/bin/chrome-start new file mode 100644 index 0000000000..a03065ac45 --- /dev/null +++ b/packages/addons/browser/chrome/source/bin/chrome-start @@ -0,0 +1,113 @@ +#!/bin/sh +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2016-present Team LibreELEC +# Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ +. /etc/profile +oe_setup_addon browser.chrome + +# check if chrome is already successful installed +if [ ! -f "$ADDON_DIR/extract.ok" ]; then + cd $ADDON_DIR + chrome-downloader repo +fi + +if [ -e $ADDON_HOME/env ] +then + . $ADDON_HOME/env +fi + +# fix file permissons (zip packaging) +chmod +x $ADDON_DIR/chrome-bin/chrome +chmod 4755 $ADDON_DIR/chrome-bin/chrome-sandbox + +# make sure we use "own" gtk/pango/nss/etc +export LD_LIBRARY_PATH=$ADDON_DIR/lib + +# configure pango/pixbuf +export PANGO_RC_FILE=$ADDON_DIR/config/pangorc +export GDK_PIXBUF_MODULE_FILE=$ADDON_DIR/config/pixbuf.loaders.cache + +# font rendering in gtk widgets is brokeen with nvidia blob. use our Xdefaults +export XENVIRONMENT=$ADDON_DIR/config/Xdefaults + +# start unclutter +if [ "$HIDE_CURSOR" == "true" ] +then + unclutter & + UNCLUTTER_PID=$! +fi + +# vaapi +LIBVA_DRIVERS_PATH="/usr/lib/dri:$ADDON_DIR/lib" +LIBVA_DRIVER_NAME='' +case $VAAPI_MODE in + 'intel') + LIBVA_DRIVER_NAME='i965' + chrome_OPTS="$chrome_OPTS --enable-accelerated-video" + ;; + 'amd') + LIBVA_DRIVER_NAME='vdpau' + chrome_OPTS="$chrome_OPTS --enable-accelerated-video" + ;; + 'nvidia') + LIBVA_DRIVER_NAME='vdpau' + chrome_OPTS="$chrome_OPTS --enable-accelerated-video --allow-no-sandbox-job --disable-gpu-sandbox" + ;; + *) + LIBGL_ALWAYS_SOFTWARE='1' + export LIBGL_ALWAYS_SOFTWARE +esac +export LIBVA_DRIVER_NAME LIBVA_DRIVERS_PATH + +# windowed +case $WINDOW_MODE in + 'maximized') chrome_OPTS="$chrome_OPTS --start-maximized";; + 'kiosk') chrome_OPTS="$chrome_OPTS --kiosk";; +esac + +# rasterization +case $RASTER_MODE in + 'off') chrome_OPTS="$chrome_OPTS --disable-accelerated-2d-canvas --disable-gpu-compositing";; + 'force') chrome_OPTS="$chrome_OPTS --enable-gpu-rasterization --enable-accelerated-2d-canvas --ignore-gpu-blacklist";; +esac + +# alsa +if [ ! -z $ALSA_DEVICE ]; then + chrome_OPTS="$chrome_OPTS --alsa-output-device=$ALSA_DEVICE" +fi + +# HACK!!! to get sound at Chrome stop pulseaudio +systemctl stop pulseaudio + +# start chrome +LD_PRELOAD=/usr/lib/libGL.so $ADDON_DIR/chrome-bin/chrome \ + $chrome_OPTS \ + --no-sandbox \ + --user-data-dir=$ADDON_HOME/profile \ + --test-type $@ \ + 2>&1 | tee $ADDON_LOG_FILE + +# kill unclutter +if [ "$HIDE_CURSOR" == "true" ] +then + kill $UNCLUTTER_PID +fi + +# HACK!!! to get sound at Kodi start pulseaudio +sleep 5 +systemctl start pulseaudio diff --git a/packages/addons/browser/chrome/source/default.py b/packages/addons/browser/chrome/source/default.py new file mode 100644 index 0000000000..1ac0a2572e --- /dev/null +++ b/packages/addons/browser/chrome/source/default.py @@ -0,0 +1,116 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2018-present Team LibreELEC +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ + +import os +import sys +import time +import xbmcaddon +import subprocess +from xml.dom.minidom import parse + +sys.path.append('/usr/share/kodi/addons/service.libreelec.settings') + +import oe + +__addon__ = xbmcaddon.Addon(); +__path__ = os.path.join(__addon__.getAddonInfo('path'), 'bin') + '/' + +pauseXBMC = __addon__.getSetting("PAUSE_XBMC") + +def pauseXbmc(): + if pauseXBMC == "true": + xbmc.executebuiltin("PlayerControl(Stop)") + xbmc.audioSuspend() + xbmc.enableNavSounds(False) + +def resumeXbmc(): + if pauseXBMC == "true": + xbmc.audioResume() + xbmc.enableNavSounds(True) + +def startchrome(args): + try: + new_env = os.environ.copy() + new_env['VAAPI_MODE'] = __addon__.getSetting('VAAPI_MODE') + new_env['WINDOW_MODE'] = __addon__.getSetting('WINDOW_MODE') + new_env['RASTER_MODE'] = __addon__.getSetting('RASTER_MODE') + + new_env['ALSA_DEVICE'] = '' + if __addon__.getSetting('USE_CUST_AUDIODEVICE') == 'true': + alsa_device = __addon__.getSetting('CUST_AUDIODEVICE_STR') + else: + alsa_device = getAudioDevice() + if not alsa_device == None and not alsa_device == '': + new_env['ALSA_DEVICE'] = alsa_device + + chrome_params = args + ' ' + \ + __addon__.getSetting('HOMEPAGE') + subprocess.call(__path__ + 'chrome-start ' + chrome_params, shell=True, env=new_env) + except Exception, e: + oe.dbg_log('chrome', unicode(e)) + +def isRuning(pname): + tmp = os.popen("ps -Af").read() + pcount = tmp.count(pname) + if pcount > 0: + return True + return False + +def getAudioDevice(): + try: + dom = parse("/storage/.kodi/userdata/guisettings.xml") + audiooutput=dom.getElementsByTagName('audiooutput') + for node in audiooutput: + dev = node.getElementsByTagName('audiodevice')[0].childNodes[0].nodeValue + if dev.startswith("ALSA:"): + dev = dev.split("ALSA:")[1] + if dev == "@": + return None + if dev.startswith("@:"): + dev = dev.split("@:")[1] + else: + # not ALSA + return None + except: + return None + if dev.startswith("CARD="): + dev = "plughw:" + dev + return dev + +if (not __addon__.getSetting("firstrun")): + __addon__.setSetting("firstrun", "1") + __addon__.openSettings() + +try: + args = ' '.join(sys.argv[1:]) +except: + args = "" + +if args == 'widevine': + install_widevine() +elif args == 'flash': + install_flash() +else: + if not isRuning('chrome'): + pauseXbmc() + startchrome(args) + while isRuning('chrome'): + time.sleep(1) + resumeXbmc() + diff --git a/packages/addons/browser/chrome/source/resources/language/English/strings.po b/packages/addons/browser/chrome/source/resources/language/English/strings.po new file mode 100644 index 0000000000..c112a7613c --- /dev/null +++ b/packages/addons/browser/chrome/source/resources/language/English/strings.po @@ -0,0 +1,46 @@ +# Kodi Media Center language file +# Addon Name: chrome +# Addon id: browser.chrome +# Addon Provider: Team LibreELEC +msgid "" +msgstr "" + +msgctxt "#30000" +msgid "General" +msgstr "" + +msgctxt "#30001" +msgid "Chrome Configuration" +msgstr "" + +msgctxt "#30002" +msgid "Stop Kodi Player and Suspend AudioEngine" +msgstr "" + +msgctxt "#30003" +msgid "HW Acceleration Mode" +msgstr "" + +msgctxt "#30004" +msgid "Rasterization Mode" +msgstr "" + +msgctxt "#30005" +msgid "Window Mode" +msgstr "" + +msgctxt "#30006" +msgid "Default Homepage" +msgstr "" + +msgctxt "#30007" +msgid "Use Custom Audio Device" +msgstr "" + +msgctxt "#30008" +msgid "Audio Device" +msgstr "" + +msgctxt "#30009" +msgid "Hide Cursor" +msgstr "" diff --git a/packages/addons/browser/chrome/source/resources/settings.xml b/packages/addons/browser/chrome/source/resources/settings.xml new file mode 100644 index 0000000000..d7fa58d4cf --- /dev/null +++ b/packages/addons/browser/chrome/source/resources/settings.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/addons/browser/chrome/source/settings-default.xml b/packages/addons/browser/chrome/source/settings-default.xml new file mode 100644 index 0000000000..4eace1aefb --- /dev/null +++ b/packages/addons/browser/chrome/source/settings-default.xml @@ -0,0 +1,10 @@ + + + false + https://libreelec.tv + true + default + false + intel + maximized +