Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
a9fd91f
Add configurable log filters for daemon logs
TiTidom-RC Jun 20, 2026
07ffc26
Log log filter status and rule count on startup
TiTidom-RC Jun 20, 2026
3f4dc1e
Add restart notice to filters saved alert
TiTidom-RC Jun 20, 2026
4371972
Merge pull request #117 from TiTidom-RC/dev
TiTidom-RC Jun 20, 2026
1440b2e
Auto update translation done by Mips2648/plugins-translations workflow
TiTidom-RC Jun 20, 2026
67c83d5
Merge pull request #118 from TiTidom-RC/translations
TiTidom-RC Jun 20, 2026
e8e0b22
Merge pull request #119 from TiTidom-RC/beta
TiTidom-RC Jun 20, 2026
37e4356
Add blank line for readability in config.py
TiTidom-RC Jun 20, 2026
1531f1b
Merge branch 'dev' of https://github.com/TiTidom-RC/TVRemote into dev
TiTidom-RC Jun 20, 2026
4da9839
Merge pull request #120 from TiTidom-RC/dev
TiTidom-RC Jun 20, 2026
9688f78
Bump version and lower notification log level
TiTidom-RC Jun 21, 2026
f2d9dc1
Merge pull request #121 from TiTidom-RC/dev
TiTidom-RC Jun 21, 2026
debdce6
Limit CI workflows to relevant file changes
TiTidom-RC Jun 21, 2026
107c3c3
Merge pull request #122 from TiTidom-RC/dev
TiTidom-RC Jun 21, 2026
be2cd76
Add JavaScript syntax-check workflow
TiTidom-RC Jun 21, 2026
728b762
Merge pull request #123 from TiTidom-RC/dev
TiTidom-RC Jun 21, 2026
26369b1
Add workflow_dispatch to GitHub workflows
TiTidom-RC Jun 21, 2026
c7c529c
Merge pull request #124 from TiTidom-RC/dev
TiTidom-RC Jun 21, 2026
155172d
Bump actions/setup-node to v5
TiTidom-RC Jun 21, 2026
1e0ce04
Merge pull request #125 from TiTidom-RC/dev
TiTidom-RC Jun 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/checkPHP.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ on:
pull_request:
branches:
- beta
paths:
- '**/*.php'
workflow_dispatch:

jobs:
php-lint:
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/checkPHPCompat.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ on:
pull_request:
branches:
- beta
paths:
- '**/*.php'
workflow_dispatch:

jobs:
php-compat:
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/checkPython.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ on:
pull_request:
branches:
- beta
paths:
- 'resources/**/*.py'
workflow_dispatch:

jobs:
python-check:
Expand Down
23 changes: 23 additions & 0 deletions .github/workflows/js-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: JavaScript Syntax Check

on:
pull_request:
branches:
- beta
paths:
- '**/*.js'
workflow_dispatch:

jobs:
js-lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6

- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: '22'

