Am 10.02.23 um 19:11 schrieb Kay Martinen:
> Hat jemand praktische Erfahrungen mit dem tool 'tvnamer'?
Nope.
> Da wünschte ich mir eher eine Schnittstelle zu
fernsehserien.de um die
> entsprechend vorbereiten zu können. Gibt es so ein Tool vielleicht auch
> oder gar eines das in die Erwünschte Struktur umsortieren könnte?
Hatte mal probiert einen Scraper für die zu schreiben, jedoch
gibt es kein API und das HTML ist nicht stabil. Nimm lieber
themoviedb.org, dafür gibt es Scraper und dann stimmt die
Reihenfolge auch bei anderen Programmen.
Ich habe mir für den persönlichen Gebrauch etwas zusammengerotzt,
das gut genug ist. Ich hänge den Quellcode deshalb hier einfach
an. Gebrauch:
$ fetch-titles --tv-show "Akte X" --numbers --range 1,2x3-2x5
01x01 Gezeichnet
01x02 Die Warnung
01x03 Das Nest
01x04 Signale
01x05 Der Teufel von Jersey
01x06 Schatten
01x07 Die Maschine
01x08 Eis
01x09 Besessen
01x10 Gefallener Engel
01x11 Eve
01x12 Feuer
01x13 Die Botschaft
01x14 Verlockungen
01x15 Lazarus
01x16 Ewige Jugend
01x17 Täuschungsmanöver
01x18 Der Wunderheiler
01x19 Verwandlungen
01x20 Der Kokon
01x21 Ein neues Nest
01x22 Wiedergeboren
01x23 Roland
01x24 Das Labor
02x03 Blut
02x04 Schlaflos
02x05 Unter Kontrolle
Zum Umbenennen kann man dann:
$ fetch-titles ... | name-files-from-list *.mp4
Natürlich sind die Treffer für den Titel nicht immer eindeutig.
Dann einfach auf
https://themoviedb.org/ gehen und den Titel
suchen, anklicken und aus der URL die ID (kurze Zahl) ablesen,
und bei --title nnn angeben.
Vor Gebrauch bei TMDB registrieren, API-Key generieren und im
Script eintragen.
MfG
fetch-titles:
#!/usr/bin/python
import argparse
import tmdbv3api
import os
import re
import bisect
args = argparse.ArgumentParser()
args.add_argument( '--lang', metavar='iso_639_1' )
args.add_argument( '--numbers', action='store_true' )
args.add_argument( '--tv-show', metavar='title' )
args.add_argument( '--range', metavar='1,2x9-3x5' )
args = args.parse_args()
def get_lang():
if args.lang is not None: return args.lang
if 'LANG' in os.environ:
m = re.match( r'^([a-z]{2})(?:_[A-Z]{2})?(?:\..*)$',
os.environ['LANG'] )
if m: return m[1]
return 'en'
def se2range( season, episode ):
return 1000 * int(season) + int(episode)
def se2range_s( season, episode='' ):
if episode == '': episode = 0
return se2range( season, episode )
def se2range_e( season, episode='' ):
if episode == '': episode = 999
return se2range( season, episode )
sf = None
if args.range is not None:
sf = [[ 0, 0 ]]
for r in args.range.split(','):
v = r.split('-')
if len(v) < 2: v.append( v[0] )
v[0] = se2range_s( * v[0].split('x') )
v[1] = se2range_e( * v[1].split('x') )
sf.append( v )
sf.sort( key=lambda x: x[0] )
def chk_range( c ):
if sf is None: return True
i = bisect.bisect_right( sf, c, key=lambda x: x[0] ) - 1
return c <= sf[i][1]
tmdb = tmdbv3api.TMDb()
tmdb.api_key = "Hier eigenen API-Key einsetzen"
tmdb.language = get_lang()
if args.tv_show is not None:
if re.fullmatch( r'\d+', args.tv_show ):
show_id = int( args.tv_show )
else:
show_id = tmdbv3api.TV().search( args.tv_show )[0]['id']
show = tmdbv3api.TV().details( show_id, append_to_response='' )
for s in show['seasons']:
snr = int( s['season_number'] )
season = tmdbv3api.Season().details( show['id'], snr )
for e in season['episodes']:
enr = int( e['episode_number'] )
if chk_range( se2range( snr, enr )):
if args.numbers:
print( '%02dx%02d ' % ( snr, enr ), end='' )
print( e['name'] )
---8<---
name-files-from-list:
#!/bin/sh
while read -r name
do
from="$1"
ext="${from#*.}"
mv "$from" "$name.$ext"
shift
done