piexel-indexer/piexel.py
2017-12-11 09:04:37 +01:00

217 lines
7.5 KiB
Python

#coding:utf-8
import requests
from requests.auth import HTTPBasicAuth
class PiexelErrors(Exception):
pass
class InvalidToken(PiexelErrors):
pass
class ParameterError(PiexelErrors):
pass
class InvalidResponse(PiexelErrors):
pass
class Piexel:
def __init__(self, domain, app='', token='', endpoint='/api/'):
#self.app = app
#self.token = token
self.auth = HTTPBasicAuth(app, token)
self.domain = domain
self.endpoint = endpoint
def _get_response(self, controller, fields, request_type='get'):
"""
Build response
:param controller: controller à utiliser
:param fields: champ à passer
"""
url = self.domain + self.endpoint + controller
if request_type == 'get':
response = requests.get(url, auth=self.auth, params=fields)
elif request_type == 'post':
response = requests.post(url, auth=self.auth, params=fields)
elif request_type == 'put':
response = requests.put(url, auth=self.auth, params=fields)
elif request_type == 'delete':
response = requests.delete(url, auth=self.auth, data=fields)
response.encoding = 'utf-8'
code = response.status_code
try:
data = response.json()
except:
raise InvalidResponse(url, fields, response.text)
if code == 403: # FORBIDDEN
raise InvalidToken(data['message'])
elif code == 400:
print('error:', response.text)
raise ParameterError(data['message'])
return data
def _get_request(self, allowed, mandatory=[], **params):
"""
Créé la requète
"""
fields = {}
for key, val in params.items():
if key in allowed:
fields[key] = val
for m in mandatory:
if m not in fields.keys():
raise ParameterError('The parameter ' + m + ' is required.')
return fields
def get_films(self, **params):
"""
Récupère les films
:param params: paramètres à passer
"""
fields = self._get_request(['id', 'title', 'title_vo', 'imdb_id', 'limit', 'first', 'first', 'files'], [], **params)
return self._get_response('films', fields)
def get_series(self, **params):
"""
Récupère les séries
:param params: paramètres à passer
"""
fields = self._get_request(['id', 'title', 'imdb_id', 'limit', 'first', 'first', 'episodes'], [], **params)
return self._get_response('series', fields)
def get_episodes(self, **params):
"""
Récupère les épisodes
:param params: paramètres à passer
"""
fields = self._get_request(['id', 'serie_id', 'title', 'imdb_id', 'limit', 'first', 'first', 'episodes'], [], **params)
return self._get_response('episodes', fields)
def get_tokens(self, **params):
"""
Récupère les tokens
:param params: paramètres à passer
"""
fields = self._get_request([], [], **params)
return self._get_response('indexer/tokens', fields)
def get_folders(self, **params):
"""
Récupère les dossiers de recherche
:param params: paramètres à passer
"""
fields = self._get_request([], [], **params)
return self._get_response('indexer/folders', fields)
def get_paths(self, **params):
"""
Récupère les règles d'indexage
:param params: paramètres à passer
"""
fields = self._get_request([], [], **params)
return self._get_response('indexer/paths', fields)
def get_files(self, **params):
"""
Récupère les fichiers
:param params: paramètres à passer
"""
fields = self._get_request(['id', 'path', 'name', 'limit', 'first', 'filable', 'like'], [], **params)
return self._get_response('files', fields)
def get_subtitles(self, **params):
"""
Récupère les sous-titres
:param params: paramètres à passer
"""
fields = self._get_request(['id', 'path', 'name', 'limit', 'first', 'subtitlable'], [], **params)
return self._get_response('subtitles', fields)
def get_broken(self, **params):
"""
Récupère les liens morts
:param params: paramètres à passer
"""
fields = self._get_request(['id', 'type'], [], **params)
return self._get_response('broken', fields)
def post_film(self, **params):
"""
Ajoute un film
:param params: paramètres à passer
"""
fields = self._get_request(['title', 'year'], ['title'], **params)
return self._get_response('film', fields, 'post')
def post_file(self, **params):
"""
Ajoute un fichier
:param params: paramètres à passer
"""
fields = self._get_request(['path', 'name', 'type', 'type_id'], ['path', 'name', 'type', 'type_id'], **params)
return self._get_response('file', fields, 'post')
def post_file_language(self, file, **params):
"""
Ajoute une langue à un fichier
:param params: paramètres à passer
"""
fields = self._get_request(['value'], ['value'], **params)
return self._get_response('languages/'+str(file)+'/attach', fields, 'post')
def post_file_subtitle(self, file, **params):
"""
Ajoute une langue de sous-titre à un fichier
:param params: paramètres à passer
"""
fields = self._get_request(['value'], ['value'], **params)
return self._get_response('subtitle-languages/'+str(file)+'/attach', fields, 'post')
def post_file_qualities(self, file, **params):
"""
Ajoute une qualitée à un fichier
:param params: paramètres à passer
"""
fields = self._get_request(['value'], ['value'], **params)
return self._get_response('qualities/'+str(file)+'/attach', fields, 'post')
def post_subtitle(self, **params):
"""
Ajoute un sous-titre
:param params: paramètres à passer
"""
fields = self._get_request(['path', 'name', 'type', 'type_id', 'quality', 'lang'], ['path', 'name', 'type', 'type_id'], **params)
return self._get_response('subtitles', fields, 'post')
def post_serie(self, **params):
"""
Ajoute une série
:param params: paramètres à passer
"""
fields = self._get_request(['title'], ['title'], **params)
return self._get_response('serie', fields, 'post')
def post_episode(self, **params):
"""
Ajoute un épisode d'une série
:param params: paramètres à passer
"""
fields = self._get_request(['season', 'episode', 'serie_id'], ['season', 'episode', 'serie_id'], **params)
return self._get_response('episode', fields, 'post')
def put_file(self, id, **params):
"""
Edite un fichier
:param params: paramètres à passer
"""
fields = self._get_request(['path', 'name', 'filable_type', 'filable_id', 'quality', 'lang', 'subtitles'], [], **params)
return self._get_response('file/'+str(id), fields, 'put')
def delete_file(self, id, **params):
"""
Supprime un fichier
:param params: paramètres à passer
"""
fields = self._get_request([], [], **params)
return self._get_response('file/'+str(id), fields, 'delete')