我正在制作一个脚本,从不同的服务中获取电影和节目。我需要一个功能,如果一个电影是可用的流媒体平台(例如,派拉蒙)在4k和高清,然后我只想显示4K的结果。但是,如果标题仅供购买,那么我想将其排除在结果之外。
resp = {
# Fetches JSON response as dict from server
# which contains offers as a list of dictionaries
"offers": [
{
"monetization_type": "flatrate",
"package_short_name": "pmp",
"presentation_type": "4k",
},
{
"monetization_type": "flatrate",
"package_short_name": "pmp",
"presentation_type": "hd",
},
{
"monetization_type": "flatrate",
"package_short_name": "fxn",
"presentation_type": "hd",
},
{
"monetization_type": "buy",
"package_short_name": "itu",
"presentation_type": "4k",
},
]
}
def get_Stream_info(obj, results=[]):
try:
if obj["offers"]:
count = 0
for i in range(len(obj["offers"])):
srv = obj["offers"][i]["monetization_type"]
qty = obj["offers"][i]["presentation_type"]
pkg = obj["offers"][i]["package_short_name"]
if srv == "flatrate" and qty in ["4k", "hd"]:
results.append(f"Stream [{i+1}]: US - {pkg} - {qty}")
count = 1
else:
errstr = f"No streaming options available."
if count == 0:
results.append(errstr)
except KeyError:
results.append(f"Not available.")
return "\n".join(results)
if __name__ == "__main__":
print(get_Stream_info(resp))结果:
Stream [1]: US - pmp - 4k # ParamountPlus
Stream [2]: US - pmp - hd # ParamountPlus
Stream [3]: US - fxn - hd # FoxNow4K和HD可以在ParamountPlus上使用,但我只想打印4K。
最后,高清在所有其他地方,4K是不可用的。
发布于 2022-04-12 10:47:53
如果你创建了一本评价质量的词典,那该怎么办?如果以后有SD或其他格式的流,可能会很好。这样,您总是以最少的代码显示来自每个服务的最佳质量流:
qty_ratings = {
'4k': 1,
'hd': 2,
'sd': 3
}附加最高质量的流:
if monetize == 'flatrate':
# Check if there are more than one stream from the same service
if len(qty) > 1:
qty = min([qty_ratings[x] for x in qty])
result.append(f"Stream {[i]}: US - {service} - {qty}")
return "\n".join(result)发布于 2022-04-12 11:08:58
就我个人而言,我会明确地对流进行排序,并不是因为它更有效率,而是因为它表明了我在做什么。
假设您的报价被定义为问题中的内容:
ranking = ("sd", "hd", "4k")
def get_best_stream(streams):
return max(streams, key=lambda x: ranking.index(x["presentation_type"]))
get_best_stream(offers)正如@Gustaf所指出的,这是向前兼容的。我使用的是元组而不是数据集,因为我们实际上只关心秩序(也许更明确的是枚举)。
如果您想从每个来源保留一个报价,我将明确地对此进行编码:
def get_streams(streams):
sources = set(x["package_short_name"] for x in streams)
return [
get_best_stream(s for s in streams if s["package_short_name"] == source)
for source in sources
]
get_streams(offers)当然,如果您有数十亿的流,那么在源和提供之间建立映射会更有效,但是对于几十个迭代器来说,迭代器的成本是微不足道的。
https://stackoverflow.com/questions/71841081
复制相似问题