API habilitada ;)

This commit is contained in:
perro tuerto 2023-01-20 15:31:07 -08:00
parent bece885226
commit c2138d9e14
4 changed files with 73 additions and 22 deletions

View File

@ -200,6 +200,8 @@ class MovieQuerySet(models.QuerySet):
html = BeautifulSoup(raw, "lxml")
for ref in html.find_all("sup", "reference"):
ref.decompose()
for crossref in html.find_all("dl"):
crossref.decompose()
clean = list(map(lambda x: str(x), html.body.children))
return " ".join(clean)
@ -429,6 +431,40 @@ class MovieQuerySet(models.QuerySet):
else:
return None
def api(self, request):
"""
Obtiene resultados de la API.
"""
msg = f"Vista {request.get_host()}/help/#api para más información."
result = {"ERROR": msg}
try:
if request.GET.get("q"):
query = request.GET["q"]
result = {"movies": Movie.objects.get_movies(query)}
elif request.GET.get("id"):
query = request.GET["id"]
result = {"movie": Movie.objects.get_movie_by_id(query)}
else:
result["Exception"] = f"Invalid {request.GET}"
except Exception:
result["Exception"] = f"Invalid {request.GET}"
if request.user.is_authenticated:
return result
else:
return self.clean_api_response(result)
def clean_api_response(self, result):
"""
Elimina la URL de la película para usuarios no autenticados.
"""
url = "file_name"
if "movies" in result:
for movie in result["movies"]:
del movie[url]
elif "movie" in result:
del result["movie"][url]
return result
def upload_cartel(instance, filename):
first = filename[0].upper()

View File

@ -1,5 +1,6 @@
from django.shortcuts import render
from django.http import HttpResponse
from django.http import JsonResponse
from django.db.models import F
from django.views.decorators.csrf import csrf_exempt
@ -38,3 +39,8 @@ def bugs(request):
def movie(request, id):
context = {"movie": Movie.objects.get_movie_by_id(id)}
return render(request, "movie.html", context)
def api(request):
context = Movie.objects.api(request)
return JsonResponse(context)

View File

@ -4,26 +4,17 @@ from django.conf import settings
from django.conf.urls.static import static
from django.conf.urls import include
# ~ from tastypie.api import Api
from main import views
from main.feeds import LatestMoviesFeed
# ~ from main.api import ResourceMovies
# ~ v1_api = Api(api_name="v1")
# ~ v1_api.register(ResourceMovies())
urlpatterns = [
path("", views.home, name="home"),
path("search/", views.search, name="search"),
path("api/", views.api, name="api"),
path("about/", views.about, name="about"),
path("help/", views.help, name="help"),
path("bugs/", views.bugs, name="bugs"),
path("movie/<int:id>", views.movie, name="movie"),
path("ultimas/rss/", LatestMoviesFeed()),
path("admin/", admin.site.urls),
# path('api/', include(v1_api.urls)),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View File

@ -12,14 +12,19 @@
Las búsquedas tienen un límite de cien resultados.
</li>
<li>
Cualquier búsqueda ignora tildes, mayúsculas y eñes,
así que «<a href="{% url 'search' %}?q=Iñarritú">Iñarritú</a>»
Las búsquedas ignoran mayúsculas, tildes, eñes y signos de puntuación,
así que «<a href="{% url 'search' %}?q=¡Iñarritú!">¡Iñarritú!</a>»
es lo mismo que «<a href="{% url 'search' %}?q=inarritu">inarritu</a>».
</li>
<li>
Las búsquedas no buscan palabras exactas, sino las palabras que comienzan
con el término de búsqueda, así que «<a href="{% url 'search' %}?q=perro">perro</a>»
también incluye los resultados de «perros».
</li>
<li>
Cuando una búsqueda encuentra más de cien películas,
los cien resultados son seleccionados y ordenados de manera aleatoria:
<b>nunca obtendrás los mismos resultados</b>.
<u>nunca obtendrás los mismos resultados</u>.
</li>
</ul>
<h2 id="refinamiento">Refinamiento en las búsquedas</h2>
@ -34,31 +39,31 @@
<tbody>
<tr>
<td><a href="{% url 'search' %}?q=t:lucio">t:lucio</a></td>
<td>Busca «lucio» en los títulos</td>
<td>Busca «lucio» en los <u>t</u>ítulos</td>
</tr>
<tr>
<td><a href="{% url 'search' %}?q=o:monkey">o:monkey</a></td>
<td>Busca «monkey» en los títulos en idioma original</td>
<td>Busca «monkey» en los títulos en idioma <u>o</u>riginal</td>
</tr>
<tr>
<td><a href="{% url 'search' %}?q=y:1989">y:1989</a></td>
<td>Busca películas publicadas en el año (<i>year</i>) «1989»</td>
<td>Busca películas publicadas en el año (<i><u>y</u>ear</i>) «1989»</td>
</tr>
<tr>
<td><a href="{% url 'search' %}?q=p:México">p:México</a></td>
<td>Busca películas hechas en el país «México»</td>
<td>Busca películas hechas en el <u>p</u>aís «México»</td>
</tr>
<tr>
<td><a href="{% url 'search' %}?q=d:varda">d:varda</a></td>
<td>Busca películas dirigidas por «varda»</td>
<td>Busca películas <u>d</u>irigidas por «varda»</td>
</tr>
<tr>
<td><a href="{% url 'search' %}?q=a:uma">a:uma</a></td>
<td>Busca películas en donde actúe «uma»</td>
<td>Busca películas en donde <u>a</u>ctúe «uma»</td>
</tr>
<tr>
<td><a href="{% url 'search' %}?q=g:drama">g:drama</a></td>
<td>Busca películas del género «drama»</td>
<td>Busca películas del <u>g</u>énero «drama»</td>
</tr>
<tr>
</tbody>
@ -73,6 +78,19 @@
Se pueden usar varias palabras con prefijos o no para restringir la búsqueda,
como en «<a href="{% url 'search' %}?q=p:mexico+d:buñuel+cielo">p:mexico d:buñuel cielo</a>».
</li>
<li>
La inexactitud en los resultados permite búsquedas más generales en los campos.
<ul>
<li>
Ejemplo 1: «<a href="{% url 'search' %}?q=y:192">y:192</a>» da como resultado
las películas publicadas en la década de 1920.
</li>
<li>
Ejemplo 2: «<a href="{% url 'search' %}?q=p:a">p:a</a>» da como resultado
las películas hechas en los países que comienzan con «a».
</li>
</ul>
</li>
</ul>
<h2 id="api">API</h2>
<p>
@ -87,14 +105,14 @@
<p>
Es decir, en lugar de
<code><a href="{% url 'search' %}?q=p:mexico+d:cuaron">search/?q=p:mexico+d:cuaron</a></code> usa
<code><a href="{% url 'search' %}?q=p:mexico+d:cuaron"><b>api</b>/?q=p:mexico+d:cuaron</a></code>.
<code><a href="{% url 'api' %}?q=p:mexico+d:cuaron"><u>api</u>/?q=p:mexico+d:cuaron</a></code>.
</p>
<h3>Obtención de ficha</h3>
<p>
Para obtener una película en específico solo necesitas su ID.
<p>
Por ejemplo, para obtener la ficha de <a href="{% url 'movie' id=1596 %}"><i>Gremlins</i></a> usa
<code><a href="{% url 'search' %}?id=1596">api/?id=1596</a></code>.
<code><a href="{% url 'api' %}?id=1596">api/?id=1596</a></code>.
</p>
<p><i>Happy hacking</i> 😎</p>
</div>