[Python] Trailers downloaden Emby

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,

Voor mijn mediabibliotheek wil ik graag de trailers in ieder mapje hebben.

So far is dit mijn code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from youtubesearchpython import SearchVideos
import json
import requests
from pytube import YouTube
import os


print("===================================")
path =  '/mnt/media/Movies/'
#print(path)
filenames = os.listdir(path)

for root, dirs, files in os.walk(path):
    for dir in dirs:
        trailer = dir + " trailer"
        print(dir)
        if dir != "":
            search = SearchVideos(trailer, offset = 1, mode = "json", max_results = 1)
            print(search.result())
            jsonData = json.loads(search.result())
            #print(jsonData)
            url = jsonData['search_result'][0]["link"]
            #print(url)
            yt = YouTube(url)
            ys = yt.streams.get_highest_resolution()
            print(ys)
            extensie = dir + "-trailer"
            ys.download('/mnt/media/Movies/' + dir + "/" ,extensie)
            print("===================================")


Deze code werkt. Echter, bij bepaalde films gooit hij een exeception erin.
Bijvoorbeeld:

Abigail (2019)

of

Con Air (1997)

De exception is als volgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Traceback (most recent call last):
  File "/home/user/.local/lib/python3.8/site-packages/pytube/extract.py", line 288, in apply_descrambler
    stream_data[key] = [
  File "/home/user/.local/lib/python3.8/site-packages/pytube/extract.py", line 290, in <listcomp>
    "url": format_item["url"],
KeyError: 'url'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "yt.py", line 41, in <module>
    yt = YouTube(url)
  File "/home/url/.local/lib/python3.8/site-packages/pytube/__main__.py", line 92, in __init__
    self.descramble()
  File "/home/url/.local/lib/python3.8/site-packages/pytube/__main__.py", line 132, in descramble
    apply_descrambler(self.player_config_args, fmt)
  File "/home/url/.local/lib/python3.8/site-packages/pytube/extract.py", line 300, in apply_descrambler
    cipher_url = [
  File "/home/url/.local/lib/python3.8/site-packages/pytube/extract.py", line 301, in <listcomp>
    parse_qs(formats[i]["cipher"]) for i, data in enumerate(formats)
KeyError: 'cipher'



Wat heb ik al gedaan? ;)

Gedebugged door overal prints ertussen te zetten. De specifieke titels bekeken of er iets raars in zit. Zelf handmatig de url op Youtube bezocht. Mijn vermoeden is dat het in de naming zit in de array maar ik weet niet of dit klopt.

Heeft iemand een idee wat ik over het hoofd zie?

Beste antwoord (via Verwijderd op 02-08-2020 19:37)


  • Ruubster
  • Registratie: Augustus 2008
  • Niet online
Misschien dat het gerelateerd aan deze issue is:
https://github.com/nficano/pytube/issues/661

Met als workaround:
  1. Go to pytube directory in site-packages. If you're not sure where full location is use pip show pytube3 and you will see location.
  2. In pytube folder opened from above location, you'll see a file called extract.py. Open that file in your IDE or text-editor.
  3. You'll see a function called apply_descrambler . Inside that function, in line 301 probably, you'll see something like
  4. parse_qs(formats[i]["cipher"]) for i, data in enumerate(formats)
  5. Replace cipher in formats[i]["cipher"] with signatureCipher . Thus that line becomes,
  6. parse_qs(formats[i]["signatureCipher"]) for i, data in enumerate(formats)
  7. Viola ! This should fix your issue.
En je kunt de line misschien ook vervangen voor:
code:
1
parse_qs(formats[i].get("cipher") or formats[i].get("signatureCipher")) for i, data in enumerate(formats)

[ Voor 85% gewijzigd door Ruubster op 02-08-2020 19:27 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 10:43

Matis

Rubber Rocket

Om te debuggen zijn printjes een mooi begin, maar wil je echt debuggen zul je met een debugger aan de gang moeten.

Zodat je de data kunt zien op het moment dat de exceptie optreedt.

Dat is (denk ik) de meest snelle en zinvolle volgende stap als printjes niet de juiste antwoorden geeft.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Ruubster
  • Registratie: Augustus 2008
  • Niet online
Misschien dat het gerelateerd aan deze issue is:
https://github.com/nficano/pytube/issues/661

Met als workaround:
  1. Go to pytube directory in site-packages. If you're not sure where full location is use pip show pytube3 and you will see location.
  2. In pytube folder opened from above location, you'll see a file called extract.py. Open that file in your IDE or text-editor.
  3. You'll see a function called apply_descrambler . Inside that function, in line 301 probably, you'll see something like
  4. parse_qs(formats[i]["cipher"]) for i, data in enumerate(formats)
  5. Replace cipher in formats[i]["cipher"] with signatureCipher . Thus that line becomes,
  6. parse_qs(formats[i]["signatureCipher"]) for i, data in enumerate(formats)
  7. Viola ! This should fix your issue.
En je kunt de line misschien ook vervangen voor:
code:
1
parse_qs(formats[i].get("cipher") or formats[i].get("signatureCipher")) for i, data in enumerate(formats)

[ Voor 85% gewijzigd door Ruubster op 02-08-2020 19:27 ]


Acties:
  • +1 Henk 'm!

Verwijderd

Topicstarter
Ruubster schreef op zondag 2 augustus 2020 @ 19:24:
Misschien dat het gerelateerd aan deze issue is:
https://github.com/nficano/pytube/issues/661

Met als workaround:

[...]


En je kunt de line misschien ook vervangen voor:
code:
1
parse_qs(formats[i].get("cipher") or formats[i].get("signatureCipher")) for i, data in enumerate(formats)
Ik had ook al PDB aanstaan maar hier was ik dus never nooit niet uitgekomen. Thanks! It works now!

Acties:
  • 0 Henk 'm!

Verwijderd

je search kan leeg zijn, (geen resultaat) heb je daar al naar gekeken hoe je dat opvangt? heb je je code op github staan of dergelijke, want de regelnummer in je foutmelding geeft aan waar het misgaat, daarboven moet je de parameters ff debuggen...