Разбор полезной нагрузки сервера при отсутствии нескольких ключей - PullRequest
2 голосов
/ 03 мая 2020

У меня довольно базовый c бит кода. По сути, он отправляет запрос API на локально размещенный сервер и возвращает строку JSON. Я беру эту струну и разбиваю ее на части. Затем я беру из него то, что мне нужно, создаю словарь и экспортирую его как файл XML с расширением nfo.

Проблема в том, что в исходных данных иногда отсутствуют биты. Например, сезон отсутствует довольно часто. Это нарушает отображение данных. Мне нужен способ справиться с этим. В некоторых случаях я могу захотеть исключить данные, а в других мне нужно вменяемое значение по умолчанию.

#!/bin/env python

import os
import requests
import re
import json
import dicttoxml
import xml.dom.minidom
from xml.dom.minidom import parseString
# Grab Shoko Auth Key

apiheaders = {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
}

apidata = '{"user": "Default", "pass": "", "device": "CLI"}'

r = requests.post('http://192.168.254.100:8111/api/auth',
                  headers=apiheaders, data=apidata)
key = json.loads(r.text)['apikey']

# Grabbing Episode Data
EpisodeHeaders = {
    'accept': 'text/plain',
    'apikey': key
}

EpisodeParams = (
    ('filename',
     "FILE HERE"),
    ('pic', '1'),

)

fileinfo = requests.get(
    'http://192.168.254.100:8111/api/ep/getbyfilename', headers=EpisodeHeaders, params=EpisodeParams)

# Mapping Data from Shoko to Jellyfin NFO
string = json.loads(fileinfo.text)
print(string)
eplot = json.loads(fileinfo.text)['summary']
etitle = json.loads(fileinfo.text)['name']
eyear = json.loads(fileinfo.text)['year']
episode = json.loads(fileinfo.text)['epnumber']
season = json.loads(fileinfo.text)['season']
aid = json.loads(fileinfo.text)['aid']
seasonnum = season.split('x')

# Create Dictionary From Mapped Data

show = {
    "plot": eplot,
    "title": etitle,
    "year": eyear,
    "episode": episode,
    "season": seasonnum[0],
}

Вот некоторые примеры вывода при сбое кода

{'type': 'ep', 'eptype': 'Credits', 'epnumber': 1, 'aid': 10713, 'eid': 167848, 
'id': 95272, 'name': 'Opening', 'summary': 'Episode Overview not Available', 
'year': '2014', 'air': '2014-11-23', 'rating': '10.00', 'votes': '1', 
'art': {'fanart': [{'url': '/api/v2/image/support/plex_404.png'}], 
'thumb': [{'url': '/api/v2/image/support/plex_404.png'}]}}
Traceback (most recent call last):
  File "/home/fletcher/Documents/Shoko-Jellyfin-NFO/Xml3.py", line 48, in <module>
    season = json.loads(fileinfo.text)['season']
KeyError: 'season'

Решение, основанное на что предложил Махори. Работал отлично.

eplot = json.loads(fileinfo.text).get('summary', None)
etitle = json.loads(fileinfo.text).get('name', None)
eyear = json.loads(fileinfo.text).get('year', None)
episode = json.loads(fileinfo.text).get('epnumber', None)
season = json.loads(fileinfo.text).get('season', '1x1')
aid = json.loads(fileinfo.text).get('aid', None)

1 Ответ

2 голосов
/ 03 мая 2020

Это довольно распространенный сценарий веб-разработки, когда вы не всегда можете предполагать, что другая сторона отправит все ключи.

Стандартный способ обойти это - использовать get вместо именованной выборки.

season = json.loads(fileinfo.text).get('season', None)
#you can change None to any default value here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...