Freebox Player (Revolution / V6)

  • État Fermée
  • Pourcentage achevé
    100%
  • Type Anomalie
  • Catégorie Lecteur multimédia → Client UPnP AV
  • Assignée à
    brouits
  • Système d'exploitation Tous
  • Sévérité Basse
  • Priorité Très Basse
  • Basée sur la version 1.3.18
  • Due pour la version Non décidée
  • Échéance Non décidée
  • Votes 1
  • Privée
Concerne le projet: Freebox Player (Revolution / V6)
Ouverte par frnchfrgg - 09/02/2014
Dernière modification par brouits - 14/10/2016

FS#14261 - Validation des url trop restrictive pour AVTransport/SetAVTransportURI

Les url ne sont acceptées que si elles se terminent par une extension reconnue, comme .ogg ou .ts, hors une url peut être gérée par le Player même si ce n’est pas le cas (think Ogg/Vorbis sans extension mais avec le bon mimetype, ou rtsp://). C’est d’autant plus étrange que le Player n’utilise pas l’extension pour déterminer le format (un .ogg qui contient du .ts est accepté IIRC, ou bien une url rtsp://mon_ip/fichier.ogg qui est bien utilisée par libfbxrtsp comme adresse du SDP).

Pourquoi cette limitation arbitraire ?

Fermée par  brouits
14.10.2016 12:52
Raison de la fermeture :  Ticket invalide
Commentaires de fermeture :  

ajouter les méta-données DIDL, cela fonctionnera même sans extension

Admin
brouits a commenté le 12.05.2014 17:19

Bonjour,
L'acceptation du contenu set fait en priorité via l'analyse des tags xml fournies en méta-données à setAVTransportURI. Votre control-point ou media-server fournit-il un DIDL suffisament renseigné ? si vous voulez bien en poster un exemple ici, je pourrais voir si on peut déterminer le mime-type.
Merci

  • Je crée un serveur HTTP avec VLC, qui sert http://mon_ip/stream
  • J'appelle setAVTransportURI avec cette URI en argument (avec le framework Coherence via Python, ou même "à la main" avec uPNPInspector de gupnp-tools)

Le contenu est refusé.

Si l'adresse contient une extension "reconnue" par le Player, comme .ogg ou .ts le contenu est accepté quand bien même il ne correspond absolument pas à l'extension en question. Pour moi ça ressemble à une whitelist d'extensions. Pour servir du OGG par http c'est pas vraiment un problème, par contre pour du RTSP c'est bizarre de coller un .ts à l'URL du flux de contrôle SDP.

Je n'ai pas cherché du côté des méta-données. J'essaierai de voir si fournir ces informations permet de débrayer la vérification de l'extension de l'url.

Pour référence, voilà le script Python que j'utilise (J'ai un équivalent pour RTSP, mais il est plus compliqué donc moins minimal).

#!/usr/bin/env python

from __future__ import print_function

import subprocess, itertools, operator
import twisted.internet, coherence.base, socket


C_MediaRenderer = "urn:schemas-upnp-org:device:MediaRenderer:1"
C_DeviceName    = "Freebox Player"
C_StreamURL     = ":8081/stream.ogg"
C_Transcode     = "acodec=vorbis,ab=320,channels=2," \
                  "samplerate=44100"


class Controller(object):
    def __init__(self, reactor):
        reactor.addSystemEventTrigger('before', 'shutdown', self.stop)
        reactor.callWhenRunning(self.start)
        self.coherence = None
        self.device = None
        self.vlc = None
        reactor.run()

    def start(self):
        if self.coherence:
            return
        self.coherence = coherence.base.Coherence({
                'logmode': 'warning',
                'controlpoint': 'yes'})
        self.coherence.connect(self.found,
                'Coherence.UPnP.Device.detection_completed')

    def stop(self):
        if self.vlc:
            self.vlc.terminate()
        if self.device:
            self.device.client.av_transport.stop()

    @property
    def default_source(self):
        try:
            line = next(itertools.ifilter(
                    operator.methodcaller("startswith", "Default Sink"),
                    subprocess.check_output(["pactl", "info"]).split("\n")
                ))
            _, sink = line.split(":", 1)
        except (StopIteration, ValueError):
            return ""
        return sink.strip() + ".monitor"

    @staticmethod
    def find_ip_facing(dest_url):
        try:
            _, url = dest_url.split("://", 1)
        except ValueError:
            url = dest_url
        try:
            host, port = url.rsplit(":", 1)
        except ValueError:
            host, port = url, 80
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect((host, int(port)))
        return s.getsockname()[0]

    def found(self, device):
        if not (device.device_type == C_MediaRenderer
                and device.friendly_name == C_DeviceName
                and device.client):
            return

        if not self.vlc:
            self.vlc = subprocess.Popen([
                    "cvlc", "-vvv",
                    "pulse://{}".format(self.default_source),
                    ":sout=#transcode{{{}}}"
                    ":std{{access=http,mux=ogg,dst={}}}".format(
                        C_Transcode, C_StreamURL),
                ])

        if self.device:
            return
        self.device = device

        my_ip = self.find_ip_facing(device.urlbase)
        device.client.av_transport.set_av_transport_uri(0,
                "http://{}{}".format(my_ip, C_StreamURL))


Controller(twisted.internet.reactor)
Admin
brouits a commenté le 13.05.2014 11:18

Bonjour,
Sans méta-données contenant un mime-type, le renderer ne peut savoir si le contenu est jouable. C'est là qu'il se fie à l'extension.
Mais si vous ajoutez les méta-données DIDL, cela fonctionnera même sans extension.
Le DIDL doit être échappé et inclus dans le tag CurrentURIMetaData.

Chargement...

Activer les raccourcis clavier

Liste des tâches

Détails de la tâche

Édition de la tâche