py_qq.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. from spider import Spider, SpiderItemType, SpiderSource, SpiderDanmaku, SpiderItem
  2. from utils import get_image_path
  3. from proxy import get_proxy_url
  4. import requests
  5. from cache import get_cache, set_cache
  6. import xbmcaddon
  7. import re
  8. import json
  9. import time
  10. _ADDON = xbmcaddon.Addon()
  11. class SpiderQQLive(Spider):
  12. def name(self):
  13. return 'QQ直播'
  14. def logo(self):
  15. return get_image_path('qq_live.png')
  16. def hide(self):
  17. return not _ADDON.getSettingBool('data_source_qq_live_switch')
  18. def is_searchable(self):
  19. return True
  20. def list_items(self, parent_item=None, page=1):
  21. if parent_item is None:
  22. r = requests.get('https://live.qq.com/api/live/index')
  23. data = r.json()['data']
  24. items = []
  25. for tag_id in data:
  26. tag = data[tag_id]
  27. items.append(
  28. SpiderItem(
  29. type=SpiderItemType.Directory,
  30. id=tag['short_name'],
  31. name=tag['tag_name'],
  32. params={
  33. 'type': 'category',
  34. },
  35. ))
  36. return items, False
  37. elif parent_item['params']['type'] == 'category':
  38. r = requests.get(
  39. 'https://live.qq.com/api/live/vlist',
  40. params={
  41. 'shortName': parent_item['id'],
  42. 'page': page,
  43. 'page_size': 60,
  44. },
  45. )
  46. data = r.json()['data']
  47. items = []
  48. for room in data['result']:
  49. items.append(
  50. SpiderItem(type=SpiderItemType.File,
  51. id=room['room_id'],
  52. name='{} - {}'.format(
  53. room['room_name'],
  54. room['nickname'],
  55. ),
  56. description='主播: {}\n分类: {}'.format(
  57. room['nickname'],
  58. room['game_name'],
  59. ),
  60. cover=room['room_src'],
  61. sources=[
  62. SpiderSource(
  63. room['room_id'],
  64. {
  65. 'id': room['room_id'],
  66. },
  67. )
  68. ]))
  69. return items, len(items) >= 60
  70. else:
  71. return [], False
  72. def resolve_play_url(self, source_params):
  73. return get_proxy_url(
  74. SpiderQQLive.__name__,
  75. self.proxy_m3u8.__name__,
  76. source_params,
  77. )
  78. def search(self, keyword):
  79. r = requests.get(
  80. 'https://live.qq.com/api/info/search/',
  81. params={
  82. 'keyword': keyword,
  83. },
  84. )
  85. data = r.json()
  86. items = []
  87. for room in data['room']:
  88. items.append(
  89. SpiderItem(type=SpiderItemType.File,
  90. id=room['room_id'],
  91. name='{} - {}'.format(
  92. room['room_name'],
  93. room['nickname'],
  94. ),
  95. description='主播: {}\n分类: {}'.format(
  96. room['nickname'],
  97. room['game_name'],
  98. ),
  99. cover=room['room_src'],
  100. sources=[
  101. SpiderSource(
  102. room['room_id'],
  103. {
  104. 'id': room['room_id'],
  105. },
  106. )
  107. ]))
  108. return items
  109. def proxy_m3u8(self, ctx, params):
  110. id = params['id']
  111. url = ''
  112. key = 'qq_live_m3u8'
  113. data = get_cache(key)
  114. if data:
  115. data = json.loads(data)
  116. if data['id'] == id and data['expires_at'] >= int(time.time()):
  117. url = data['url']
  118. if len(url) == 0:
  119. r = requests.get('https://m.live.qq.com/{}'.format(id))
  120. m = re.search(r"ROOM_INFO = (.*);<", r.text, re.MULTILINE)
  121. data = json.loads(m.group(1))
  122. url = data['hls_url']
  123. set_cache(
  124. key,
  125. json.dumps({
  126. 'id': id,
  127. 'url': url,
  128. 'expires_at': int(time.time() + 600),
  129. }))
  130. self.proxy(ctx, url)