Giter Site home page Giter Site logo

Comments (14)

berta24 avatar berta24 commented on July 19, 2024 1

Sarebbe un idea, attivabile e disattivabile, così si può fare dei test, e comunque in ogni caso posso modificare manualmente la tabella inserendo il link giusto

from sonarr-animedownloader.

MainKronos avatar MainKronos commented on July 19, 2024

Le primissime versioni di questo progetto ci provai a farlo, e mi basavo sul sistema di ricerca anime interno di animeworld. Il problema è che animeworld usa un sistema di titoli degli anime completamente casuale, certe volte ci mette un numero per identificare la stagione, altre cambia proprio il titolo e altre volte fonde insieme due stagioni. Quindi la probabilità di falsi match tra sonarr e animeworld è molto alta.

Quindi decisi di usare i link che sicuramente identificano un anime senza ambiguità ma impossibili da ricostruire automaticamente, per questo c'è una tabella dentro il docker.

Per ora non sono riuscito a trovare un sistema univoco che colleghi le serie su sonarr con quelle di animeworld che sia facilmente recuperabile dal sito.

Se vuoi posso abilitare come funzione sperimentale la ricerca automatica tramite animeworld da attivare o disattivare nella pagina dei settings del docker; e vediamo un po' come viene.

from sonarr-animedownloader.

MainKronos avatar MainKronos commented on July 19, 2024

Aggiunto nella 1.6.0

from sonarr-animedownloader.

berta24 avatar berta24 commented on July 19, 2024

Domanda sul funzionamento: quando trova la corrispondenza, aggiunge il link alla tabella di conversione?

E in caso lo faccia, sarebbe possibile aggiungere la possibilità di modificare oltre al nome (già presente) il link sulla tabella di conversione direttamente?

from sonarr-animedownloader.

MainKronos avatar MainKronos commented on July 19, 2024

Quando trova la corrispondenza lo aggiunge alla tabella di conversione, ma verrà utilizzato alla successiva ricerca.

Per l'altra domanda, si sarebbe possibile, però apri un'altro Issue così chiudo questo

from sonarr-animedownloader.

EffeF avatar EffeF commented on July 19, 2024

@MainKronos

Per ora non sono riuscito a trovare un sistema univoco che colleghi le serie su sonarr con quelle di animeworld che sia facilmente recuperabile dal sito.

Dal sito AnimeWorld è possibile recuperare l'ID di MyAnimeList, ad esempio l'anime:
https://www.animeworld.tv/play/demon-slayer-kimetsu-no-yaiba-entertainment-district-arc.IFmFs/
avrà il seguente ID:
https://myanimelist.net/anime/47778

Tale ID, 47778, viene restituito direttamente dai risultati di ricerca con l'API https://www.animeworld.tv/api/search/v2?keyword=

Le API di Sonarr invece ti daranno l'ID di TheTVDB delle serie ricercate.

Potresti integrare il database di Fribb/anime-lists (progetto che mappa gli anime di MyAnimeList su TheTVDB) nel tuo script, per ottenere una corrispondenza migliore tra i risultati di AnimeWorld con l'ID di MyAnimeList e l'anime presente su Sonarr con l'ID di TheTVDB.

Per l'esempio sopra relativo alla terza stagione di Demon Slayer: Kimetsu no Yaiba:
Nelle API di Sonarr, tra le serie ricercate, per questo anime avrai:

{
  "tvdbId": 348545,
}

Nelle API di AnimeWorld, tra i risultati di ricerca, per questo anime avrai:

{
  "malId": 47778,
}

Nel database si avrà:

{
  "livechart_id": 10420,
  "thetvdb_id": 348545,
  "anime-planet_id": "demon-slayer-kimetsu-no-yaiba-entertainment-district-arc",
  "anisearch_id": 15986,
  "anidb_id": 16054,
  "kitsu_id": 44081,
  "mal_id": 47778,
  "type": "TV",
  "notify.moe_id": "ZYVzV-PGR",
  "anilist_id": 142329
}

L'ID TheTVDB 348545 corrisponde, quindi il risultato della ricerca su AnimeWorld con ID MyAnimeList 47778 farà parte della serie Demon Slayer: Kimetsu no Yaiba su Sonarr con ID TheTVDB 348545.

