vcollector.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import vfetcher
  2. import vobjects
  3. import urllib.parse
  4. import json
  5. import subprocess
  6. import os
  7. import shlex
  8. def audio_list(config):
  9. payload = config.audio_list_payload()
  10. json_list = vfetcher.fetch(
  11. payload["method"],
  12. f"{config.vk_host()}{config.audio_list_url()}",
  13. payload["headers"].items(),
  14. payload["body"].encode(),
  15. )
  16. plain_list = json.loads(json_list)
  17. return vobjects.audio_list(plain_list)
  18. def audio_data(config, audio_list):
  19. payload = config.audio_data_payload()
  20. body = {
  21. "al": "1",
  22. "audio_ids": ",".join([audio.cid() for audio in audio_list]),
  23. }
  24. json_data = vfetcher.fetch(
  25. payload["method"],
  26. f"{config.vk_host()}{config.audio_data_url()}",
  27. payload["headers"].items(),
  28. urllib.parse.urlencode(body).encode("ascii"),
  29. )
  30. plain_data = json.loads(json_data.decode("windows-1251"))
  31. return vobjects.audio_data(plain_data)
  32. def audio_manifest(config, audio_data):
  33. body = {}
  34. raw_content = vfetcher.fetch(
  35. "GET",
  36. audio_data.blessed_url(config),
  37. {}.items(),
  38. urllib.parse.urlencode(body).encode(),
  39. )
  40. return vobjects.Manifest(raw_content)
  41. def audio_chunk(config, audio_data, chunk):
  42. body = {}
  43. manifest = audio_data.manifest()
  44. raw_data = vfetcher.fetch(
  45. "GET",
  46. f"{audio_data.root_url(config)}{chunk}",
  47. {}.items(),
  48. urllib.parse.urlencode(body).encode("utf-8"),
  49. )
  50. return vobjects.Chunk(manifest, chunk, raw_data)
  51. def audio(config, audio_manifest, idx=None):
  52. data = audio_manifest.data()
  53. audio_dir = config.audio_directory()
  54. if not os.path.exists(audio_dir):
  55. os.makedirs(audio_dir)
  56. subprocess.run(
  57. [
  58. f'ffmpeg -y -protocol_whitelist file,http,https,tcp,tls,crypto -allowed_extensions ALL -i {audio_manifest.index(config)} -metadata title={shlex.quote(data.title())} -metadata artist={shlex.quote(data.artist())} -metadata track={idx} {shlex.quote(data.findex(config))}',
  59. ],
  60. shell=True,
  61. stdout=subprocess.DEVNULL,
  62. stderr=subprocess.DEVNULL,
  63. )