Seite 1 von 1

Youtube Downloader

Verfasst: Dienstag 24. Januar 2023, 06:31
von Merkator
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```

Re: Youtube Downloader

Verfasst: Dienstag 24. Januar 2023, 06:58
von noisefloor
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

Re: Youtube Downloader

Verfasst: Dienstag 24. Januar 2023, 08:38
von Sirius3
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()

Re: Youtube Downloader

Verfasst: Dienstag 24. Januar 2023, 09:22
von Kebap
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