- name: Check JavaScript syntax
run: find . -name "*.js" ! -path "./node_modules/*" -exec node --check {} \;
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# Plugin Configuration
data/filters/*.json

# IDE & Editors
.vscode/*
!.vscode/settings.json
Expand Down
1 change: 1 addition & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
"lastscan",
"lasttime",
"lastused",
"logfilters",
"maxrss",
"molotov",
"mycanal",
Expand Down
10 changes: 10 additions & 0 deletions core/ajax/tvremote.ajax.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,16 @@
ajax::success(tvremote::sendBeginPairingAdb(init('mac'), init('host')));
}

if (init('action') == 'saveLogFilters') {
$data = init('logFiltersData');
$filters = json_decode(is_string($data) ? $data : '[]', true);
if (!is_array($filters)) {
ajax::error(__('Format de données invalide', __FILE__));
}
tvremote::saveLogFilters($filters);
ajax::success();
}

throw new Exception(__('Aucune méthode correspondante à', __FILE__) . ' : ' . init('action'));
/* * *********Catch exception*************** */
} catch (Exception $e) {
Expand Down
23 changes: 23 additions & 0 deletions core/class/tvremote.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ public static function deamon_start() {
$cmd = self::PYTHON3_PATH . " {$path}/tvremoted.py";
$cmd .= ' --loglevel ' . log::convertLogLevel(log::getLogLevel(__CLASS__));
$cmd .= ' --tvloglevel ' . config::byKey('tvLogLevel', __CLASS__, 'daemon');
$cmd .= ' --logfiltersenabled ' . (config::byKey('logFiltersEnabled', __CLASS__, '0') ? '1' : '0');
$cmd .= ' --pluginversion ' . config::byKey('pluginVersion', __CLASS__, '0.0.0');
$cmd .= ' --socketport ' . config::byKey('socketport', __CLASS__, '55112');
$cmd .= ' --cyclefactor ' . config::byKey('cyclefactor', __CLASS__, '1.0');
Expand Down Expand Up @@ -559,6 +560,28 @@ public function disableADBToDaemon() {
}
}

public static function createLogFiltersFile() {
$path = dirname(__FILE__) . '/../../data/filters/logfilters.json';
if (!file_exists($path)) {
file_put_contents($path, '[]');
}
}

public static function getLogFiltersFileContent() {
$path = dirname(__FILE__) . '/../../data/filters/logfilters.json';
if (!file_exists($path)) {
return array();
}
return json_decode(file_get_contents($path), true) ?: array();
}

public static function saveLogFilters($filters) {
$path = dirname(__FILE__) . '/../../data/filters/logfilters.json';
if (file_put_contents($path, json_encode($filters, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)) === false) {
throw new Exception(__('Impossible d\'enregistrer le fichier logfilters.json', __FILE__));
}
}

public static function pairingException($_data) {
if (!isset($_data['pairing_mac'])) {
log::add('tvremote', 'error', '[PAIRING][EXCEPTION] Information manquante (MAC) pour mettre à jour l\'équipement');
Expand Down
27 changes: 26 additions & 1 deletion core/i18n/de_DE.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
{
"plugins\/tvremote\/core\/ajax\/tvremote.ajax.php": {
"401 - Accès non autorisé": "401 - Unberechtigter Zugriff",
"Aucune méthode correspondante à": "Keine passende Methode zu"
"Aucune méthode correspondante à": "Keine passende Methode zu",
"Format de données invalide": "Ungültiges Datenformat"
},
"plugins\/tvremote\/core\/class\/tvremote.class.php": {
"0": "0",
Expand Down Expand Up @@ -36,6 +37,7 @@
"HDMI 3": "HDMI 3",
"HDMI 4": "HDMI 4",
"Home": "Home",
"Impossible d\\'enregistrer le fichier logfilters.json": "Die Datei „logfilters.json“ kann nicht gespeichert werden",
"Impossible de lancer le démon, vérifiez le log": "Der Dämon kann nicht gestartet werden, überprüfen Sie das Log",
"Info": "Info",
"Input": "Input",
Expand Down Expand Up @@ -84,6 +86,13 @@
"plugins\/tvremote\/core\/php\/jeetvremote.php": {
"Vous n\\'etes pas autorisé à effectuer cette action": "Sie sind nicht berechtigt, diese Aktion durchzuführen"
},
"plugins\/tvremote\/desktop\/js\/logfilters.tvremote.js": {
"Erreur lors de la sauvegarde": "Fehler beim Speichern",
"Ex: Cannot connect (device may be offline)": "Beispiel: Verbindung nicht möglich (Gerät ist möglicherweise offline)",
"Filtres sauvegardés": "Gespeicherte Filter",
"Redémarrez le démon pour appliquer les changements": "Starten Sie den Daemon neu, um die Änderungen zu übernehmen",
"Supprimer": "Löschen"
},
"plugins\/tvremote\/desktop\/js\/tvremote.js": {
"ADB Shell": "ADB-Shell",
"Afficher": "Anzeigen",
Expand Down Expand Up @@ -116,6 +125,18 @@
"Échec de l'appairage ADB pour": "Fehler beim ADB-Pairing für",
"Échec de l'appairage TVRemote pour": "Fehler beim Koppeln von TVRemote für"
},
"plugins\/tvremote\/desktop\/modal\/logfilters.tvremote.php": {
"401 - Accès non autorisé": "401 - Unberechtigter Zugriff",
"Actif": "Aktiv",
"Ajouter": "Hinzufügen",
"Définissez les patterns à intercepter et le niveau de log à appliquer. Cochez\/décochez pour activer\/désactiver une règle sans la perdre.": "Legen Sie die abzufangenden Muster und die anzuwendende Protokollierungsstufe fest. Aktivieren oder deaktivieren Sie das Kontrollkästchen, um eine Regel zu aktivieren bzw. zu deaktivieren, ohne sie zu verlieren.",
"Niveau cible": "Zielniveau",
"Pattern (sous-chaîne du message de log)": "Muster (Teilzeichenfolge der Protokollmeldung)",
"Sauvegarder": "Speichern",
"Suggestions :": "Vorschläge:",
"Tout activer": "Alles aktivieren",
"Tout désactiver": "Alles deaktivieren"
},
"plugins\/tvremote\/desktop\/php\/tvremote.php": {
"401 - Accès non autorisé": "401 - Unberechtigter Zugriff",
"ADB": "ADB",
Expand Down Expand Up @@ -196,6 +217,8 @@
"Vous disposez de 5 minutes pour entrer le code après avoir cliqué sur Appairer.": "Sie haben nach dem Klicken auf „Koppeln“ 5 Minuten Zeit, um den Code einzugeben."
},
"plugins\/tvremote\/plugin_info\/configuration.php": {
"Active la personnalisation des niveaux de log. Les filtres sont définis dans la fenêtre de gestion dédiée.": "Aktiviert die Anpassung der Protokollstufen. Die Filter werden im entsprechenden Verwaltungsfenster definiert.",
"Activer les filtres de logs": "Log-Filter aktivieren",
"Certificat ADB": "ADB-Zertifikat",
"Certificat TVRemote": "TVRemote-Zertifikat",
"Cocher cette case désactivera les messages de mise à jour du plugin dans le centre de message": "Wenn Sie dieses Kästchen ankreuzen, werden die Update-Meldungen des Plugins im Nachrichtencenter deaktiviert.",
Expand All @@ -206,10 +229,12 @@
"Désactiver les messages de MàJ": "Update-Meldungen deaktivieren",
"Error": "Fehler",
"Facteur multiplicateur des cycles du démon (Défaut = x1)": "Multiplikationsfaktor der Dämonenzyklen (Standard = x1)",
"Filtres de logs": "Protokollfilter",
"Force la réinitialisation de PyEnv": "Erzwingt das Zurücksetzen von PyEnv",
"Force la réinitialisation de Venv": "Erzwingt das Zurücksetzen von Venv",
"Force les mises à jour Systèmes": "Erzwingt Aktualisierungen Systeme",
"Fréquence des cycles": "Häufigkeit der Zyklen",
"Gérer les filtres": "Filter verwalten",
"Identique au démon (défaut)": "Identisch mit dem Daemon (Standard)",
"Info": "Info",
"Le démon devra être redémarré après cette action": "Der Daemon muss nach dieser Aktion neu gestartet werden.",
Expand Down
27 changes: 26 additions & 1 deletion core/i18n/en_US.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
{
"plugins\/tvremote\/core\/ajax\/tvremote.ajax.php": {
"401 - Accès non autorisé": "401 - Unauthorized access",
"Aucune méthode correspondante à": "No corresponding method for"
"Aucune méthode correspondante à": "No corresponding method for",
"Format de données invalide": "Invalid data format"
},
"plugins\/tvremote\/core\/class\/tvremote.class.php": {
"0": "0",
Expand Down Expand Up @@ -36,6 +37,7 @@
"HDMI 3": "HDMI 3",
"HDMI 4": "HDMI 4",
"Home": "Home",
"Impossible d\\'enregistrer le fichier logfilters.json": "Unable to save the logfilters.json file",
"Impossible de lancer le démon, vérifiez le log": "Unable to start daemon, check log",
"Info": "Info",
"Input": "Input",
Expand Down Expand Up @@ -84,6 +86,13 @@
"plugins\/tvremote\/core\/php\/jeetvremote.php": {
"Vous n\\'etes pas autorisé à effectuer cette action": "You are not authorized to perform this action"
},
"plugins\/tvremote\/desktop\/js\/logfilters.tvremote.js": {
"Erreur lors de la sauvegarde": "Error while saving",
"Ex: Cannot connect (device may be offline)": "Example: Cannot connect (device may be offline)",
"Filtres sauvegardés": "Saved filters",
"Redémarrez le démon pour appliquer les changements": "Restart the daemon to apply the changes",
"Supprimer": "Delete"
},
"plugins\/tvremote\/desktop\/js\/tvremote.js": {
"ADB Shell": "ADB Shell",
"Afficher": "Display",
Expand Down Expand Up @@ -116,6 +125,18 @@
"Échec de l'appairage ADB pour": "ADB pairing failed for",
"Échec de l'appairage TVRemote pour": "TVRemote pairing failed for"
},
"plugins\/tvremote\/desktop\/modal\/logfilters.tvremote.php": {
"401 - Accès non autorisé": "401 - Unauthorized access",
"Actif": "Active",
"Ajouter": "Add",
"Définissez les patterns à intercepter et le niveau de log à appliquer. Cochez\/décochez pour activer\/désactiver une règle sans la perdre.": "Define the patterns to intercept and the logging level to apply. Check or uncheck the box to enable or disable a rule without losing it.",
"Niveau cible": "Target level",
"Pattern (sous-chaîne du message de log)": "Pattern (substring of the log message)",
"Sauvegarder": "Save",
"Suggestions :": "Suggestions:",
"Tout activer": "Turn everything on",
"Tout désactiver": "Turn everything off"
},
"plugins\/tvremote\/desktop\/php\/tvremote.php": {
"401 - Accès non autorisé": "401 - Unauthorized access",
"ADB": "ADB",
Expand Down Expand Up @@ -196,6 +217,8 @@
"Vous disposez de 5 minutes pour entrer le code après avoir cliqué sur Appairer.": "You have 5 minutes to enter the code after clicking Pair."
},
"plugins\/tvremote\/plugin_info\/configuration.php": {
"Active la personnalisation des niveaux de log. Les filtres sont définis dans la fenêtre de gestion dédiée.": "Active customization of log levels. Filters are defined in the dedicated management window.",
"Activer les filtres de logs": "Enable log filters",
"Certificat ADB": "ADB certificate",
"Certificat TVRemote": "TVRemote certificate",
"Cocher cette case désactivera les messages de mise à jour du plugin dans le centre de message": "Checking this box will disable plugin update messages in the message center.",
Expand All @@ -206,10 +229,12 @@
"Désactiver les messages de MàJ": "Disable update messages",
"Error": "Error",
"Facteur multiplicateur des cycles du démon (Défaut = x1)": "Demon cycle multiplication factor (Default = x1)",
"Filtres de logs": "Log filters",
"Force la réinitialisation de PyEnv": "Force PyEnv reset",
"Force la réinitialisation de Venv": "Force reset Venv",
"Force les mises à jour Systèmes": "Force system updates",
"Fréquence des cycles": "Cycle frequency",
"Gérer les filtres": "Manage filters",
"Identique au démon (défaut)": "Same as the (default) daemon",
"Info": "Info",
"Le démon devra être redémarré après cette action": "The daemon will need to be restarted after this action.",
Expand Down
27 changes: 26 additions & 1 deletion core/i18n/es_ES.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
{
"plugins\/tvremote\/core\/ajax\/tvremote.ajax.php": {
"401 - Accès non autorisé": "401 - Acceso no autorizado",
"Aucune méthode correspondante à": "Ningún método correspondiente a"
"Aucune méthode correspondante à": "Ningún método correspondiente a",
"Format de données invalide": "Formato de datos no válido"
},
"plugins\/tvremote\/core\/class\/tvremote.class.php": {
"0": "0",
Expand Down Expand Up @@ -36,6 +37,7 @@
"HDMI 3": "HDMI 3",
"HDMI 4": "HDMI 4",
"Home": "Inicio",
"Impossible d\\'enregistrer le fichier logfilters.json": "No se puede guardar el archivo logfilters.json",
"Impossible de lancer le démon, vérifiez le log": "No se puede iniciar el demonio, compruebe el registro",
"Info": "Información",
"Input": "Entrada",
Expand Down Expand Up @@ -84,6 +86,13 @@
"plugins\/tvremote\/core\/php\/jeetvremote.php": {
"Vous n\\'etes pas autorisé à effectuer cette action": "No está autorizado a realizar esta acción"
},
"plugins\/tvremote\/desktop\/js\/logfilters.tvremote.js": {
"Erreur lors de la sauvegarde": "Error al guardar",
"Ex: Cannot connect (device may be offline)": "Ej.: No se puede conectar (es posible que el dispositivo esté desconectado)",
"Filtres sauvegardés": "Filtros guardados",
"Redémarrez le démon pour appliquer les changements": "Reinicia el demonio para aplicar los cambios",
"Supprimer": "Borrar"
},
"plugins\/tvremote\/desktop\/js\/tvremote.js": {
"ADB Shell": "ADB Shell",
"Afficher": "Ver",
Expand Down Expand Up @@ -116,6 +125,18 @@
"Échec de l'appairage ADB pour": "Error al emparejar ADB para",
"Échec de l'appairage TVRemote pour": "Error al emparejar TVRemote para"
},
"plugins\/tvremote\/desktop\/modal\/logfilters.tvremote.php": {
"401 - Accès non autorisé": "401 - Acceso no autorizado",
"Actif": "Activo",
"Ajouter": "Añadir",
"Définissez les patterns à intercepter et le niveau de log à appliquer. Cochez\/décochez pour activer\/désactiver une règle sans la perdre.": "Define los patrones que se deben interceptar y el nivel de registro que se debe aplicar. Marca o desmarca la casilla para activar o desactivar una regla sin perderla.",
"Niveau cible": "Nivel objetivo",
"Pattern (sous-chaîne du message de log)": "Patrón (subcadena del mensaje de registro)",
"Sauvegarder": "Guardar",
"Suggestions :": "Sugerencias:",
"Tout activer": "Activar todo",
"Tout désactiver": "Desactivarlo todo"
},
"plugins\/tvremote\/desktop\/php\/tvremote.php": {
"401 - Accès non autorisé": "401 - Acceso no autorizado",
"ADB": "ADB",
Expand Down Expand Up @@ -196,6 +217,8 @@
"Vous disposez de 5 minutes pour entrer le code après avoir cliqué sur Appairer.": "Tienes 5 minutos para introducir el código después de hacer clic en Emparejar."
},
"plugins\/tvremote\/plugin_info\/configuration.php": {
"Active la personnalisation des niveaux de log. Les filtres sont définis dans la fenêtre de gestion dédiée.": "Activa la personalización de los niveles de registro. Los filtros se definen en la ventana de gestión correspondiente.",
"Activer les filtres de logs": "Activar los filtros de registros",
"Certificat ADB": "Certificado ADB",
"Certificat TVRemote": "Certificado TVRemote",
"Cocher cette case désactivera les messages de mise à jour du plugin dans le centre de message": "Al marcar esta casilla, se desactivarán los mensajes de actualización del complemento en el centro de mensajes.",
Expand All @@ -206,10 +229,12 @@
"Désactiver les messages de MàJ": "Desactivar los mensajes de actualización",
"Error": "Error",
"Facteur multiplicateur des cycles du démon (Défaut = x1)": "Factor de multiplicación del ciclo Demon (Por defecto = x1)",
"Filtres de logs": "Filtros de registros",
"Force la réinitialisation de PyEnv": "Forzar reinicio de PyEnv",
"Force la réinitialisation de Venv": "Forzar reinicio de Venv",
"Force les mises à jour Systèmes": "Forzar actualizaciones del sistema",
"Fréquence des cycles": "Frecuencia de ciclo",
"Gérer les filtres": "Gestionar los filtros",
"Identique au démon (défaut)": "Igual que el demonio (por defecto)",
"Info": "Información",
"Le démon devra être redémarré après cette action": "El demonio deberá reiniciarse después de esta acción.",
Expand Down
Loading