Cercando Demon Slayer: Kimetsu no Yaiba sulle API di AnimeWorld si ottengono tre risultati con tre diversi con ID MyAnimeList, tutti e tre mappati nel database con l'ID TheTVDB 348545, che è quello restituito dall'API di Sonarr, quindi tutti e tre i link faranno parte della serie Demon Slayer: Kimetsu no Yaiba nel file table.json, mettendoli in ordine di anno (info presente nelle API di AnimeWorld), hai le tre stagioni di Demon Slayer: Kimetsu no Yaiba di Sonarr.

Non so quanto questo sistema possa essere efficace, sicuramente ci sarà qualche eccezione sul sito, qualchè anime non mappato nel database, ma forse potrebbe aiutare con l'automatizzazione della ricerca ed essere valido per la maggioranza delle serie, e dato che gli ID teoricamente dovrebbero corrispondere anche se Sonarr e AnimeWorld hanno titoli diversi dovrebbe anche risolvere questo problema ed evitare falsi match:

Il problema è che animeworld usa un sistema di titoli degli anime completamente casuale, certe volte ci mette un numero per identificare la stagione, altre cambia proprio il titolo e altre volte fonde insieme due stagioni. Quindi la probabilità di falsi match tra sonarr e animeworld è molto alta.

from sonarr-animedownloader.

MainKronos avatar MainKronos commented on July 19, 2024

Si, ci avevo pensato ma avevo scartato l'idea per il fatto che l'id di TheTVDB si riferisce all'intera serie e non ad una specifica stagione.
Però non avevo pensato al fatto di poterli riordinare per anno, in questo modo ho un collegamento diretto tra l'id di TheTVDB e la stagione di Animeworld.
Stavo pensando se fosse possibile evitare di recuperare ogni data di uscita di ogni stagione riordinando soltanto gli id di MAL, sarebbe possibile?

from sonarr-animedownloader.

EffeF avatar EffeF commented on July 19, 2024

Stavo pensando se fosse possibile evitare di recuperare ogni data di uscita di ogni stagione riordinando soltanto gli id di MAL, sarebbe possibile?

https://www.animeworld.tv/api/search/v2?keyword=Demon+Slayer%3A+Kimetsu+no+Yaiba come risultati restituiesce tre anime, con questi ID:

[{
        "malId": 38000,
        "name": "Demon Slayer: Kimetsu no Yaiba",
        "release": "06 Aprile 2019",
        "year": "2019"
    }, {
        "malId": 47778,
        "name": "Demon Slayer: Kimetsu no Yaiba Entertainment District Arc",
        "release": "05 Dicembre 2021",
        "year": "2022"
    }, {
        "malId": 49926,
        "name": "Demon Slayer: Kimetsu no Yaiba Mugen Train Arc TV",
        "release": "10 Ottobre 2021",
        "year": "2021"
    }
]

La stagione 2 ha ID 49926 maggiore della stagione 3 con ID 47778, e minore della stagione 1 con ID 38000, quindi gli ID di MAL non sono seguinziali a quanto pare.

Penso che l'unica soluzione sia ordinare i risultati per release.

from sonarr-animedownloader.

berta24 avatar berta24 commented on July 19, 2024

Il problema in questo caso sarebbe in quegli anime che hanno 48 "sub-series" ONA OVA ecc... da 2-3 episodi ognuna che manderebbero in confusione la ricerca

from sonarr-animedownloader.

EffeF avatar EffeF commented on July 19, 2024

Il problema in questo caso sarebbe in quegli anime che hanno 48 "sub-series" ONA OVA ecc... da 2-3 episodi ognuna che manderebbero in confusione la ricerca

Se sono ONA, OVA, ecc. sono segnati come tali sia su AnimeWorld che nel database che ho riportato sopra, basta escluderli dai risultati di ricerca e dal confronto con il database quando avviene una Auto Ricerca, per questi episodi si continuerà con l'inserimento manuale come si fa adesso.

Inoltre, se non sbaglio, tutti questi tipi di episodi sia su Sonarr che su TheTVDB fanno parte della 'Stagione 0' (o 'Specials', come la si voglia chiamare), quindi quando le API di Sonarr restituiranno un episodio della stagione 0 come mancante è possibile non far neanche intervenire la ricerca automatica (Auto Ricerca solo se Stagione mancante su Sonarr > 0).

