archiving community contributions on YouTube: unpublished captions, title and description translations and caption credits
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 

78 linhas
3.3 KiB

  1. import requests
  2. from json import loads
  3. def getmetadata(vid):
  4. params = (
  5. ("v", vid),
  6. )
  7. wpage = requests.get("https://www.youtube.com/watch", params=params)
  8. wptext = wpage.text
  9. initplay = None
  10. initdata = None
  11. recvids = set()
  12. recchans = set()
  13. recmixes = set()
  14. recplayl = set()
  15. for line in wptext.splitlines():
  16. if line.strip().startswith('window["ytInitialPlayerResponse"] = '):
  17. initplay = loads(line.split('window["ytInitialPlayerResponse"] = ', 1)[1].strip()[:-1])
  18. if initplay["playabilityStatus"]["status"] == "ERROR":
  19. print(vid, "unavailable")
  20. return False, recvids, recchans, recmixes, recplayl
  21. if "endscreen" in initplay.keys():
  22. for el in initplay["endscreen"]["endscreenRenderer"]:
  23. elint = el["endscreenElementRenderer"]
  24. if elint["style"] == "VIDEO":
  25. recvids.add(elint["endpoint"]["watchEndpoint"]["videoId"])
  26. elif elint["style"] == "CHANNEL":
  27. recchans.add(elint["endpoint"]["browseEndpoint"]["browseId"])
  28. elif elint["style"] == "PLAYLIST":
  29. recvids.add(elint["endpoint"]["watchEndpoint"]["videoId"])
  30. recplayl.add(elint["endpoint"]["watchEndpint"]["playlistId"])
  31. if "captions" in initplay.keys():
  32. ccenabled = "contribute" in initplay["captions"]["playerCaptionsRenderer"]
  33. recchans.add(initplay["videoDetails"]["channelId"])
  34. elif line.strip().startswith('window["ytInitialData"] = '):
  35. initdata = loads(line.split('window["ytInitialData"] = ', 1)[1].strip()[:-1])
  36. if "contents" in initdata.keys(): #prevent exception
  37. for recmd in initdata["contents"]["twoColumnWatchNextResults"]["secondaryResults"]["secondaryResults"]["results"]:
  38. #auto is like the others
  39. if "compactAutoplayRenderer" in recmd.keys():
  40. recmd = recmd["compactAutoplayRenderer"]["contents"][0]
  41. if "compactVideoRenderer" in recmd.keys():
  42. recvids.add(recmd["compactVideoRenderer"]["videoId"])
  43. recchans.add(recmd["compactVideoRenderer"]["channelId"])
  44. elif "compactPlaylistRenderer" in recmd.keys():
  45. recplayl.add(recmd["compactPlaylistRenderer"]["playlistId"])
  46. recvids.add(recmd["compactPlaylistRenderer"]["navigationEndpoint"]["watchEndpoint"]["videoId"])
  47. recchans.add(recmd["compactPlaylistRenderer"]["shortBylineText"]["navigationEndpoint"]["browseEndpoint"]["browseId"])
  48. elif "compactRadioRenderer" in recmd.keys(): #mix playlist
  49. recmixes.add(recmd["compactRadioRenderer"]["playlistId"])
  50. # todo: find out if channels can be suggested
  51. if initplay and initdata:
  52. break
  53. return ccenabled, recvids, recchans, recmixes, recplayl
  54. if __name__ == "__main__":
  55. from sys import argv
  56. vidl = argv
  57. vidl.pop(0)
  58. for video in vidl:
  59. print(getmetadata(video))