Jak wybrać napisy
Do jednego odcinka bywa kilka wersji od różnych osób. Napisy są robione pod konkretne wydanie wideo, więc ważne, żeby pasowały do Twojego pliku.
Serwer wybiera za Ciebie
Endpoint /api/v1/match przyjmuje nazwę pliku wideo i zwraca napisy od najlepiej pasujących. Z nazwy odczytuje tytuł, odcinek, grupę, rozdzielczość i źródło (WEB-DL, BD), a potem punktuje każde napisy do tego odcinka. Pierwszy wynik to najlepszy wybór, a pole score pokazuje, ile punktów dostał.
- +10
- Autor podał nazwę pliku wideo (releaseFilename) i jest taka sama jak Twoja.
- +4 lub +3
- Ta sama grupa wydania. Trzy punkty, gdy autor wymienił ją jako „pasuje też do” (alsoCompatible).
- +3
- Ta sama rozdzielczość.
- +2
- To samo źródło (np. WEB-DL).
- +3 lub −3
- Długość wideo różni się o mniej niż 3 sekundy (plus) albo o ponad 30 sekund (minus). Wymaga parametru duration.
- +1
- Preferowany format, domyślnie ASS.
Remisy rozstrzyga liczba pobrań, a potem nowsze wgranie.
Dostrój wybór
duration to długość wideo w milisekundach. Znasz ją z odtwarzacza lub z ffprobe, a dzięki niej wygrywają napisy pod takie samo wydanie. format=srt zamienia preferencję na SRT (dobre, gdy klient wypala ASS w obrazie). Gdy nazwa pliku jest nietypowa, dodaj anilistId i episode.
curl -G -H "Authorization: Bearer $FANSUBY_KEY" \
--data-urlencode "filename=[SubsPlease] Sousou no Frieren - 05 (1080p).mkv" \
-d duration=1421000 -d format=srt \
"https://fansuby.cc/api/v1/match"Gdy napisy się rozjeżdżają
- Spróbuj drugiego wyniku z listy. Pozycje poniżej pierwszej są dobrymi zapasowymi kandydatami, zwłaszcza z tej samej grupy co wideo.
- Podaj
duration, żeby serwer odrzucił napisy do wydania o innej długości. - Stałe przesunięcie poprawisz w odtwarzaczu. Przy dużej różnicy cięć potrzebne są napisy do tego wydania.
Wybór na własną rękę
Jeśli wolisz własną logikę, użyj /api/v1/subtitles i porównaj pola sam. Oto, co oznaczają.
- releaseGroup, releaseSource, resolution
- Wydanie, pod które robiono napisy. Najlepiej, żeby grupa, źródło i rozdzielczość zgadzały się z Twoim plikiem.
- releaseFilename
- Nazwa pliku wideo, do którego dopasowano napisy (autor nie zawsze ją podaje).
- alsoCompatible
- Inne wydania z tym samym timingiem, wymienione przez autora.
- videoDurationMs
- Długość wideo, pod które zrobiono napisy. Różnica rzędu kilku sekund to sygnał rozjazdu.
- format
- ass trzyma style i efekty, srt to sam tekst.
- hasTypesetting, hasKaraoke
- Napisy zawierają typesetting (znaki, szyldy) lub karaoke.
- version
- Numer wersji. Lista zwraca aktualną, starszą pobierzesz parametrem v=N.
Listę zawęzisz w zapytaniu filtrami resolution, source, group i format:
curl -H "Authorization: Bearer $FANSUBY_KEY" \
"https://fansuby.cc/api/v1/subtitles?anilistId=154587&episode=5&resolution=1080p&group=SubsPlease"A tak wygląda uproszczone punktowanie po stronie klienta:
import re
def pick(items, filename):
"""Najlepsze napisy dla pliku wideo o tej nazwie."""
resolution = re.search(r"\b(\d{3,4}p)\b", filename)
group = re.match(r"\[([^\]]+)\]", filename)
def score(s):
return (
(4 if group and s["releaseGroup"] == group[1] else 0)
+ (3 if resolution and s["resolution"] == resolution[1] else 0)
+ (1 if s["format"] == "ass" else 0)
)
return max(items, key=score)Skrypty z poradników używają /match, więc nie potrzebują tego kodu. Zaczniesz od napisów do jednego pliku.