test_youtube.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. from collections import defaultdict
  2. import mock
  3. from searx.engines import youtube
  4. from searx.testing import SearxTestCase
  5. class TestYoutubeEngine(SearxTestCase):
  6. def test_request(self):
  7. query = 'test_query'
  8. dicto = defaultdict(dict)
  9. dicto['pageno'] = 0
  10. dicto['language'] = 'fr_FR'
  11. params = youtube.request(query, dicto)
  12. self.assertTrue('url' in params)
  13. self.assertTrue(query in params['url'])
  14. self.assertTrue('youtube.com' in params['url'])
  15. self.assertTrue('fr' in params['url'])
  16. dicto['language'] = 'all'
  17. params = youtube.request(query, dicto)
  18. self.assertFalse('fr' in params['url'])
  19. def test_response(self):
  20. self.assertRaises(AttributeError, youtube.response, None)
  21. self.assertRaises(AttributeError, youtube.response, [])
  22. self.assertRaises(AttributeError, youtube.response, '')
  23. self.assertRaises(AttributeError, youtube.response, '[]')
  24. response = mock.Mock(text='{}')
  25. self.assertEqual(youtube.response(response), [])
  26. response = mock.Mock(text='{"data": []}')
  27. self.assertEqual(youtube.response(response), [])
  28. json = """
  29. {"feed":{"entry":[{
  30. "id":{"$t":"http://gdata.youtube.com/feeds/api/videos/DIVZCPfAOeM"},
  31. "published":{"$t":"2015-01-23T21:25:00.000Z"},
  32. "updated":{"$t":"2015-01-26T14:38:15.000Z"},
  33. "title":{"$t":"Title",
  34. "type":"text"},"content":{"$t":"Description","type":"text"},
  35. "link":[{"rel":"alternate","type":"text/html",
  36. "href":"https://www.youtube.com/watch?v=DIVZCPfAOeM&feature=youtube_gdata"},
  37. {"rel":"http://gdata.youtube.com/schemas/2007#video.related",
  38. "type":"application/atom+xml",
  39. "href":"https://gdata.youtube.com/feeds/api/videos/DIVZCPfAOeM/related"},
  40. {"rel":"http://gdata.youtube.com/schemas/2007#mobile","type":"text/html",
  41. "href":"https://m.youtube.com/details?v=DIVZCPfAOeM"},
  42. {"rel":"self","type":"application/atom+xml",
  43. "href":"https://gdata.youtube.com/feeds/api/videos/DIVZCPfAOeM"}],
  44. "author":[{"name":{"$t":"Cauet"},
  45. "uri":{"$t":"https://gdata.youtube.com/feeds/api/users/cauetofficiel"} }],
  46. "gd$comments":{"gd$feedLink":{"rel":"http://gdata.youtube.com/schemas/2007#comments",
  47. "href":"https://gdata.youtube.com/feeds/api/videos/DIVZCPfAOeM/comments",
  48. "countHint":8} },
  49. "media$group":{"media$category":[{"$t":"Comedy","label":"Comedy",
  50. "scheme":"http://gdata.youtube.com/schemas/2007/categories.cat"}],
  51. "media$content":[{"url":"https://www.youtube.com/v/DIVZCPfAOeM?version=3&f=videos&app=youtube_gdata",
  52. "type":"application/x-shockwave-flash","medium":"video",
  53. "isDefault":"true","expression":"full","duration":354,"yt$format":5},
  54. {"url":"rtsp://r1---sn-cg07luel.c.youtube.com/CiILENy73wIaGQnjOcD3CFmFDBMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp",
  55. "type":"video/3gpp","medium":"video","expression":"full","duration":354,
  56. "yt$format":1},
  57. {"url":"rtsp://r1---sn-cg07luel.c.youtube.com/CiILENy73wIaGQnjOcD3CFmFDBMYESARFEgGUgZ2aWRlb3MM/0/0/0/video.3gp",
  58. "type":"video/3gpp","medium":"video","expression":"full","duration":354,"yt$format":6}],
  59. "media$description":{"$t":"Desc","type":"plain"},
  60. "media$keywords":{},
  61. "media$player":[{"url":"https://www.youtube.com/watch?v=DIVZCPfAOeM&feature=youtube_gdata_player"}],
  62. "media$thumbnail":[{"url":"https://i.ytimg.com/vi/DIVZCPfAOeM/0.jpg",
  63. "height":360,"width":480,"time":"00:02:57"},
  64. {"url":"https://i.ytimg.com/vi/DIVZCPfAOeM/1.jpg","height":90,"width":120,"time":"00:01:28.500"},
  65. {"url":"https://i.ytimg.com/vi/DIVZCPfAOeM/2.jpg","height":90,"width":120,"time":"00:02:57"},
  66. {"url":"https://i.ytimg.com/vi/DIVZCPfAOeM/3.jpg","height":90,"width":120,"time":"00:04:25.500"}],
  67. "media$title":{"$t":"Title","type":"plain"},
  68. "yt$duration":{"seconds":"354"} },
  69. "gd$rating":{"average":4.932159,"max":5,"min":1,"numRaters":1533,
  70. "rel":"http://schemas.google.com/g/2005#overall"},
  71. "yt$statistics":{"favoriteCount":"0","viewCount":"92464"} }
  72. ]
  73. }
  74. }
  75. """
  76. response = mock.Mock(text=json)
  77. results = youtube.response(response)
  78. self.assertEqual(type(results), list)
  79. self.assertEqual(len(results), 1)
  80. self.assertEqual(results[0]['title'], 'Title')
  81. self.assertEqual(results[0]['url'], 'https://www.youtube.com/watch?v=DIVZCPfAOeM')
  82. self.assertEqual(results[0]['content'], 'Description')
  83. self.assertEqual(results[0]['thumbnail'], 'https://i.ytimg.com/vi/DIVZCPfAOeM/0.jpg')
  84. self.assertTrue('DIVZCPfAOeM' in results[0]['embedded'])
  85. json = """
  86. {"feed":{"entry":[{
  87. "id":{"$t":"http://gdata.youtube.com/feeds/api/videos/DIVZCPfAOeM"},
  88. "published":{"$t":"2015-01-23T21:25:00.000Z"},
  89. "updated":{"$t":"2015-01-26T14:38:15.000Z"},
  90. "title":{"$t":"Title",
  91. "type":"text"},"content":{"$t":"Description","type":"text"},
  92. "link":[{"rel":"http://gdata.youtube.com/schemas/2007#video.related",
  93. "type":"application/atom+xml",
  94. "href":"https://gdata.youtube.com/feeds/api/videos/DIVZCPfAOeM/related"},
  95. {"rel":"self","type":"application/atom+xml",
  96. "href":"https://gdata.youtube.com/feeds/api/videos/DIVZCPfAOeM"}],
  97. "author":[{"name":{"$t":"Cauet"},
  98. "uri":{"$t":"https://gdata.youtube.com/feeds/api/users/cauetofficiel"} }],
  99. "gd$comments":{"gd$feedLink":{"rel":"http://gdata.youtube.com/schemas/2007#comments",
  100. "href":"https://gdata.youtube.com/feeds/api/videos/DIVZCPfAOeM/comments",
  101. "countHint":8} },
  102. "media$group":{"media$category":[{"$t":"Comedy","label":"Comedy",
  103. "scheme":"http://gdata.youtube.com/schemas/2007/categories.cat"}],
  104. "media$content":[{"url":"https://www.youtube.com/v/DIVZCPfAOeM?version=3&f=videos&app=youtube_gdata",
  105. "type":"application/x-shockwave-flash","medium":"video",
  106. "isDefault":"true","expression":"full","duration":354,"yt$format":5},
  107. {"url":"rtsp://r1---sn-cg07luel.c.youtube.com/CiILENy73wIaGQnjOcD3CFmFDBMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp",
  108. "type":"video/3gpp","medium":"video","expression":"full","duration":354,
  109. "yt$format":1},
  110. {"url":"rtsp://r1---sn-cg07luel.c.youtube.com/CiILENy73wIaGQnjOcD3CFmFDBMYESARFEgGUgZ2aWRlb3MM/0/0/0/video.3gp",
  111. "type":"video/3gpp","medium":"video","expression":"full","duration":354,"yt$format":6}],
  112. "media$description":{"$t":"Desc","type":"plain"},
  113. "media$keywords":{},
  114. "media$player":[{"url":"https://www.youtube.com/watch?v=DIVZCPfAOeM&feature=youtube_gdata_player"}],
  115. "media$thumbnail":[{"url":"https://i.ytimg.com/vi/DIVZCPfAOeM/0.jpg",
  116. "height":360,"width":480,"time":"00:02:57"},
  117. {"url":"https://i.ytimg.com/vi/DIVZCPfAOeM/1.jpg","height":90,"width":120,"time":"00:01:28.500"},
  118. {"url":"https://i.ytimg.com/vi/DIVZCPfAOeM/2.jpg","height":90,"width":120,"time":"00:02:57"},
  119. {"url":"https://i.ytimg.com/vi/DIVZCPfAOeM/3.jpg","height":90,"width":120,"time":"00:04:25.500"}],
  120. "media$title":{"$t":"Title","type":"plain"},
  121. "yt$duration":{"seconds":"354"} },
  122. "gd$rating":{"average":4.932159,"max":5,"min":1,"numRaters":1533,
  123. "rel":"http://schemas.google.com/g/2005#overall"},
  124. "yt$statistics":{"favoriteCount":"0","viewCount":"92464"} }
  125. ]
  126. }
  127. }
  128. """
  129. response = mock.Mock(text=json)
  130. results = youtube.response(response)
  131. self.assertEqual(type(results), list)
  132. self.assertEqual(len(results), 0)
  133. json = """
  134. {"feed":{"entry":[{
  135. "id":{"$t":"http://gdata.youtube.com/feeds/api/videos/DIVZCPfAOeM"},
  136. "published":{"$t":"2015-01-23T21:25:00.000Z"},
  137. "updated":{"$t":"2015-01-26T14:38:15.000Z"},
  138. "title":{"$t":"Title",
  139. "type":"text"},"content":{"$t":"Description","type":"text"},
  140. "link":[{"rel":"alternate","type":"text/html",
  141. "href":"https://www.youtube.com/watch?v=DIVZCPfAOeM"},
  142. {"rel":"http://gdata.youtube.com/schemas/2007#video.related",
  143. "type":"application/atom+xml",
  144. "href":"https://gdata.youtube.com/feeds/api/videos/DIVZCPfAOeM/related"},
  145. {"rel":"http://gdata.youtube.com/schemas/2007#mobile","type":"text/html",
  146. "href":"https://m.youtube.com/details?v=DIVZCPfAOeM"},
  147. {"rel":"self","type":"application/atom+xml",
  148. "href":"https://gdata.youtube.com/feeds/api/videos/DIVZCPfAOeM"}],
  149. "author":[{"name":{"$t":"Cauet"},
  150. "uri":{"$t":"https://gdata.youtube.com/feeds/api/users/cauetofficiel"} }],
  151. "gd$comments":{"gd$feedLink":{"rel":"http://gdata.youtube.com/schemas/2007#comments",
  152. "href":"https://gdata.youtube.com/feeds/api/videos/DIVZCPfAOeM/comments",
  153. "countHint":8} },
  154. "media$group":{"media$category":[{"$t":"Comedy","label":"Comedy",
  155. "scheme":"http://gdata.youtube.com/schemas/2007/categories.cat"}],
  156. "media$content":[{"url":"https://www.youtube.com/v/DIVZCPfAOeM?version=3&f=videos&app=youtube_gdata",
  157. "type":"application/x-shockwave-flash","medium":"video",
  158. "isDefault":"true","expression":"full","duration":354,"yt$format":5},
  159. {"url":"rtsp://r1---sn-cg07luel.c.youtube.com/CiILENy73wIaGQnjOcD3CFmFDBMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp",
  160. "type":"video/3gpp","medium":"video","expression":"full","duration":354,
  161. "yt$format":1},
  162. {"url":"rtsp://r1---sn-cg07luel.c.youtube.com/CiILENy73wIaGQnjOcD3CFmFDBMYESARFEgGUgZ2aWRlb3MM/0/0/0/video.3gp",
  163. "type":"video/3gpp","medium":"video","expression":"full","duration":354,"yt$format":6}],
  164. "media$description":{"$t":"Desc","type":"plain"},
  165. "media$keywords":{},
  166. "media$player":[{"url":"https://www.youtube.com/watch?v=DIVZCPfAOeM&feature=youtube_gdata_player"}],
  167. "media$title":{"$t":"Title","type":"plain"},
  168. "yt$duration":{"seconds":"354"} },
  169. "gd$rating":{"average":4.932159,"max":5,"min":1,"numRaters":1533,
  170. "rel":"http://schemas.google.com/g/2005#overall"},
  171. "yt$statistics":{"favoriteCount":"0","viewCount":"92464"} }
  172. ]
  173. }
  174. }
  175. """
  176. response = mock.Mock(text=json)
  177. results = youtube.response(response)
  178. self.assertEqual(type(results), list)
  179. self.assertEqual(len(results), 1)
  180. self.assertEqual(results[0]['title'], 'Title')
  181. self.assertEqual(results[0]['url'], 'https://www.youtube.com/watch?v=DIVZCPfAOeM')
  182. self.assertEqual(results[0]['content'], 'Description')
  183. self.assertEqual(results[0]['thumbnail'], '')
  184. self.assertTrue('DIVZCPfAOeM' in results[0]['embedded'])
  185. json = """
  186. {"toto":{"entry":[]
  187. }
  188. }
  189. """
  190. response = mock.Mock(text=json)
  191. results = youtube.response(response)
  192. self.assertEqual(type(results), list)
  193. self.assertEqual(len(results), 0)