Youtube Downloader

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
Merkator
User
Beiträge: 151
Registriert: Sonntag 5. Dezember 2021, 17:15

Iam currently trying to code a youtube downloader... I want to use DearPyGUI for a nice GUI, and I want the user to be able to search for videos, then it is supposed to show a list of those videos, and then they are supposed to be able to select the one they want and download it... For some reason I cannot get it to work! Thats my code:
```py
import pytube
import dearpygui.dearpygui as dpg
from pytube import Search

resultsarray = []

def searchforvideos():
resultsarray = []
searchfield = dpg.get_value("searchfield")
s = Search(searchfield)
for v in s.results:
resultsarray.append(v.watch_url)

dpg.configure_item("resultlist",items=resultsarray)


def selectarrayfromlink(Sender):
print(resultsarray[dpg.get_value(Sender)])


def downloadvideo():
print("Download")



dpg.create_context()
dpg.create_viewport(title='R4Z0R-TUBE', width=1280, height=640)

with dpg.window(label="R4Z0R-TUBE",width=1280,height=640):
dpg.add_input_text(id ="searchfield",default_value="Funny Videos...")
dpg.add_button(label="Search",callback=searchforvideos)
dpg.add_listbox(tag="resultlist",items=resultsarray,num_items=5,callback=selectarrayfromlink)
dpg.add_button(label="Download",callback=downloadvideo)

dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

```
I get the following error while trying to select a link from the list:
```Traceback (most recent call last):
File "D:\Python Projects\R4Z0R-TUBE\r4z0r-tube.py", line 18, in selectarrayfromlink
print(resultsarray[dpg.get_value(Sender)])
TypeError: list indices must be integers or slices, not str```
Benutzeravatar
noisefloor
User
Beiträge: 4195
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

der Fehler ist, wie in der Fehlermeldung steht, dass der Wert für `Sender` ein Integer (oder ein Slice) sein muss - ist es aber bei dir nicht. Das musst du ändern.

Dir ist klar, das Downloader für YT nicht trivial sind, man ständig der API von YT hinterherprogrammiert und es ausgereifte, fertige Lösungen wie youtube-dlp gibt?

Gruß, noisefloor
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Komisch, dass die Frage jetzt auf englisch ist??

Es darf keine globalen Variablen geben. `resultsarray` (was im übrigen gar kein Array sondern eine Liste ist; lustigerweise konfigurierst Du eine resultlist.) gibt es sowohl global als auch lokal. Die globale Liste ist aber immer leer.
dpg scheint sowieso viel mit globalem Zustand zu hantieren. Wenn jedes Element einen eindeutigen Namen haben muß, ist das nicht sehr modularisierbar. Dieser with-Window-Context sieht für mich auch abenteurlich aus, weil da irgendwo im Hintergrund wieder globale Variablen den aktuellen Context verwalten.
`dpg.get_value` liefert ja schon den Wert und nicht irgendeinen Index in eine Liste.
Einbuchstabe Variablennamen sind meist schlecht, weil sie nichts aussagen. Was soll s oder v sein?

Code: Alles auswählen

import dearpygui.dearpygui as dpg
from pytube import Search

def searchforvideos():
    searchfield = dpg.get_value("searchfield")
     = Search(searchfield)
    results = [
        video.watch_url
        for video in search.results
    ]
    dpg.configure_item("resultlist", items=results)

def select_link(sender):
    print(dpg.get_value(sender))


def downloadvideo():
    print("Download")


def main():
    dpg.create_context()
    dpg.create_viewport(title='R4Z0R-TUBE', width=1280, height=640)

    with dpg.window(label="R4Z0R-TUBE"):
        dpg.add_input_text(id ="searchfield", default_value="Funny Videos...")
        dpg.add_button(label="Search", callback=searchforvideos)
        dpg.add_listbox(tag="resultlist", items=resultsarray, num_items=5, callback=select_link)
        dpg.add_button(label="Download", callback=downloadvideo)

    dpg.setup_dearpygui()
    dpg.show_viewport()
    dpg.start_dearpygui()
    dpg.destroy_context()


if __name__ == "__main__":
    main()
Benutzeravatar
Kebap
User
Beiträge: 776
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Sirius3 hat geschrieben: Dienstag 24. Januar 2023, 08:38 Komisch, dass die Frage jetzt auf englisch ist??
Nicht komisch, sondern einfach damit man die Frage 1:1 noch auf anderswo im Netz crossposten kann, wo die Leute sich vielleicht nicht daran erinnern, dass man immer alle Programme "PassStealer.py" nennt und so.. :mrgreen:

https://stackoverflow.com/questions/752 ... rpygui-for
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Antworten