K7 serveur média

J'utilise le user 1000:1000 pour lancer le container
Le container utilise l'ID 911 (PUID et PGID) puis tu indiques tes ID pour tes dossiers médias.
J'ai testé le container avec mes ID et ça ne fonctionne pas (?) - c'est spécifié dans le GitHub et sur le YAML
Code:
# Optional: match host UID/GID to media volume ownership (container defaults to 911)
PUID=999
PGID=1000
Comment customiser l'ajour de librairie média dans les volumes ?
Non tu rajoutes comme d'hab ci-après extrait du mien (juste 2 volumes de mappés dans lesquels sont les dossiers des médias). Ton mappage semble bon.
Code:
      - /media/MEDIAS:/media/series:ro
      - /media/STOCKAGE:/media/videos:ro
Message automatiquement fusionné :

- Tu devrais taggé la ligne Token avec le mot clé 'K7_SETUP_TOKEN' dans les logs pour qu'on puisse le retrouver plus facilement en ligne de commanBienvenuede car j'avoue que c'est difficile quand on es noyé par les messages d'erreurs de retrouver la bonne ligne.
- L'utilisation de la ligne 'K7_SETUP_TOKEN' dans le fichier environnements et la section environnement du compose ne semble pas fonctionner
Bienvenue au club :ROFLMAO: :ROFLMAO: :ROFLMAO:
 
  • J'aime
Réactions: Bambusa29
Le défaut est 911, mais je comprends qu'il faut que les médias est le même UID et GID que l'hôte, ce qui est le cas chez moi (1000:1000), sinon c'est inutile de spécifier le UID et GID dans le compose ?

C'set bien préciser ici dans le compose :

YAML:
environment:     
      PUID: ${PUID:-911}
      PGID: ${PGID:-911}

Sinon pour le matching media - hôte :


Capture d’écran du 2026-08-08 23-21-14.png

Capture d’écran du 2026-08-08 23-28-19.png
 
Dernière édition:
Wow je m'attendais pas à autant de réponses d'un coup sur ce thread 😂 Merci à tous, je vais tenter de tous vous répondre!

Super projet même si la dépendance à docker est rédhibitoire me concernant. Tous mes encouragements ! :cool:
Alors figures toi @cooper que dans les faits, c'est une fausse dépendance, je l'ai indiqué en tant que tel parce que c'est plus facile pour moi d'offrir de l'aide si l'installation de tout le monde est quasi la même.. En réalité tu peux très bien installer K7 en bare-metal mais ça nécessite plus de travail évidemment:
- installer le sdk .net10
- installer ffmpeg (et ffprobe)
- builder l'application depuis le code source
- optionnel: avoir une base de données postgres qui tourne localement (sinon tu peux passer par sqlite)
- configurer les paramètres soit via variable d'environnement sur ta machine soit via le fichier appsettings.json
- lancer l'application en mode daemon ou service
Il manque peut-être une ou deux étapes mais j'ai jamais vraiment essayé de déployer en bare-metal moi même 😬

J'ai regardé ton code, c'est du 'C Sharp' comme Jellyfin. Tu es reparti de 0 ou tu t'es inspiré du code source de Jellyfin ?
Je suis reparti de 0 et par contre j'ai piqué des idées par-ci par-là autant sur Jellyfin que sur Plex et d'autres 👍

As tu prévu d'ajouter la prise en charge de 'MariaDB/MySQL' ?
Pas spécialement, tu y vois un usage? Je trouvais qu'avoir sqlite (mode déploiement rapide, pour aller vite ou tester rapidement) et postgres en mode installation stable et performante facile à backuper était idéal! J'ai rien sous mariadb/mysql chez moi 😁

