Amélioration recherche
This commit is contained in:
89
chef_mou.py
89
chef_mou.py
@@ -6,11 +6,35 @@ import aiohttp
|
|||||||
import asyncio
|
import asyncio
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
import random
|
import random
|
||||||
|
import re
|
||||||
|
from difflib import SequenceMatcher
|
||||||
|
from heapq import nlargest as _nlargest
|
||||||
|
|
||||||
class ChefMou(Plugin):
|
class ChefMou(Plugin):
|
||||||
async def start(self) -> None:
|
async def start(self) -> None:
|
||||||
self.on_external_config_update()
|
self.on_external_config_update()
|
||||||
|
|
||||||
|
def get_close_matches_indexes(self, word, possibilities, n=3, cutoff=0.6):
|
||||||
|
if not n > 0:
|
||||||
|
raise ValueError("n must be > 0: %r" % (n,))
|
||||||
|
if not 0.0 <= cutoff <= 1.0:
|
||||||
|
raise ValueError("cutoff must be in [0.0, 1.0]: %r" % (cutoff,))
|
||||||
|
result = []
|
||||||
|
s = SequenceMatcher()
|
||||||
|
s.set_seq2(word)
|
||||||
|
for idx, x in enumerate(possibilities):
|
||||||
|
s.set_seq1(x)
|
||||||
|
if s.real_quick_ratio() >= cutoff and \
|
||||||
|
s.quick_ratio() >= cutoff and \
|
||||||
|
s.ratio() >= cutoff:
|
||||||
|
result.append((s.ratio(), idx))
|
||||||
|
|
||||||
|
# Move the best scorers to head of list
|
||||||
|
result = _nlargest(n, result)
|
||||||
|
|
||||||
|
# Strip scores for the best n matches
|
||||||
|
return [x for score, x in result]
|
||||||
|
|
||||||
|
|
||||||
async def get_site_content(self):
|
async def get_site_content(self):
|
||||||
async with aiohttp.ClientSession() as session:
|
async with aiohttp.ClientSession() as session:
|
||||||
@@ -49,30 +73,49 @@ class ChefMou(Plugin):
|
|||||||
loop.close()
|
loop.close()
|
||||||
return
|
return
|
||||||
soup = await self.get_site_content()
|
soup = await self.get_site_content()
|
||||||
s = soup.find('th', string=chunks[2])
|
# Récuperer liste morceaux
|
||||||
if not s :
|
s = soup.select('th', background='/fond3.gif')
|
||||||
await evt.respond("Morceau non trouvé")
|
# Object bts en str
|
||||||
return
|
parsedList=[]
|
||||||
t = s.parent.findAll('a')
|
originalList=[]
|
||||||
idx = 9
|
for ts in s:
|
||||||
if chunks[1].lower() == "souba" or chunks[1].lower() == "soubassophone" or chunks[1].lower() == "sb":
|
fullTitre = ts.text
|
||||||
idx = 0
|
#Supression des ()
|
||||||
elif chunks[1].lower() == "basse" or chunks[1].lower() == "bs" :
|
parsedList.append(re.sub("[\(\[].*?[\)\]]", "", fullTitre))
|
||||||
idx = 1
|
#On garde une copie pour la recherche
|
||||||
elif chunks[1].lower() == "trombone" or chunks[1].lower() == "tb":
|
originalList.append(ts.text)
|
||||||
idx = 2
|
|
||||||
elif chunks[1].lower() == "trompette" or chunks[1].lower() == "tp":
|
|
||||||
idx = 3
|
|
||||||
elif chunks[1].lower() == "sax" or chunks[1].lower() == "saxophone":
|
|
||||||
idx = 4
|
|
||||||
elif chunks[1].lower() == "clarinette" or chunks[1].lower() == "cl":
|
|
||||||
idx = 5
|
|
||||||
else:
|
|
||||||
await evt.respond("Pas trouvé cet instru")
|
|
||||||
loop.close()
|
|
||||||
return
|
|
||||||
|
|
||||||
await evt.respond("["+chunks[2]+ " " + chunks[1]+"]"+"(<https://partoches.pustule.org"+t[idx].get("href")+">)")
|
# Fonction qui retourne l'index du string le plus proche
|
||||||
|
idxTitre = self.get_close_matches_indexes(chunks[2], parsedList, cutoff=0.4)
|
||||||
|
# Si trouvé le chercher sinon erreur
|
||||||
|
if len(idxTitre) > 0 :
|
||||||
|
#Et on recherche dans la liste originale avec le titre original
|
||||||
|
s = soup.find('th', string=originalList[idxTitre[0]])
|
||||||
|
t = s.parent.findAll('a')
|
||||||
|
idx = 9
|
||||||
|
if chunks[1].lower() == "souba" or chunks[1].lower() == "soubassophone" or chunks[1].lower() == "sb":
|
||||||
|
idx = 0
|
||||||
|
elif chunks[1].lower() == "basse" or chunks[1].lower() == "bs" :
|
||||||
|
idx = 1
|
||||||
|
elif chunks[1].lower() == "trombone" or chunks[1].lower() == "tb":
|
||||||
|
idx = 2
|
||||||
|
elif chunks[1].lower() == "trompette" or chunks[1].lower() == "tp":
|
||||||
|
idx = 3
|
||||||
|
elif chunks[1].lower() == "sax" or chunks[1].lower() == "saxophone":
|
||||||
|
idx = 4
|
||||||
|
elif chunks[1].lower() == "clarinette" or chunks[1].lower() == "cl":
|
||||||
|
idx = 5
|
||||||
|
else:
|
||||||
|
await evt.respond("Pas trouvé cet instru")
|
||||||
|
loop.close()
|
||||||
|
return
|
||||||
|
try :
|
||||||
|
await evt.respond("["+originalList[idxTitre[0]]+ " " + chunks[1]+"]"+"(<https://partoches.pustule.org"+t[idx].get("href")+">)")
|
||||||
|
except IndexError:
|
||||||
|
await evt.respond("Le morceau "+ strTitre[0] + " existe mais pas ta partoche")
|
||||||
|
|
||||||
|
else:
|
||||||
|
await evt.respond("Morceau non trouvé")
|
||||||
else:
|
else:
|
||||||
await evt.respond("Nope !")
|
await evt.respond("Nope !")
|
||||||
loop.close()
|
loop.close()
|
||||||
|
|||||||
Reference in New Issue
Block a user