Как проверить видео CreativeCommons, используя API данных YouTube?У меня есть следующий код, как напечатать true, если видео является креативным достоянием? - PullRequest
1 голос
/ 20 июня 2019

Я пытаюсь скачать видео с креативным достоянием с помощью API данных YouTube, но я довольно новичок в этом, поэтому я застрял.Как двигаться дальше?Я хочу найти "license": "creativeCommon" в файле JSON и вывести true, если это правда.

import urllib.request as urllib2
import json
response = urllib2.urlopen('https://www.googleapis.com/youtube/v3/videos?id=gwLej8heN5c&part=status&key=MY_KEY')
data = list(json.load(response))


{
 "kind": "youtube#videoListResponse",
 "etag": "\"Bdx4f4ps3xCOOo1WZ91nTLkRZ_c/3jdRB-NXSAfUQj7e_FmBbivkK1o\"",
 "pageInfo": {
  "totalResults": 1,
  "resultsPerPage": 1
 },
 "items": [
  {
   "kind": "youtube#video",
   "etag": "\"Bdx4f4ps3xCOOo1WZ91nTLkRZ_c/NUd32t1_moLGAwVuu-ZujlkaiWM\"",
   "id": "gwLej8heN5c",
   "status": {
    "uploadStatus": "processed",
    "privacyStatus": "public",
    "license": "creativeCommon",
    "embeddable": true,
    "publicStatsViewable": true
   }
  }
 ]
}

1 Ответ

1 голос
/ 22 июня 2019

@ goodvibration ответ был верным, если учесть, что json.load использует функцию чтения, что означает, что после прочтения данных его невозможно прочитать снова. В этом случае будет возвращена пустая строка байтов.

Этот код работает, печатая True в конце.

response = urllib2.urlopen('https://www.googleapis.com/youtube/v3/videos?id=gwLej8heN5c&part=status&key=MY_KEY')
for item in json.load(response)['items']: print(item['status']['license'] == 'creativeCommon')

Кроме того, в исходном примере и в примере ошибки вы использовали список (json.load (response)) при сохранении в данные. Это будет означать, что вы получаете не весь JSON, а только ключи. Так что в вашем случае я бы предложил не менять ответ на список. Но так как вы не использовали переменную данных позже в примере, это на самом деле не меняет результаты. Но это может быть важно, если у вас есть дополнительная информация, которую вы хотите проверить / сохранить.

Кроме того, в этом случае, поскольку json.load () использует функцию чтения, которую нельзя использовать несколько раз, вам необходимо сохранить весь json и затем прочитать из него. Код будет:

response = urllib2.urlopen('https://www.googleapis.com/youtube/v3/videos?id=gwLej8heN5c&part=status&key=MY_KEY')
data = json.load(response)
for item in data['items']: print(item['status']['license'] == 'creativeCommon')

Вы можете увидеть это, если попытаетесь прочитать полученный ответ. Вы можете поставить следующий код для проверки:

response = urllib2.urlopen('https://www.googleapis.com/youtube/v3/videos?id=gwLej8heN5c&part=status&key=MY_KEY')
print(response.read())
print(response.read())

В этом случае результаты будут:

b'{\n "kind": "youtube#videoListResponse",\n "etag": "\\"Bdx4f4ps3xCOOo1WZ91nTLkRZ_c/3jdRB-NXSAfUQj7e_FmBbivkK1o\\"",\n "pageInfo": {\n  "totalResults": 1,\n  "resultsPerPage": 1\n },\n "items": [\n  {\n   "kind": "youtube#video",\n   "etag": "\\"Bdx4f4ps3xCOOo1WZ91nTLkRZ_c/NUd32t1_moLGAwVuu-ZujlkaiWM\\"",\n   "id": "gwLej8heN5c",\n   "status": {\n    "uploadStatus": "processed",\n    "privacyStatus": "public",\n    "license": "creativeCommon",\n    "embeddable": true,\n    "publicStatsViewable": true\n   }\n  }\n ]\n}\n'
b''

В первом случае результатом является json в виде строки байтов, а во втором - пустая строка байтов. Поэтому, когда вы попытаетесь использовать несколько json.load () для одного и того же элемента ответа, вы получите JSONDecodeError (так же, как в вашем комментарии), так как во второй раз нет json для анализа.

...