Per tutti gli episodi "normali" non dovrebbero esserci grandi problemi, basta appunto escludere le stagioni 0, che dovranno continuare a essere inserite manualmente (sempre che in futuro non si trovi una soluzione più comoda).

Se la stagione mancante su Sonarr è superiore a 0 si avvia l'Auto Ricerca,
se il risultato non è un OVA prendi l'ID MAL e confrontalo con il database,
se l'ID TheTVDB nel database corrisponde a quello su Sonarr il risultato fa parte della serie,
ordina tutti i risultati facenti parte della serie per release e dovresti aver ottenuto tutti i link di tutte le stagione di Sonarr per quel dato anime.

L'unico problema che mi viene in mente è:
se una stagione è mancante su AnimeWorld o nei risultati di ricerca? Potrebbe avere la stagione 1 e 3, e ordinandole per release verrebbero aggiunte come stagioni 1 e 2.

from sonarr-animedownloader.

MainKronos avatar MainKronos commented on July 19, 2024

Ho abbozzato una funzione, ditemi che ne pensate:

import animeworld as aw
import requests

def bindAnime(anime_name:str, season:int, thetvdb_id:int) -> dict:

    # ottengo tutti gli ids
    db = requests.get("https://raw.githubusercontent.com/Fribb/anime-lists/master/anime-list-full.json").json()

    # filtro tutti gli ids alla ricerca di tutti i dizionari che contengono lo stesso id di thetvdb
    ids = [
        {
            "thetvdb_id": elem["thetvdb_id"], 
            "mal_id": elem["mal_id"]
        } 
        for elem in db if "thetvdb_id" in elem and elem["thetvdb_id"] == thetvdb_id and elem["type"] == "TV"
    ]

    # ottengo tutti i risultati da animewolrd ricercando solamente con il nome dell'anime
    results = aw.find(anime_name)

    ret = []

    for res in results:
        # controllo se l'id di MAL è presente tra tutti gli id che ho filtrato precedentemente
        if(len([x for x in ids if x["mal_id"] == res["malId"]]) != 0):
            ret.append({
                "name": res["name"],
                "release": res["release"],
                "link": res["link"]
            })

    # riordino per data di uscita
    ret.sort(key=lambda elem: elem["release"])

    # controllo se effettivamente esiste la stagione
    if len(ret) < season: return None
    else:
        # ritorno nome e link
        return {
            "name": ret[season-1]["name"],
            "link": ret[season-1]["link"]
        }

Usando come esempio "86: Eighty Six" stagione 2:

bindAnime("86: Eighty Six", 2, 378609)

>> {'name': '86: Eighty Six 2', 'link': 'https://www.animeworld.tv/play/86-eighty-six-2.cWHjp'}

from sonarr-animedownloader.

EffeF avatar EffeF commented on July 19, 2024

Ho testato la funzione con alcuni anime e sembra andare bene nella maggioranza dei casi:

bindAnime("Demon Slayer: Kimetsu no Yaiba", 1, 348545)
>> {'name': 'Demon Slayer: Kimetsu no Yaiba', 'link': 'https://www.animeworld.tv/play/demon-slayer-kimetsu-no-yaiba.XygS4'}

bindAnime("Demon Slayer: Kimetsu no Yaiba", 2, 348545)
>> {'name': 'Demon Slayer: Kimetsu no Yaiba Mugen Train Arc TV', 'link': 'https://www.animeworld.tv/play/demon-slayer-kimetsu-no-yaiba-2.YIoa-'}

bindAnime("Demon Slayer: Kimetsu no Yaiba", 3, 348545)
>> {'name': 'Demon Slayer: Kimetsu no Yaiba Entertainment District Arc', 'link': 'https://www.animeworld.tv/play/demon-slayer-kimetsu-no-yaiba-entertainment-district-arc.IFmFs'}

Ma ho avuto problemi con gli anime che su AnimeWorld hanno l'ordinamento assoluto:

bindAnime("One Piece", 1, 81797)
>> {'name': 'One Piece', 'link': 'https://www.animeworld.tv/play/one-piece-subita.sORn4'}

bindAnime("One Piece", 2, 81797)
>>{'name': 'One Piece (ITA)', 'link': 'https://www.animeworld.tv/play/one-piece-ita.d5nah'}

bindAnime("One Piece", 8, 81797)
>> None

E con qualche altro anime:

