Du bist nicht angemeldet.

#1 25.05.2017 14:12:55

lemondreas
Mitglied

[python] vivaldi, NativeMessagingHost, youtube-dl, wo ist der Haken?

Ahoi zusammen.

Die Ausgangslage ist folgende:
Ich habe mir eine Extension für Chrome-ähnliche Browser gebastelt.
Ziel ist es, von einer beliebigen Video/Audio Seite eine mp3 zu erzeugen.
Das funktioniert mit NativeMessagingHosts.
Mein Host ist ein Python-Script, welches youtube.dl einbindet und darüber die videos/audios ergattert.

In Chrome/Chromium/Opera funktioniert der Spaß auch wie er sollte, in Vivaldi nicht ganz.
Hier mal der Host:

#!/usr/bin/env python

from __future__ import unicode_literals
import youtube_dl
import struct
import sys
import threading

# Thread that reads messages from the webapp.
def read_thread_func(queue):
  message_number = 0
  while 1:
    # Read the message length (first 4 bytes).
    text_length_bytes = sys.stdin.read(4)

    if len(text_length_bytes) == 0:
      sys.exit(0)

    # Unpack message length as 4 byte integer.
    text_length = struct.unpack('i', text_length_bytes.encode('utf-8'))[0]

    # Read the text (JSON object) of the message.
    text = sys.stdin.read(text_length)

    # start download function
    ytdl()

def logit(msg):
    f = open('logfile', 'a')
    f.write(msg+"\n")
    f.close()

def ytdl():
    url = "https://www.youtube.com/watch?v=B7bqAsxee4I"

    # Logger Class to know what happens
    class MyLogger(object):
        def debug(self, msg):
            logit("[debug]"+msg)
        def warning(self, msg):
            logit("[warning]"+msg)
        def error(self, msg):
            logit("[error]"+msg)

    # youtube-dl parameter
    path = "/home/user/Downloads/"
    ydl_opts = {
        'format': 'bestaudio',
        'noplaylist' : True,
        'outtmpl': path+'%(title)s.%(ext)s',
        'verbose': True,
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'mp3',
            'preferredquality': '192',
        }],
        'progress_hooks': [my_hook],
        'logger': MyLogger(),
    }

    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        ydl.download([url])

def Main():
    read_thread_func(None)
    sys.exit(0)

if __name__ == '__main__':
  Main()

Videos werden geladen, aber er hängt sich auf, wenn es ans Extrahieren von Audio geht:

[download] 100% of 873.61KiB in 00:00
[debug][ffmpeg] Correcting container in "/home/user/Downloads/videotitle.m4a"
[debug][debug] ffmpeg command line: ffmpeg -y -i 'file:/home/user/Downloads/videotitle.m4a' -c copy -f mp4 'file:/home/user/Downloads/videotitle.m4a'
[error]ERROR: Did you mean file:file:/home/user/Downloads/videotitle.m4a?
[error]Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/youtube_dl/YoutubeDL.py", line 1942, in post_process
files_to_delete, info = pp.run(info)
File "/usr/lib/python3.6/site-packages/youtube_dl/postprocessor/ffmpeg.py", line 530, in run
self.run_ffmpeg(filename, temp_filename, options)
File "/usr/lib/python3.6/site-packages/youtube_dl/postprocessor/ffmpeg.py", line 208, in run_ffmpeg
self.run_ffmpeg_multiple_files([path], out_path, opts)
File "/usr/lib/python3.6/site-packages/youtube_dl/postprocessor/ffmpeg.py", line 204, in run_ffmpeg_multiple_files
raise FFmpegPostProcessorError(msg)
youtube_dl.postprocessor.ffmpeg.FFmpegPostProcessorError: Did you mean file:file:/home/user/Downloads/videotitle.m4a?

Ich vermute, das hängt damit zusammen, dass irgendwo ein zweites "file:" in die Befehlszeile rutscht, was in den anderen Browsern nicht passiert.
Nun ist die Frage, warum.

Das Vivaldi-Forum scheint wenig Interesse daran zu haben und die youtube-dl community hat mein Issue geschlossen ohne groß drauf einzugehen.
Findet sich hier jemand, der sich mit der Materie auskennt?

Hat Vivaldi besondere Umgebungsvariablen, die dafür verantwortlich sind?
Ich weiß nicht so recht, wo ich anfangen soll zu suchen.

Beitrag geändert von lemondreas (25.05.2017 14:18:17)

Offline

#2 25.05.2017 22:28:08

Schard-nologin
Gast

