mirror of
https://github.com/partitioncloud/partitioncloud-server.git
synced 2025-01-23 09:16:25 +01:00
Ajout de la recherche google
This commit is contained in:
parent
ca72bbb89b
commit
121fa288d2
@ -11,7 +11,7 @@ from flask import (Blueprint, abort, flash, redirect, render_template, request,
|
||||
from .auth import login_required
|
||||
from .db import get_db
|
||||
from .utils import User, Album, get_all_partitions
|
||||
from .search import search as srch
|
||||
from . import search
|
||||
|
||||
bp = Blueprint("albums", __name__, url_prefix="/albums")
|
||||
|
||||
@ -27,14 +27,16 @@ def index():
|
||||
|
||||
@bp.route("/search", methods=["POST"])
|
||||
@login_required
|
||||
def search():
|
||||
def search_page():
|
||||
if "query" not in request.form or request.form["query"] == "":
|
||||
flash("Aucun terme de recherche spécifié.")
|
||||
return redirect("/albums")
|
||||
|
||||
query = request.form["query"]
|
||||
partitions = srch(query, get_all_partitions())
|
||||
return render_template("albums/search.html", partitions=partitions, query=query)
|
||||
search.flush_cache()
|
||||
partitions_local = search.local_search(query, get_all_partitions())
|
||||
google_results = search.online_search(query)
|
||||
return render_template("albums/search.html", partitions=partitions_local, google_results=google_results, query=query)
|
||||
|
||||
@bp.route("/<uuid>")
|
||||
def album(uuid):
|
||||
|
@ -29,6 +29,23 @@ def partition(uuid):
|
||||
return send_file(os.path.join("partitions", f"{uuid}.pdf"))
|
||||
|
||||
|
||||
@bp.route("/search/<uuid>")
|
||||
@login_required
|
||||
def partition_search(uuid):
|
||||
db = get_db()
|
||||
partition = db.execute(
|
||||
"""
|
||||
SELECT * FROM search_results
|
||||
WHERE uuid = ?
|
||||
""",
|
||||
(uuid,)
|
||||
).fetchone()
|
||||
|
||||
if partition is None:
|
||||
abort(404)
|
||||
return send_file(os.path.join("search-partitions", f"{uuid}.pdf"))
|
||||
|
||||
|
||||
@bp.route("/")
|
||||
@admin_required
|
||||
def index():
|
||||
|
@ -3,6 +3,7 @@ DROP TABLE IF EXISTS partition;
|
||||
DROP TABLE IF EXISTS album;
|
||||
DROP TABLE IF EXISTS contient_partition;
|
||||
DROP TABLE IF EXISTS contient_user;
|
||||
DROP TABLE IF EXISTS search_results;
|
||||
|
||||
CREATE TABLE user (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
@ -35,3 +36,8 @@ CREATE TABLE contient_user (
|
||||
album_id INTEGER NOT NULL,
|
||||
PRIMARY KEY (user_id, album_id)
|
||||
);
|
||||
|
||||
CREATE TABLE search_results (
|
||||
uuid TEXT(36) PRIMARY KEY,
|
||||
creation_time TEXT NULL DEFAULT (datetime('now', 'localtime'))
|
||||
);
|
@ -2,8 +2,16 @@
|
||||
"""
|
||||
Module implémentant la recherche de partitions par mots-clés
|
||||
"""
|
||||
from uuid import uuid4
|
||||
import urllib.request
|
||||
import os
|
||||
|
||||
def search(query, partitions):
|
||||
import googlesearch
|
||||
|
||||
from .db import get_db
|
||||
|
||||
|
||||
def local_search(query, partitions):
|
||||
"""
|
||||
Renvoie les 5 résultats les plus pertinents parmi une liste donnée
|
||||
"""
|
||||
@ -30,3 +38,75 @@ def search(query, partitions):
|
||||
else:
|
||||
break
|
||||
return sorted_partitions[:min(5,len(sorted_partitions))]
|
||||
|
||||
|
||||
def online_search(query):
|
||||
"""
|
||||
Renvoie les 5 résultats les plus pertinents depuis google
|
||||
"""
|
||||
db = get_db()
|
||||
query = f"partition filetype:pdf {query}"
|
||||
partitions = []
|
||||
results = googlesearch.search(
|
||||
query,
|
||||
num=5,
|
||||
stop=5,
|
||||
pause=1
|
||||
)
|
||||
for element in results:
|
||||
while True:
|
||||
try:
|
||||
uuid = str(uuid4())
|
||||
db.execute(
|
||||
"""
|
||||
INSERT INTO search_results (uuid)
|
||||
VALUES (?)
|
||||
""",
|
||||
(uuid,)
|
||||
)
|
||||
urllib.request.urlretrieve(element, f"partitioncloud/search-partitions/{uuid}.pdf")
|
||||
|
||||
os.system(
|
||||
f'/usr/bin/convert -thumbnail\
|
||||
"178^>" -background white -alpha \
|
||||
remove -crop 178x178+0+0 \
|
||||
partitioncloud/search-partitions/{uuid}.pdf[0] \
|
||||
partitioncloud/static/search-thumbnails/{uuid}.jpg'
|
||||
)
|
||||
partitions.append(
|
||||
{
|
||||
"name": element.split("://")[1].split("/")[0],
|
||||
"uuid": uuid
|
||||
}
|
||||
)
|
||||
db.commit()
|
||||
break
|
||||
except db.IntegrityError:
|
||||
pass
|
||||
except urllib.error.HTTPError as e:
|
||||
print(e)
|
||||
return partitions
|
||||
|
||||
|
||||
def flush_cache():
|
||||
"""
|
||||
Supprimer les résultats de recherche datant de plus de 15 minutes
|
||||
"""
|
||||
db = get_db()
|
||||
expired_cache = db.execute(
|
||||
"""
|
||||
SELECT uuid FROM search_results
|
||||
WHERE creation_time <= datetime('now', '-15 minutes', 'localtime')
|
||||
"""
|
||||
).fetchall()
|
||||
for element in expired_cache:
|
||||
uuid = element["uuid"]
|
||||
os.remove(f"partitioncloud/search-partitions/{uuid}.pdf")
|
||||
os.remove(f"partitioncloud/static/search-thumbnails/{uuid}.jpg")
|
||||
|
||||
db.execute(
|
||||
"""
|
||||
DELETE FROM search_results
|
||||
WHERE creation_time <= datetime('now', '-15 minutes', 'localtime')
|
||||
"""
|
||||
)
|
@ -174,6 +174,11 @@ input[type=submit] {
|
||||
overflow-x: scroll;
|
||||
}
|
||||
|
||||
#search-partitions-grid {
|
||||
display: flex;
|
||||
overflow-x: scroll;
|
||||
}
|
||||
|
||||
#header-actions {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
{% block content %}
|
||||
{% if partitions|length != 0 %}
|
||||
<h4>Résultats dans la bibliothèque locale</h4>
|
||||
<div id="partitions-grid">
|
||||
{% for partition in partitions %}
|
||||
<a href="/partition/{{ partition['uuid'] }}">
|
||||
@ -19,7 +20,20 @@
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div>Aucune partition ne correspond aux termes de votre requête</div>
|
||||
{% endif %}
|
||||
{% if google_results|length != 0 %}
|
||||
<h4>Résultats de la recherche en ligne</h4>
|
||||
<div id="partitions-grid">
|
||||
{% for partition in google_results %}
|
||||
<a href="/partition/search/{{ partition['uuid'] }}">
|
||||
<div class="partition" id="partition-{{ partition['uuid'] }}">
|
||||
<img class="partition-thumbnail" src="/static/search-thumbnails/{{ partition['uuid'] }}.jpg">
|
||||
<div class="partition-description">
|
||||
<div class="partition-name">{{ partition["name"] }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
Loading…
Reference in New Issue
Block a user