bindAnime("Attack on Titan", 3, 267440)
>> None

bindAnime("Attack on Titan", 1, 267440)
>> {'name': "L'attacco dei Giganti 3 Parte 2 (ITA)", 'link': 'https://www.animeworld.tv/play/lattacco-dei-giganti-3-parte-2-ita.th63O'}

from sonarr-animedownloader.

MainKronos avatar MainKronos commented on July 19, 2024

L'ultimo caso è causato dal fatto che su Animeworld esistono solo "Attack on Titan Season 3 Part 2 (ITA)" e "Attack on Titan Season 3 Part 2 (ITA)"
Per quanto riguarda il problema per la numerazione assoluta, non ho idee per come risolverlo😅

from sonarr-animedownloader.

EffeF avatar EffeF commented on July 19, 2024

L'ultimo caso è causato dal fatto che su Animeworld esistono solo "Attack on Titan Season 3 Part 2 (ITA)" e "Attack on Titan Season 3 Part 2 (ITA)"

Penso sia dovuto al fatto che partendo da Sonarr si effettua una ricerca con il titolo inglese Attack on Titan, che come risultati da solo Attack on Titan Final Season Part 2 e Attack on Titan Season 3 Part 2 (ITA), quindi ordinando quegli unici due risultati per data di rilascio, come prima stagione risulta quella, mentre cercando con il titolo originale si ottengono anche tutte le altre stagioni.

Potresti integrare delle API terze, come Jikan, per ottenere il titolo corretto della stagione da cercare.

Non conosco bene Python, sicuramente dovrai correggerlo:

import animeworld as aw
import requests

from jikanpy import Jikan

jikan = Jikan()

def bindAnime(season:int, thetvdb_id:int) -> dict:
    # ottengo tutti gli ids
    db = requests.get("https://raw.githubusercontent.com/Fribb/anime-lists/master/anime-list-full.json").json()

    # filtro tutti gli ids alla ricerca di tutti i dizionari che contengono lo stesso id di thetvdb
    ids = [
        {
            "thetvdb_id": elem["thetvdb_id"],
            "mal_id": elem["mal_id"]
        }
        for elem in db if "thetvdb_id" in elem and elem["thetvdb_id"] == thetvdb_id and elem["type"] == "TV"
    ]

    # ottengo tutti gli anime con quel dato id di thetvdb
    animes = []

    for elem in ids:
        anime = jikan.anime(elem["mal_id"])
        animes.append({
            "name": anime["title"],
            "id": anime["mal_id"]
        })

    # ottengo tutti gli anime da AnimeWorld
    ret = []

    for anime in animes:
        results = aw.find(anime["name"])

        for result in results:
            # controllo se l'id di MAL è presente tra tutti gli id che ho filtrato precedentemente
            if len([x for x in animes if x["id"] == result["malId"]]) != 0:
                ret.append({
                    "name": result["name"],
                    "release": result["release"],
                    "link": result["link"]
                })

    # riordino per data di uscita
    ret.sort(key=lambda elem: elem["release"])

    # controllo se effettivamente esiste la stagione
    if len(ret) < season:
        return None
    else:
        # ritorno nome e link
        return {
            "name": ret[season - 1]["name"],
            "link": ret[season - 1]["link"]
        }
bindAnime(1, 267440)  # Attack on Titan
>> {'name': "L'attacco dei Giganti (ITA)", 'link': 'https://www.animeworld.tv/play/l-attacco-dei-giganti.L7UZ4'}

bindAnime(2, 267440)  # Attack on Titan
>> {'name': "L'attacco dei Giganti 2", 'link': 'https://www.animeworld.tv/play/lattacco-dei-giganti-2-i.CqTmO'}

bindAnime(3, 267440)  # Attack on Titan
>> {'name': "L'attacco dei Giganti 2 (ITA)", 'link': 'https://www.animeworld.tv/play/lattacco-dei-giganti-2.Gr23j'}

Alla stagione 3 riporta la stagione 2 perché ci sono due seconde stagioni, e mettendole in ordine di data di uscita risulta terza.
Nel caso ci siano nei risultati due anime con lo stesso ID MAL, uno la stagione in italiano e uno la stagione, andrebbero filtrati i risultati mantenendo solo una lingua... ma come ho detto non conosco bene Python, e non so farlo 😅

from sonarr-animedownloader.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.