Re: [python] vivaldi, NativeMessagingHost, youtube-dl, wo ist der Haken?

Was passiert, wenn du den Pfad mit "//" statt "/" beginnen lässt?

#3 28.05.2017 15:52:12

lemondreas
Mitglied

Re: [python] vivaldi, NativeMessagingHost, youtube-dl, wo ist der Haken?

ein "//" im Pfad bringt auch keine Änderungen.

Habe den Code noch etwas umgeändert, chrome/chromium/opera machen was sie sollen, nur vivaldi meldet immer noch den Fehler mit "file:file:"

Ich will nur mal verstehen, was der Browser mit dem Ausführen von Python zu tun hat. Wird es je nach Browser anders gehandelt? Andere Umgebungsvariablen?

Hier der aktuelle code:

#!/usr/bin/env python3
import sys
import json
import struct
import youtube_dl
import taglib
import logging

logging.basicConfig(filename='logfile',level=logging.DEBUG)

class MyLogger(object):
    def debug(self, msg):
        logging.debug(msg)
    def warning(self, msg):
        logging.warning(msg)
    def error(self, msg):
        logging.error(msg)

def getInfo(url):

   #kommt noch

def download(url):

    def my_hook(g):

        if g['status'] == 'finished':
            send_msg('{"status":"converting"}')

    path = "/home/user/"
    destination = path+'%(title)s.%(ext)s'
    ydl_opts = {
        'format': 'bestaudio',
        'noplaylist' : True,
        'outtmpl': destination,
        'verbose': True,
        'keepvideo': True,
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'mp3',
            'preferredquality': '192',
        }],
        'progress_hooks': [my_hook],
        'logger': MyLogger(),
    }

    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        info = ydl.extract_info(str(url), download=False)
        #download_target = ydl.prepare_filename(info)
        ydl.download([url])

# Function to send a message to chrome.
def send_msg(MSG_DICT):
    # Converts dictionary into string containing JSON format.
    msg_json = json.dumps([MSG_DICT], separators=(",", ":"))
    # Encodes string with UTF-8.
    msg_json_utf8 = msg_json.encode("utf-8")
    # Writes the message size. (Writing to buffer because writing bytes object.)
    sys.stdout.buffer.write(struct.pack("i", len(msg_json_utf8)))
    # Writes the message itself. (Writing to buffer because writing bytes object.)
    sys.stdout.buffer.write(msg_json_utf8)
    sys.stdout.flush()


# Function to read a message from chrome.
def read_msg():
    # Reads the first 4 bytes of the message (which designates message length).
    text_length_bytes = sys.stdin.buffer.read(4)
    # Unpacks the first 4 bytes that are the message length. [0] required because unpack returns tuple with required data at index 0.
    text_length = struct.unpack("i", text_length_bytes)[0]
    # Reads and decodes the text (which is JSON) of the message.
    text_undecoded = sys.stdin.buffer.read(text_length).decode("utf-8")
    # [...] Then use the data.

    msg = json.loads(text_undecoded)

    if 'getinfo' in msg:
        vidinfo = getInfo(msg['getinfo'])
        send_msg(vidinfo)

    if 'download' in msg:
        download(msg['download'])

def Main():
    read_msg()
    sys.exit(0)

if __name__ == '__main__':
  Main()

Beitrag geändert von lemondreas (28.05.2017 16:29:43)

Offline

#4 30.05.2017 13:37:23

lemondreas
Mitglied

Re: [python] vivaldi, NativeMessagingHost, youtube-dl, wo ist der Haken?

Nach ausgiebigem Herumprobieren ist mir aufgefallen, dass meine kleine Anwendung wunderbarst läuft, wenn ich das Paket vivaldi-ffmpeg-codecs entferne.
Das bedeutet für mich, die ffmpeg-version, die ich auf dem System habe, funkioniert, und mein Script auch.

Wenn das Script allerdings durch den Browser aufgerufen wird, läuft das erst mal über "/opt/vivaldi/lib/libffmpeg.so" und bringt den Fehler mit den Pfaden.
Außerdem ist mir aufgefallen, dass meine system-version keine Probleme mit dem opus-Codec hat, vivaldi-ffmpeg-codecs dagegen schon, er wird nicht vollständig erkannt.

Lässt sich in Python irgendwie festlegen, welche ffmpeg-libs verwendet werden sollen?

Falls es jemand interessiert:
Ich hab mal alles auf GitHub gestellt.

https://github.com/le-mon/vid2mp3/

Beitrag geändert von lemondreas (30.05.2017 19:42:54)

Offline

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Deine Antwort

Fußzeile des Forums