Source code for Pymoe.anime.get.anilist
from datetime import date
import ujson
import requests
from ....errors import serializationFailed, serverError, methodNotSupported
from ....helpers import whatSeason
settings = {
'header': {
'Content-Type': 'application/json',
'User-Agent': 'Pymoe (github.com/ccubed/PyMoe)',
'Accept': 'application/json'
},
'apiurl': 'https://graphql.anilist.co'
}
[docs]def character(item_id : int):
"""
Get a character with a certain ID in the anilist API.
:param item_id: The ID of the character you want information on.
"""
query_string = '''
query ($id: Int){
Character (id: $id){
name{
full
}
image {
large
medium
}
description
gender
age
siteUrl
media{
nodes{
id
idMal
title {
romaji
english
native
}
coverImage {
extraLarge
large
medium
color
}
siteUrl
}
}
}
}
'''
r = requests.post(
settings['apiurl'],
headers = settings['header'],
json={
'query': query_string,
'variables': {
'id': item_id
}
}
)
try:
jsd = ujson.loads(r.text)
except ValueError:
raise serializationFailed(r.text, r.status_code)
else:
if 'errors' in jsd:
raise serverError(r.text, r.status_code)
else:
return jsd
[docs]def show(item_id : int):
"""
Get a show with a certain ID in the anilist API.
:param item_id: The ID of the show you want information on.
"""
query_string = '''
query ($id: Int) {
Media (id: $id, type: ANIME) {
title {
romaji
english
native
}
startDate {
year
month
day
}
endDate {
year
month
day
}
coverImage {
extraLarge
large
medium
color
}
bannerImage
format
status
episodes
season
seasonYear
description
averageScore
meanScore
genres
synonyms
isAdult
siteUrl
nextAiringEpisode {
timeUntilAiring
airingAt
}
streamingEpisodes {
title
thumbnail
url
site
}
externalLinks{
url
site
language
}
characters {
nodes {
id
name {
first
last
}
image {
large
medium
}
description
gender
age
siteUrl
}
}
}
}
'''
r = requests.post(
settings['apiurl'],
headers = settings['header'],
json={
'query': query_string,
'variables': {
'id': item_id
}
}
)
try:
jsd = ujson.loads(r.text)
except ValueError:
raise serializationFailed(r.text, r.status_code)
else:
if 'errors' in jsd:
raise serverError(r.text, r.status_code)
else:
return jsd
[docs]def season(theSeason : str = None, year : int = date.today().year, page : int = 1, perPage : int = 3):
"""
Get a list of seasonal anime given a season and year.
:param theSeason: What Season? See pymoe.helpers for a list of seasons.
:param year: What year do you want info on?
:param page: Which page of results do you want?
:param perPage: How many results per page?
TODO: Test return data on this
"""
myseason = theSeason if theSeason else whatSeason(date.today().month)
query_string = '''
query($season: MediaSeason, $seasonYear: Int, $page: Int, $perPage: Int){
Page (page: $page, perPage: $perPage) {
pageInfo {
currentPage
hasNextPage
}
media (season: $season, seasonYear: $seasonYear){
id
idMal
title
description
genres
coverImage
isAdult
nextAiringEpisode {
timeUntilAiring
airingAt
}
startDate
streamingEpisodes {
title
thumbnail
url
site
}
siteUrl
externalLinks {
url
site
language
}
}
}
}
'''
r = requests.post(
settings['apiurl'],
headers = settings['header'],
json={
'query': query_string,
'variables': {
'season': myseason,
'seasonYear': year,
'page': page,
'perPage': perPage
}
}
)
try:
jsd = ujson.loads(r.text)
except ValueError:
raise serializationFailed(r.text, r.status_code)
else:
if 'errors' in jsd:
raise serverError(r.text, r.status_code)
else:
return jsd
[docs]def episode(item_id : int):
"""
Unsupported on Anilist
"""
raise methodNotSupported("pymoe.anime.get.anilist.episode", "anilist")
[docs]def streaming(item_id : int, page : int = 1, perPage : int = 3):
'''
Given a show ID, return all streaming links for that show.
Unlike Kitsu, this returns one streaming link per episode per service.
:param item_id: The ID of the show you want streaming links for
'''
query_string = '''
query ($id: Int) {
Media(id: $id){
streamingEpisodes {
title
thumbnail
url
site
}
}
}
'''
r = requests.post(
settings['apiurl'],
headers = settings['header'],
json={
'query': query_string,
'variables': {
'id': item_id
}
}
)
try:
jsd = ujson.loads(r.text)
except ValueError:
raise serializationFailed(r.text, r.status_code)
else:
if 'errors' in jsd:
raise serverError(r.text, r.status_code)
else:
return jsd
[docs]def staff(item_id : int):
"""
Get information on a specific staffer given their ID.
:param item_id: The ID of the staff member you want information on.
"""
query_string = '''
query ($id: Int){
Staff (id: $id){
name {
full
}
languageV2
image {
large
medium
}
description
primaryOccupations
gender
dateOfBirth {
year
month
day
}
dateOfDeath {
year
month
day
}
age
homeTown
yearsActive
siteUrl
staffMedia{
nodes {
id
idMal
title {
romaji
english
native
}
coverImage {
extraLarge
large
medium
color
}
siteUrl
}
}
characters{
nodes {
name {
full
}
image {
large
medium
}
age
siteUrl
media {
nodes {
id
idMal
title {
romaji
english
native
}
coverImage {
extraLarge
large
medium
color
}
siteUrl
}
}
}
}
}
}
'''
r = requests.post(
settings['apiurl'],
headers = settings['header'],
json={
'query': query_string,
'variables': {
'id': item_id
}
}
)
try:
jsd = ujson.loads(r.text)
except ValueError:
raise serializationFailed(r.text, r.status_code)
else:
if 'errors' in jsd:
raise serverError(r.text, r.status_code)
else:
return jsd
[docs]def studio(item_id : int):
"""
Get a studio with a specific id.
:param item_id: The ID of the studio you want information on.
"""
query_string = '''
query ($id: Int) {
Studio (id: $id) {
name
siteUrl
media {
nodes {
id
idMal
title {
romaji
english
native
}
coverImage {
extraLarge
large
medium
color
}
siteUrl
}
}
}
}
'''
r = requests.post(
settings['apiurl'],
headers = settings['header'],
json={
'query': query_string,
'variables': {
'id': item_id
}
}
)
try:
jsd = ujson.loads(r.text)
except ValueError:
raise serializationFailed(r.text, r.status_code)
else:
if 'errors' in jsd:
raise serverError(r.text, r.status_code)
else:
return jsd