Fonctions de filtrage et d'association par propriété commune

This commit is contained in:
redstorm45 2017-12-11 10:58:47 +01:00
parent 63a45247e3
commit cbbb8148b5

78
main.py
View file

@ -115,39 +115,25 @@ def handle_films(Lfilm_loc, Lfilm_api, domain, api, rules, tok):
#print('api titles:', '|'.join(sorted([f.title for f in Lapi])))
# supprime les dossiers de l'api (ils ne devraient pas apparaître)
Linvalid = [f for f in Lapi if (not tok.conf.is_valid_file(f.name)) or not (filerule.match_rules(f.path+'/'+f.name, rules))]
Lapi = [f for f in Lapi if tok.conf.is_valid_file(f.name)]
Lapi, Linvalid = filter_by(Lapi, lambda f:tok.conf.is_valid_file(f.name) and filerule.match_rules(f.path+'/'+f.name, rules))
# Compare avec la liste de l'api
Lmissing = [f for f in Lapi if f not in Lloc] # fichiers non présents localement
Lunref = [f for f in Lloc if f not in Lapi] # fichiers non référencés
# Fichiers déplacés (ou copiés) localement
Lrelink = [] # liste des références à changer
for file2 in Lunref:
for file1 in Lapi:
if file1.filename_same(file2):
Lrelink.append((file1, file2))
break
for fApi, fLoc in Lrelink:
Lunref, _, Lrelink = update_find_by_common(Lunref, Lapi, lambda f:f.name)
for floc, fapi in Lrelink:
if fApi in Lmissing:
Lmissing.remove(fApi)
Lunref.remove(fLoc)
print('moved/copied:', Lrelink)
# Linke les fichiers identiques au même film
Llink = []
for file1 in Lunref:
for file2 in Lapi:
if file1.title == file2.title:
Llink.append((file1, file2))
print('D add:', file1, file2, file2.api_id)
break
print('doubles:', sorted(Llink, key=lambda f:str(f)))
# Linke les fichiers du même titre (simplifié) au même film
Lunref, _, Llink = update_find_by_common(Lunref, Lapi, lambda f:f.title)
for f, fApi in Llink:
if fApi in Lmissing:
Lmissing.remove(fApi)
Lunref.remove(f)
print('doubles:', sorted(Llink, key=lambda f:str(f[0])))
# Linke les films par nom si possible
APIfilms = api.get_films()
@ -155,12 +141,12 @@ def handle_films(Lfilm_loc, Lfilm_api, domain, api, rules, tok):
for f in APIfilms:
if f['title']:
t = f['title'].replace(' ','').lower()
if len(t) <= 2:
if len(t) > 2:
if t not in [e[0] for e in API_alltitles]:
API_alltitles.append((t, f['id']))
if f['title_vo']:
t = f['title_vo'].replace(' ','').lower()
if len(t) <= 2:
if len(t) > 2:
if t not in [e[0] for e in API_alltitles]:
API_alltitles.append((t, f['id']))
Llink2 = []
@ -206,7 +192,7 @@ def handle_films(Lfilm_loc, Lfilm_api, domain, api, rules, tok):
# Put les renommages / déplacements
i = 0
for filmApi, filmLoc in Lrelink:
for filmLoc, filmApi in Lrelink:
i += 1
print('['+str(i)+'/'+str(len(Lrelink))+']'+'relink:', filmApi.title)
try:
@ -291,8 +277,7 @@ def handle_episodes(Lepisode_loc, Lepisode_api, domain, api, rules, tok):
Lapi = Lepisode_api
# fichiers invalides
Linvalid = [f for f in Lapi if (not tok.conf.is_valid_file(f.name)) or not (filerule.match_rules(f.path+'/'+f.name, rules))]
Lapi = [f for f in Lapi if tok.conf.is_valid_file(f.name)]
Lapi, Linvalid = filter_by(Lapi, lambda f:tok.conf.is_valid_file(f.name) and filerule.match_rules(f.path+'/'+f.name, rules))
# Compare avec la liste de l'api
Lmissing = [f for f in Lapi if f not in Lloc] # fichiers non présents localement
@ -391,6 +376,49 @@ def handle_episodes(Lepisode_loc, Lepisode_api, domain, api, rules, tok):
# TODO: traiter les séries non référencées (series_not_found)
def filter_by(L, f_prop):
"""
Sépare la liste L en deux listes,
suivant s'ils vérifient la propriété ou non
"""
prop_true, prop_false = [], []
for e in L:
if f_prop(e):
prop_true.append(e)
else:
prop_false.append(e)
return prop_true, prop_false
def update_find_by_common(L1, L2, f_prop):
"""
Effectue une recherche de propriétés commune entre les éléments
de L1 et L2, et retourne les listes modifiés:
L1, L2, Lassociation
"""
found = find_by_common(L1, L2, f_prop)
found1 = [f[0] for f in found]
found2 = [f[1] for f in found]
L1 = [e for e in L1 if e not in found1]
L2 = [e for e in L2 if e not in found2]
return L1, L2, found
def find_by_common(L1, L2, f_prop):
"""
Associe les éléments de <L1> et <L2> à travers leur propriétés
trouvées avec la fonction f_prop.
Les éléments de L1 ne sont associés qu'une fois, ceux de L2 plusieurs
"""
found = []
Lprop2 = [f_prop(e) for e in L2]
for i, e1 in enumerate(L1):
prop1 = f_prop(e1)
if prop1 in Lprop2:
j = Lprop2.find(prop1)
e2 = L2[j]
found.append((e1, e2))
break
return found
def post_markers(api, file_, fileid):
"""