Je garde un oeil sur ton projet je suis sur jellyfin et j'avoue qu'un projet avec une appli androidTv plus sympa que celui de jellyfin je dirais pas non ( pas qu'elle soit pas utilisable mais manque de personnalisation et quelque feature manquante )
J'ai encore quelques trucs qui me plaisent sur la version androidtv de mon app qu'il faut que je corrige pour que ce soit à mon sens parfait mais bien sûr le but est toujours de faire mieux! L'app de jellyfin androidtv s'améliore rapidement ces derniers temps en tout cas 👍

- Je n'arrive pas à faire fonctionner la version avec PostgreSQL : Pb de droits sur le fichier 'pg_filenode.map' (les droits semble coder en dur dans le code ?)

=> J'utilise le user 1000:1000 pour lancer le container et parfois j'ai eu le répertoire postgresql sous le user '70', mais avec le bon groupe ?
Mh j'arrive pas à reproduire chez moi quand je lance une installation toute neuve, tu as repris le docker-compose tel quel? Sur le container postgres moi en tout cas j'ai pas précisé le user (et je crois pas que tu devrais le faire, si tu le fais tu dois probablement chown -R 1000:1000 tondossierpostgres car le container lui-même pourra plus le faire lui-même)

- Tu devrais taggé la ligne Token avec le mot clé 'K7_SETUP_TOKEN' dans les logs pour qu'on puisse le retrouver plus facilement en ligne de commande car j'avoue que c'est difficile quand on es noyé par les messages d'erreurs de retrouver la bonne ligne.
- L'utilisation de la ligne 'K7_SETUP_TOKEN' dans le fichier environnements et la section environnement du compose ne semble pas fonctionner
Oui tu as raison, ce serait probablement beaucoup plus facile bonne idée! Je vais ajouter ça à ma TODO 😁
Bizarre ça fonctionne chez moi, je vais regarder de plus près merci 🙏

Comment customiser l'ajour de librairie média dans les volumes ? Y a t- il des mots clés prédéfinis : 'movies'....
Alors tu peux monter tes dossiers comme bon te semble par contre il faut que les dossiers et fichiers soient accessibles en lecture (pas besoin d'écriture) par le user qui fait tourner K7 (tu peux préciser PGID/PUID dans les variables d'environnement par défaut c'est 911:911)
Si on n'a pas les droits de lecture, les dossiers n’apparaissent pas en effet!

Sinon beau travail.
Merci 🙏
 
Le défaut est 911, mais je comprends qu'il faut que les médias est le même UID et GID que l'hôte, ce qui est le cas chez moi (1000:1000), sinon c'est inutile de spécifier le UID et GID dans le compose ?
Chez moi sur synology j'ai bien fait mon mapping comme ceci et ça passe bien! Pour le conteneur K7 tu utilises bien les variables d'environnement PGID et PUID à 1000?
1786260421708.png
 
Installé hier soir, l'apk sur ma ShieldProTV, l'interface est effectivement la même et il est assez aisé de naviguer. En revanche, les vignettes ne s'affichent pas ? Le scan des Séries n'est pas encore totalement fini (ce matin) et l'interface "clignote" ? J'attends ce soir pour faire le point... NB j'ai mis le scan des Séries sur TMDB (que je préfère à TVDB).
 
  • J'adore
Réactions: Kaybi
Installé hier soir, l'apk sur ma ShieldProTV, l'interface est effectivement la même et il est assez aisé de naviguer. En revanche, les vignettes ne s'affichent pas ? Le scan des Séries n'est pas encore totalement fini (ce matin) et l'interface "clignote" ? J'attends ce soir pour faire le point... NB j'ai mis le scan des Séries sur TMDB (que je préfère à TVDB).
Il y a encore des irritants de navigation que j'aimerai traiter, par exemple quand on navigue sur une page, mettre le focus automatiquement sur ce qui est pertinent (sur un film par exemple aller tout de suite sur le bouton play).

Concernant les vignettes, ton indexation doit en effet encore être en cours (tu peux le voir dans /admin/background-tasks en regardant les tâches en attente par exemple).

Je t'aurai plutôt conseillé tvdb car en réalité quand on passe par tvdb on utilise quand même un petit peu tmdb (notamment pour de meilleurs résultats de recherche, pour des images de meilleures qualités) et tvdb est vraiment meilleur sur la notion de saisons et d'informations épisodes!

L'interface qui clignote c'est un bug en effet et c'est marrant que t'en parles car je l'ai corrigé ce matin (soft-patch library groups cards on reidentify)!
1786266088840.png

J'ai toujours voulu une shield! Est-ce que l'interface de navigation est fluide? Est-ce que tu vois du délai sur la navigation?


edit: aussi, que penses-tu de l'interface spécifique TV?
 
J'ai toujours voulu une shield! Est-ce que l'interface de navigation est fluide? Est-ce que tu vois du délai sur la navigation?

C'est de loin une si ce n'est la meilleur box androidTV pour lire des fichiers vidéo. En vrai elle n'a que 2 defaut sont prix et le fait qu'elle ne lise pas le AV1 pour le reste les autres box font soit aussi bien soit moins bien.
 
  • J'aime
Réactions: Kaybi
@Kaybi Voici mon fichier compose (version sqlite) :


YAML:
x-default-restart-security: &default-restart-security
  restart: unless-stopped
  security_opt:
    - no-new-privileges:true

services:
  k7-server:
    <<: *default-restart-security
    container_name: k7-server
    image: ghcr.io/kaybi-gh/k7:latest
    ports:
      - 192.168.2.249:8013:7080/tcp
    devices:
      - /dev/dri:/dev/dri
    volumes:
      # Persist config keys, metadata artwork, logs, and transcoding cache across recreates.
      - /opt/docker/data/k7:/data
      - /mnt/series02/series:/media/series02:ro
      - /mnt/films01/films:/media/films01:ro
      - /mnt/films01/animations:/media/animations:ro
      - /mnt/films01/documentaires:/media/documentaires:ro
      - /mnt/films02/films:/media/films02:ro
      - /mnt/series01/series:/media/series01:ro
      - /opt/data/drive/kDrive/musiques:/media/musiques:ro
    environment:
      #K7_SETUP_TOKEN: ${K7_SETUP_TOKEN}
      Database__Provider: Sqlite
      Database__Name: /data/k7
      Security__ApiKeys__HashSecret: ${SECURITY__APIKEYS__HASHSECRET:?Set SECURITY__APIKEYS__HASHSECRET in .env}
      Paths__Config: /data/config
      Paths__Metadatas: /data/metadatas
      Paths__Logs: /data/logs
      Paths__Transcoding: /data/transcoding
      PUID: ${PUID:-911}
      PGID: ${PGID:-911}
      Security__ForceHttps: ${SECURITY__FORCEHTTPS:-false}
    healthcheck:
      test: ["CMD", "curl", "-fsS", "http://127.0.0.1:7080/health"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 40s

et mon fichier .env

YAML:
# Copy to .env next to docker-compose.yaml and set a strong password:
# cp .env.example .env

K7_SETUP_TOKEN=ppfVe3h6tyL5NTQsUQes7x5RBWX2cKJ6mcjZvzdXJNc

# Optional: match host UID/GID to media volume ownership (container defaults to 911)
PUID=1000
PGID=1000

# Required before issuing API keys (HMAC secret mixed into key hashes).
# Changing it invalidates all existing API keys.
SECURITY__APIKEYS__HASHSECRET=ppfVe3h6tyL5NTQsUQes7x5RBWX2cKJ6mcjZvzdXJNc=
# Or file secret: SECURITY__APIKEYS__HASHSECRET__FILE=/run/secrets/api_keys_hash_secret

Mon répertoire data sur l'hôte :

Bash:
yannick@nas:/opt/docker/data/k7$ ls -al
total 1272
drwxr-xr-x  7 yannick yannick    4096  8 août  23:44 .
drwxr-xr-x  8 yannick yannick    4096  8 août  19:32 ..
drwsrws---  4 yannick yannick    4096  8 août  23:15 config
-rw-r--r--  1 yannick yannick 1273856  8 août  23:44 k7.db
drwsrws---  2 yannick yannick    4096  8 août  23:15 logs
drwsrws---  2 yannick yannick    4096  8 août  23:15 metadatas
drwxr----- 19 yannick yannick    4096  8 août  20:06 postgresql
drwsrws---  2 yannick yannick    4096  8 août  23:15 transcoding
yannick@nas:/opt/docker/data/k7$

Mes medias sur l'hôte :

Bash:
yannick@nas:/opt/docker/data/k7$ ls -al /mnt
total 24
drwxr-xr-x  6 root    root    4096  8 août  23:14 .
drwxr-xr-x 18 root    root    4096 12 juil. 17:35 ..
drwxr-xr-x  6 yannick yannick 4096 21 juil. 13:04 films01
drwxr-xr-x  4 yannick yannick 4096 31 oct.   2023 films02
drwxr-xr-x  5 yannick yannick 4096 14 juil. 01:18 series01
drwxr-xr-x  4 yannick yannick 4096  8 août  23:09 series02
yannick@nas:/opt/docker/data/k7$

ID sur l'hôte

Bash:
yannick@nas:/opt/docker/data/k7$ id yannick
uid=1000(yannick) gid=1000(yannick) groupes=1000(yannick),27(sudo),1001(ssh)
yannick@nas:/opt/docker/data/k7$

Pour le BD ; j'ai l'habitude de travailler depuis très longtemps avec MySQL/MariaDB ; habitude que j'ai gardé avec le temps.
 
Dernière édition:
C'est de loin une si ce n'est la meilleur box androidTV pour lire des fichiers vidéo. En vrai elle n'a que 2 defaut sont prix et le fait qu'elle ne lise pas le AV1 pour le reste les autres box font soit aussi bien soit moins bien.
Ah ça je le sais que trop bien (tout le monde vend ses mérites) mais je posais surtout la question pour mon application K7 vu que moi j'ai pas de shield (💰💰💰) pour tester ça dessus 😢
Au passage ces derniers temps dans mes fils je vois surtout que c'est le Homatics Box R 4K Plus qui a le vent en poupe (av1, dolby atmos) mais pareil niveau tarif ça pique un peu
 
@Kaybi Voici mon fichier compose (version sqlite) :
Ta configuration niveau K7 a l'air bonne en tout cas!
Ca donne quoi si tu tapes ça dans ton terminal?

Code:
docker exec -u 1000:1000 k7-server ls /media/films01
docker exec -u 1000:1000 k7-server ls /media/series01
docker exec -u 1000:1000 k7-server ls /media/musiques

Ton soucis c'est que tu ne vois pas les dossiers dans la création de bibliothèque c'est bien ça? Est-ce que tu peux directement taper par exemple /media/films01 dans le dialog d'exploration des dossiers/fichiers voir si ça fonctionne?
 
L'interface qui clignote c'est un bug en effet et c'est marrant que t'en parles car je l'ai corrigé ce matin (soft-patch library groups cards on reidentify)!
Ce sera dans la prochaine version ?
Je t'aurai plutôt conseillé tvdb car en réalité quand on passe par tvdb on utilise quand même un petit peu tmdb (notamment pour de meilleurs résultats de recherche, pour des images de meilleures qualités) et tvdb est vraiment meilleur sur la notion de saisons et d'informations épisodes!
Pour l'instant, je laisse et j'attends ce soir voir si tout est reconnu (je ne vais pas recommencer vu le temps nécessaire :unsure: Mon premier essai sur un épisode sur la tv n'as pas été probant (image figée et saccade).
J'ai toujours voulu une shield! Est-ce que l'interface de navigation est fluide? Est-ce que tu vois du délai sur la navigation?
La Shield ça fonctionne nickel (Plex et Jellyfin sur Wholphin).
Concernant la navigation sur K7 pas de souci, mais pour l'instant (comme déjà dit) pas de vignettes (affiches) + clignotement de l'interface + lecture saccadée et figée.
que penses-tu de l'interface spécifique TV?
C'est la même que sur le navigateur PC (?). L'identification ne pas poser de problème (classique).
Homatics Box R 4K Plus
Je viens de regarder (aux environs de 200€) mais cela a l'air aussi performant de la Shield (voire peut-être +).
 
Ce sera dans la prochaine version ?
Oui! Je suis en cours de correction sur le playback android tv qui me semblait pas assez fluide actuellement, je vais probablement créer une nouvelle release en fin de journée quand j'aurai bien testé et validé tout ça.

Pour l'instant, je laisse et j'attends ce soir voir si tout est reconnu (je ne vais pas recommencer vu le temps nécessaire :unsure: Mon premier essai sur un épisode sur la tv n'as pas été probant (image figée et saccade).
Si jamais tu passes sous tvdb, rassures toi, ça n'écrasera pas tout ce qui a été déjà identifié et téléchargé (images). Ca fera juste un écrasement au fil de l'eau si jamais tu as activé la refresh automatique des métadonnées dans ta librairie, sinon ce sera que manuel (menu 3 petits points sur la page média Rafraichir les métadonnées)
👍
Je sais qu'on a tendance à oublier vu que la date du premier setup remonte mais en réalité, Jellyfin (peut-être un peu moins Plex vu qu'ils ont leur propre serveur de métadonnées) sont à peu de choses près aussi lents que moi sur l'indexation d'une librairie complète

Concernant la navigation sur K7 pas de souci, mais pour l'instant (comme déjà dit) pas de vignettes (affiches) + clignotement de l'interface + lecture saccadée et figée.
La partie lecture saccadée et figée m'interpelle du coup, comme dit plus haut, je suis en train d'essayer d'améliorer la lecture sur les applications natives dont android tv. Moi de mon côté en tout cas j'ai aucune difficulté à lire des médias sur ma nokia streaming box 8000 (la seule lenteur qui me gêne c'était sur le seeking, le fait de naviguer sur la barre de lecture, qui est trop désagréable). Mes correctifs en cours amélioreront sans doute cette expérience là, je te tiens au courant!

C'est la même que sur le navigateur PC (?). L'identification ne pas poser de problème (classique).
Pas exactement non, par exemple sur TV, les pages home et explore ont un layout différent:
Desktop:
1786271611670.png
TV:
1786271633722.png

Autre exemple avec la page des saisons de série:
Desktop
1786271694473.png

TV:
1786271680628.png

Je viens de regarder (aux environs de 200€) mais cela a l'air aussi performant de la Shield (voire peut-être +).
Alors apparemment c'est un peu moins performant/fluide que la shield mais par contre ça supporte plus de codecs (HDR10, AV-1). La shield gagne aussi sur le support audio à priori!
 
Ta configuration niveau K7 a l'air bonne en tout cas!
Ca donne quoi si tu tapes ça dans ton terminal?

Code:
docker exec -u 1000:1000 k7-server ls /media/films01
docker exec -u 1000:1000 k7-server ls /media/series01
docker exec -u 1000:1000 k7-server ls /media/musiques

Ton soucis c'est que tu ne vois pas les dossiers dans la création de bibliothèque c'est bien ça? Est-ce que tu peux directement taper par exemple /media/films01 dans le dialog d'exploration des dossiers/fichiers voir si ça fonctionne?

Oui ca fonctionne mais rien sur la WebUI.
Sur un précédant message j'avais mis une capture ou l'on voit que les volumes sont bien montés dans le container avec les bons droits (1000:1000) avec le user s'appelant 'Ubuntu' en local :

Aprés le : sudo docker exec -it K7-server /bin/bash

Capture d’écran du 2026-08-08 23-21-14.png
 
Alors figures toi @cooper que dans les faits, c'est une fausse dépendance, je l'ai indiqué en tant que tel parce que c'est plus facile pour moi d'offrir de l'aide si l'installation de tout le monde est quasi la même.. En réalité tu peux très bien installer K7 en bare-metal mais ça nécessite plus de travail évidemment:
- installer le sdk .net10
- installer ffmpeg (et ffprobe)
- builder l'application depuis le code source
- optionnel: avoir une base de données postgres qui tourne localement (sinon tu peux passer par sqlite)
- configurer les paramètres soit via variable d'environnement sur ta machine soit via le fichier appsettings.json
- lancer l'application en mode daemon ou service
Il manque peut-être une ou deux étapes mais j'ai jamais vraiment essayé de déployer en bare-metal moi même 😬

Ah good. Effectivement je testerai sur deux BSD (FreeBSD et NetBSD) pour voir tout ça.
Le gros plus : repose sur une base PostgreSQL :cool:
 
  • J'adore
Réactions: Kaybi
En effet pardon, j'ai lu trop vite!

Tu as quoi en sortie d'API pour ces appels (en étant connecté en tant qu'admin):
- http://ton-uri-k7/api/filesystem/directories?path=/
- http://ton-uri-k7/api/filesystem/directories?path=/media

XML:
{"path":"/","directories":[{"name":"bin","fullPath":"/bin"},{"name":"boot","fullPath":"/boot"},{"name":"data","fullPath":"/data"},{"name":"dev","fullPath":"/dev"},{"name":"etc","fullPath":"/etc"},{"name":"home","fullPath":"/home"},{"name":"k7","fullPath":"/k7"},{"name":"lib","fullPath":"/lib"},{"name":"lib64","fullPath":"/lib64"},{"name":"media","fullPath":"/media"},{"name":"mnt","fullPath":"/mnt"},{"name":"opt","fullPath":"/opt"},{"name":"proc","fullPath":"/proc"},{"name":"root","fullPath":"/root"},{"name":"run","fullPath":"/run"},{"name":"sbin","fullPath":"/sbin"},{"name":"srv","fullPath":"/srv"},{"name":"sys","fullPath":"/sys"},{"name":"tmp","fullPath":"/tmp"},{"name":"usr","fullPath":"/usr"},{"name":"var","fullPath":"/var"}]}

XML:
{"path":"/media","parentPath":"/","directories":[{"name":"animations","fullPath":"/media/animations"},{"name":"documentaires","fullPath":"/media/documentaires"},{"name":"films01","fullPath":"/media/films01"},{"name":"films02","fullPath":"/media/films02"},{"name":"musiques","fullPath":"/media/musiques"},{"name":"series01","fullPath":"/media/series01"},{"name":"series02","fullPath":"/media/series02"}]}
 
XML:
{"path":"/","directories":[{"name":"bin","fullPath":"/bin"},{"name":"boot","fullPath":"/boot"},{"name":"data","fullPath":"/data"},{"name":"dev","fullPath":"/dev"},{"name":"etc","fullPath":"/etc"},{"name":"home","fullPath":"/home"},{"name":"k7","fullPath":"/k7"},{"name":"lib","fullPath":"/lib"},{"name":"lib64","fullPath":"/lib64"},{"name":"media","fullPath":"/media"},{"name":"mnt","fullPath":"/mnt"},{"name":"opt","fullPath":"/opt"},{"name":"proc","fullPath":"/proc"},{"name":"root","fullPath":"/root"},{"name":"run","fullPath":"/run"},{"name":"sbin","fullPath":"/sbin"},{"name":"srv","fullPath":"/srv"},{"name":"sys","fullPath":"/sys"},{"name":"tmp","fullPath":"/tmp"},{"name":"usr","fullPath":"/usr"},{"name":"var","fullPath":"/var"}]}

XML:
{"path":"/media","parentPath":"/","directories":[{"name":"animations","fullPath":"/media/animations"},{"name":"documentaires","fullPath":"/media/documentaires"},{"name":"films01","fullPath":"/media/films01"},{"name":"films02","fullPath":"/media/films02"},{"name":"musiques","fullPath":"/media/musiques"},{"name":"series01","fullPath":"/media/series01"},{"name":"series02","fullPath":"/media/series02"}]}
Là tu me sidères, le serveur te remonte bien l'information comme il faut donc en l'état ça fonctionne.. Tu n'as vraiment rien qui t'est remonté dans le dialog de création de librairie? Tu utilises K7 navigateur ou application native?
Si tu veux on peut s'appeler sur matrix ou discord au besoin 👍
 
J'ai compris mon problème.... Il faut passer par le menu 'Administration' pour monter les répertoires et les voir sous mon profil 😁

Est ce par contre possible de monter plusieurs volumes sous la même librairies ?
 
J'ai compris mon problème.... Il faut passer par le menu 'Administration' pour monter les répertoires et les voir sous mon profil 😁
Ahhhhh j'étais loin d'avoir compris ton problème du coup ahaha désolé!

Est ce par contre possible de monter plusieurs volumes sous la même librairies ?
Alors non une librairie = un path mais par contre tu vas être content car il existe les library-groups, c'est un chapeau qui se met au dessus de ta librarie (une librairie a forcément une et une seule library-group). Et du coup tu peux avoir un library-group "Films" qui chapeaute une librairie "film1" et une "film2" par exemple 👍

Pour aller plus loin dans l'explication, ca permet aussi du coup quand tu profites d'un partage sur ton serveur via la fédération (un autre copain te partage son serveur) de réunir ses films dans ton library-group films par exemple

edit: peut-être qu'en tant qu'admin quand tu arrives sur ta page d'accueil je pourrais ajouter un tips du genre "Configure ta première blibliothèque ICI" qui permettrait un début plus facile