Fehler, den ich nicht verstehe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
JakobPrie
User
Beiträge: 91
Registriert: Sonntag 21. Juni 2020, 11:12

Hallo,
es geht 1. um die Methode download_video (glaube ich zumindestens) und habe folgenden Fehler:

Code: Alles auswählen

unsupported operand type(s) for /: 'str' and 'str'
Die Klasse sieht wie folgt aus:

Code: Alles auswählen

from bs4 import BeautifulSoup
from pathlib import Path
import requests
from urllib.parse import urlparse
import subprocess

TAGESSCHAU_URL = "https://www.tagesschau.de/100sekunden/"
DOWNLOAD_PATH = "/home/pi/Desktop/LUNA/Zimmer/modules/resources"


def handle():
    try:
        print(f"Hole Video-URL von {TAGESSCHAU_URL} ...")
        url = get_video_url()
        print(f"Lade Video von {url} herunter ...")
        path = download_video(url)
        print(f"Video wurde gespeichert unter {path}")
        print(f"Konvertiere Video in Audio ...")
        convert_to_wav(path)
        print(f"Video kovertiert")
        luna.play(path)
    except Exception as e:
        print(f"Abbruch durch Fehler: {e}")

def get_content(url):
    response = requests.get(url)
    response.raise_for_status()
    return response.content

def get_video_url():
    soup = BeautifulSoup(get_content(TAGESSCHAU_URL), "html.parser")
    meta = soup.find("meta", {"name": "twitter:player:stream"})
    if not meta or not meta.has_attr("content"):
        raise ValueError("Konnte keine Infos zur Video-URL finden")
    return meta["content"]

def download_video(url):
    filename = 'tagesschau_100sec.mp4'
    path = DOWNLOAD_PATH / filename
    path.write_bytes(get_content(url))
    return path

def convert_to_wav(path):
    subprocess.call(["ffmpeg", "-i", path, "-ac", "2", "-f", "wav", "tagesschau_100sec.wav"])


if __name__ == "__main__":
    main()
2. Außerdem glaube ich, dass in def convert_to_wav() nicht ganz funktioniert, da der Pfad ja nicht vollständig ist. Die Datei liegt in /home/pi/Desktop/LUNA/Zimmer/modules/resources. Wie muss ich das dann angeben?
Vielen Dank für eure Hilfe!
Liebe Grüße,
Jakob
Sirius3
User
Beiträge: 17831
Registriert: Sonntag 21. Oktober 2012, 17:20

DOWNLOAD_PATH muss vom Typ Path sein, nicht str. Die Fehlerbehandlung in `handle` ist nicht sinnvoll und kann ersatzlos gelöscht werden. `main` ist nicht definiert.
Zu 2) was ist da deiner Meinung nach nicht vollständig?
JakobPrie
User
Beiträge: 91
Registriert: Sonntag 21. Juni 2020, 11:12

Sirius3 hat geschrieben: Sonntag 28. Juni 2020, 17:15 DOWNLOAD_PATH muss vom Typ Path sein, nicht str. Die Fehlerbehandlung in `handle` ist nicht sinnvoll und kann ersatzlos gelöscht werden. `main` ist nicht definiert.
Zu 2) was ist da deiner Meinung nach nicht vollständig?
Danke für deine Hilfe!
Wie bekomme ich denn DOWNLOAD_PATH zu einem Path-Typ?
Sirius3
User
Beiträge: 17831
Registriert: Sonntag 21. Oktober 2012, 17:20

Code: Alles auswählen

DOWNLOAD_PATH = Path("/home/pi/Desktop/LUNA/Zimmer/modules/resource")
Benutzeravatar
__blackjack__
User
Beiträge: 13246
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Bei der Umwandlung in WAV würde ich den Namen der Ausgabedatei noch ein bisschen mehr am Original ausrichten und nur die Dateiendung austauschen.

Code: Alles auswählen

def convert_to_wav(path):
    subprocess.run(
        [
            "ffmpeg",
            "-i",
            str(path),
            "-ac",
            "2",
            "-f",
            "wav",
            str(path.with_name(path.stem + ".wav"))
        ],
        check=True,
    )
Und am Ende bei `luna.play()` (was ist `luna`?) wird der *.mp4-Pfad angegeben und nicht der von der WAV-Datei. Soll das so?

`urlparse()` wird importiert, aber nirgends verwendet.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Benutzeravatar
snafu
User
Beiträge: 6752
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Der Code stammt ja in abgewandelter Form offensichtlich von hier:
viewtopic.php?f=1&t=48985#p368912

Wenn man den ändert, dann sollte man schon wissen, was man tut. Vor allem wenn die Datentypen nicht beachtet werden und die betroffene Funktion plötzlich die str-API vor sich hat, obwohl die Path-API erwartet wird, dann knallt es nun mal...
JakobPrie
User
Beiträge: 91
Registriert: Sonntag 21. Juni 2020, 11:12

snafu hat geschrieben: Montag 29. Juni 2020, 19:44 Der Code stammt ja in abgewandelter Form offensichtlich von hier:
viewtopic.php?f=1&t=48985#p368912

Wenn man den ändert, dann sollte man schon wissen, was man tut. Vor allem wenn die Datentypen nicht beachtet werden und die betroffene Funktion plötzlich die str-API vor sich hat, obwohl die Path-API erwartet wird, dann knallt es nun mal...
Hi,
durchaus ist der Code von dort, dieses Thema hatte ich nämlich auch eröffnet ;D
Ich wollte es einfach mal probieren, da ich finde, dass mann am meisten beim Machen lernt. Und ich meine jetzt habe ich ja wieder was gelernt.
Ich lese mich jetzt mal in die beiden APIs ein und mal gucken, vlt schaff ich es ja dann.
Dennoch vielen Dank für den Tipp!
LG,
Jakob
JakobPrie
User
Beiträge: 91
Registriert: Sonntag 21. Juni 2020, 11:12

__blackjack__ hat geschrieben: Montag 29. Juni 2020, 11:14 Bei der Umwandlung in WAV würde ich den Namen der Ausgabedatei noch ein bisschen mehr am Original ausrichten und nur die Dateiendung austauschen.

Code: Alles auswählen

def convert_to_wav(path):
    subprocess.run(
        [
            "ffmpeg",
            "-i",
            str(path),
            "-ac",
            "2",
            "-f",
            "wav",
            str(path.with_name(path.stem + ".wav"))
        ],
        check=True,
    )
Und am Ende bei `luna.play()` (was ist `luna`?) wird der *.mp4-Pfad angegeben und nicht der von der WAV-Datei. Soll das so?

`urlparse()` wird importiert, aber nirgends verwendet.
Hallo, Danke für die Hilfe, das werde ich so umsetzten. Bei Luna handelt es sich um ein Projekt eines Sprachassistenten, das ich gerade begonnen habe. Dabei stellt luna.* eine Schnittstelle zu einer anderen Klasse, auf welche alle Skills zugreifen können, damit man Sachen, wie "Textausgeben" nicht redundant behandelt. Demnentsprechend muss natürlich eine WAV-Datei aufgerufen werden, das werde ich gleich mal abwandeln ;D
Antworten