Synology-Forum.nl

Packages => 3rd party Packages => NZBGet => Topic gestart door: TheMystery op 12 november 2015, 18:07:18

Titel: Post proces script extract subs to srt
Bericht door: TheMystery op 12 november 2015, 18:07:18
Hallo,

Ik zoek een script die in de default download dir uit een mkv de ondertiteling extract.
Nu kan dit heel gemakkelijk met ffmpeg, dit heb ik getest en werkt goed op mijn synology alleen zou ik het via een script willen laten lopen via nzbget.
Nu zit er een optie in het script nzbtomedia om dit te doen, maar dit script is gemaakt voor couchpatato en sickbeard en is gemaakt om media om te zetten.
Is er een script die alleen de srt files extract?
Titel: Re: Post proces script extract subs to srt
Bericht door: Birdy op 12 november 2015, 21:26:22
Nee, die staat niet in het lijstje. (https://github.com/nzbget/nzbget/wiki/Catalog-of-post-processing-scripts) en hier ook niet (http://forum.nzbget.net/viewforum.php?f=8).
Maar ja, ik denk dat je ook de enige NZBGet gebruiker bent die uit een mkv de ondertiteling wil extracten middels een post-processing script. ::)
Titel: Re: Post proces script extract subs to srt
Bericht door: TheMystery op 12 november 2015, 21:36:25
Helaas, maar nzbget is de enige plaatst waar het geautomatiseerd mee zou kunnen.
Titel: Re: Post proces script extract subs to srt
Bericht door: Ben(V) op 12 november 2015, 22:48:27
Op zich zijn het een paar regels python om ffmpeg aan te roepen en daarmee een sub uit de mkv te extracten.
Heb helaas momenteel geen tijd iets voor je te schrijven.
Titel: Re: Post proces script extract subs to srt
Bericht door: TheMystery op 12 november 2015, 23:02:01
Het zal idd niet veel code zijn, maar heb zelf nooit een python programma gemaakt en programmeren is voor mij al weer 10 jaar geleden.
En als je het goed wil doen dat alle subs extract worden met dezelfde naam als de mkv en extensie voor NL en Engels is het stiekem toch wat meer code.
Titel: Re: Post proces script extract subs to srt
Bericht door: TheMystery op 12 november 2015, 23:14:42
Hier wel een script gevonden:
https://github.com/xelfer/scripts/blob/master/mkv2srt.py

Eens een keer kijken of ik tijd heb of ik deze werkend krijg binnen nzbget.
Titel: Re: Post proces script extract subs to srt
Bericht door: TheMystery op 13 november 2015, 09:47:18
Ik heb nu het script een beetje aangepast en deze werkt nu via de commandline:

#!/usr/bin/env python
#
##############################################################################
### NZBGET POST-PROCESSING SCRIPT                                          ###

#
# Script to rip srt/ssa subtitles out of .mkv files
# Usage: scriptname.py [filename.mkv]
# If the filename isn't specified all .mkv files in the current directory will be processed
# Developed with ffmpeg 2.1.1, you probably want that or higher if this doesn't work
#

##############################################################################
### OPTIONS                                                                ###

### NZBGET POST-PROCESSING SCRIPT                                          ###
##############################################################################

import glob, re, argparse
from subprocess import call

ffmpeg = '/usr/syno/bin/ffmpeg'

parser = argparse.ArgumentParser(description='Extract subtitles from mkv files.')
parser.add_argument('-f', '--file', help="source filename (mkv) to extract subtitle from")
args = parser.parse_args()

def process(i):
        return [ffmpeg, '-i', i, re.sub(r".mkv", ".nl.srt", i)]

if args.file is None:
        mkvs = glob.glob("*.mkv")
        if (len(mkvs) == 0):
                print "No .mkv files in current directory"
        for i in mkvs:
                call(process(i))
else:
        call(process(args.file))

Als ik deze nu via NZBget uit laat voeren dan wordt deze niet in de goede dir uitgevoerd, krijg namelijk de melding:
No .mkv files in current directory
Nu zal ik in het script de parameter NZBPP_DIRECTORY moeten verwerken zodat deze in de juiste dir uitgevoerd wordt, alleen kom ik hier niet echt uit.
Iemand een tip hiervoor?
Titel: Re: Post proces script extract subs to srt
Bericht door: TheMystery op 13 november 2015, 10:53:03
Uiteindelijk allemaal werkend gekregen met het volgende script:

#!/usr/bin/env python
#
##############################################################################
### NZBGET POST-PROCESSING SCRIPT                                          ###

#
# Script to rip srt/ssa subtitles out of .mkv files
# Usage: scriptname.py [filename.mkv]
# If the filename isn't specified all .mkv files in the current directory will be processed
# Developed with ffmpeg 2.1.1, you probably want that or higher if this doesn't work
#

##############################################################################
### OPTIONS                                                                ###

### NZBGET POST-PROCESSING SCRIPT                                          ###
##############################################################################

import glob, re, argparse, os, sys
from subprocess import call

os.chdir(os.environ['NZBPP_DIRECTORY'])

# Exit codes used by NZBGet
POSTPROCESS_SUCCESS=93
POSTPROCESS_ERROR=94

ffmpeg = '/usr/syno/bin/ffmpeg'

parser = argparse.ArgumentParser(description='Extract subtitles from mkv files.')
parser.add_argument('-f', '--file', help="source filename (mkv) to extract subtitle from")
args = parser.parse_args()

def process(i):
        return [ffmpeg, '-i', i, re.sub(r".mkv", ".nl.srt", i)]

if args.file is None:
        mkvs = glob.glob("*.mkv")
        if (len(mkvs) == 0):
                print "No .mkv files in current directory"
        for i in mkvs:
                call(process(i))
else:
        call(process(args.file))

sys.exit(POSTPROCESS_SUCCESS)

Het script exporteert de default sub spoor, in de meeste gevallen zal dit het nl spoor zijn met wat ik download dus voor mij voldoet dit script.
Maar het zal veel geavanceerder kunnen maar voor nu werkt het voor mij.
Titel: Re: Post proces script extract subs to srt
Bericht door: hamkaastosti op 21 augustus 2016, 18:43:22
Dit is precies wat ik zoek! jammer genoeg krijg ik wel een foutmelding..
Sun Aug 21 17:31:14 2016 INFO Executing post-process-script srt_mkv.py for SUITS (2015) S06E04 H_264 (WEB-DL) DD5_1 1080p NLSubs -Q o Q-
Sun Aug 21 17:31:15 2016 INFO srt_mkv:   File "/usr/local/nzbget/share/nzbget/scripts/srt_mkv.py", line 36
Sun Aug 21 17:31:15 2016 INFO srt_mkv:             return [ffmpeg, '-i', i, re.sub(r".mkv", ".nl.srt", i)]
Sun Aug 21 17:31:15 2016 INFO srt_mkv:     ^
Sun Aug 21 17:31:15 2016 INFO srt_mkv: SyntaxError: invalid syntax
Sun Aug 21 17:31:15 2016 ERROR Post-process-script srt_mkv.py for SUITS (2015) S06E04 H_264 (WEB-DL) DD5_1 1080p NLSubs -Q o Q- failed (terminated with unknown status)

jammer genoeg zelf geen ervaring met python, iemand die hier wel ervaring mee heeft.
U bent me eeuwig dankbaar!
Titel: Re: Post proces script extract subs to srt
Bericht door: Ben(V) op 21 augustus 2016, 19:35:36
Staat er wel ffmpeg op je systeem?
Kun je testen door met putty inte loggen en gewoon ffmpeg uit tevoeren.
Titel: Re: Post proces script extract subs to srt
Bericht door: hamkaastosti op 21 augustus 2016, 20:17:28
Ja. Als ik het handmatig doe, ffmpeg -i Movie.mkv -map 0:s:0 subs.srt, dan werkt hij perfect
Titel: Re: Post proces script extract subs to srt
Bericht door: Ben(V) op 21 augustus 2016, 21:19:10
In dat geval zit ffmpeg in je path, misschien draait nzbget in een virtual enviroment en kan het script ffmpeg niet vinden.
Probeer eens deze regel:
Citaat
ffmpeg = '/usr/syno/bin/ffmpeg'
Te veranderen in:
Citaat
ffmpeg = 'ffmpeg'
Titel: Re: Post proces script extract subs to srt
Bericht door: hamkaastosti op 21 augustus 2016, 21:44:27
dankjewel voor je hulp!
Jammer genoeg wilt het niet helpen
Sun Aug 21 21:41:33 2016 INFO Executing post-process-script srt_mkv.py for TURN_ Washington___s Spies (2016) S03E07 H_264 (WEB-DL) DD5_1 1080p NLSubs -Q o Q-
Sun Aug 21 21:41:33 2016 INFO srt_mkv:   File "/usr/local/nzbget/share/nzbget/scripts/srt_mkv.py", line 36
Sun Aug 21 21:41:33 2016 INFO srt_mkv:     Â        return [ffmpeg, '-i', i, re.sub(r".mkv", ".nl.srt", i)]
Sun Aug 21 21:41:33 2016 INFO srt_mkv:     ^
Sun Aug 21 21:41:33 2016 INFO srt_mkv: SyntaxError: invalid syntax
Sun Aug 21 21:41:33 2016 ERROR Post-process-script srt_mkv.py for TURN_ Washington___s Spies (2016) S03E07 H_264 (WEB-DL) DD5_1 1080p NLSubs -Q o Q- failed (terminated with unknown status)

Syntax error lijkt me dat er iets niet klopt in haakjes, puntjes en comma's. Maar zou echt niet weten wat het in python is.
Is er geen mogelijkheid om het een script te maken in javascript hahaha
Titel: Re: Post proces script extract subs to srt
Bericht door: Ben(V) op 21 augustus 2016, 21:56:19
Python is positie afhankelijk.
Je zult het script wel niet letterlijk overgenomen hebben,of je editor is niet geschikt daarvoor.
Zo te zien ziet hij vreemde zaken voor het echte commando.
Als je op windows werkt gebruik dan notepad++ hiervo
Titel: Re: Post proces script extract subs to srt
Bericht door: hamkaastosti op 21 augustus 2016, 22:36:37
weer een stap verder! Blijkbaar was "vi" niet goed genoeg.
Alleen vind hij nu de mkv niet..
Sun Aug 21 22:29:16 2016 INFO Move for CHICAGO MED (2015) S01E17 H_264 (WEB-DL) DD5_1 1080p NLSubs -Q o Q- successful
Sun Aug 21 22:29:16 2016 INFO Executing post-process-script srt_mkv.py for CHICAGO MED (2015) S01E17 H_264 (WEB-DL) DD5_1 1080p NLSubs -Q o Q-
Sun Aug 21 22:29:17 2016 INFO srt_mkv: No .mkv files in current directory
Sun Aug 21 22:29:17 2016 INFO Post-process-script srt_mkv.py for CHICAGO MED (2015) S01E17 H_264 (WEB-DL) DD5_1 1080p NLSubs -Q o Q- successful

iemand die weet hoe je kan loggen waar het script zich bevind op het moment van uitvoeren. Soort van console.log(ls) hahah
Is er ook een manier om dit script te testen zonder steeds een nieuwe download af te ronden?
Titel: Re: Post proces script extract subs to srt
Bericht door: hamkaastosti op 22 augustus 2016, 22:52:21
Heb het werkend gekregen. Als ik de post script flatten gebruik voordat dit script uitvoer werkt het.
Helemaal top!
Titel: Re: Post proces script extract subs to srt
Bericht door: Mirx op 16 november 2017, 14:14:01
Sorry dat ik een eeuwenoud topic herrijs, maar aangezien ik er zelf ook wel paar uur google aan het moeten besteden dacht ik laat ik het toch maar delen.

Ik heb het script iets aangepast om uit de bestanden de (1ste) Nederlandse en Engelse ondertitels uit te halen, en die te voorzien van de juiste language code. Dus iets intelligenter.

Geen flauw idee of het lekker geprogrammeerd is, maar het werkt in ieder geval wel  :lol:

Het ffmpeg commando aangepast zodat op basis van de metatags de taal bepaald van de ondertitel, en het extract process 2x gemaakt.
Als er een audio track met de metatag met de taal aanwezig is wordt er een leeg bestand aangemaakt. Daarom checkt het script of er een 0KB bestand is aangemaakt, en zo ja wordt deze verwijderd.
Het proces werd verder maar 1x aangeroepen, dus zag daar het nut niet van in en het wat platter gemaakt.

#!/usr/bin/env python
#
##############################################################################
### NZBGET POST-PROCESSING SCRIPT                                          ###

# Script to rip srt/ssa subtitles out of .mkv files
#
# Usage: scriptname.py [filename.mkv]
# If the filename isn't specified all .mkv files in the current directory will be processed
# Developed with ffmpeg 2.1.1, you probably want that or higher if this doesn't work
#

##############################################################################
### OPTIONS                                                                ###

### NZBGET POST-PROCESSING SCRIPT                                          ###
##############################################################################

import glob, re, argparse, os, sys
from subprocess import call

os.chdir(os.environ['NZBPP_DIRECTORY'])

# Exit codes used by NZBGet
POSTPROCESS_SUCCESS=93
POSTPROCESS_ERROR=94

ffmpeg = 'ffmpeg'

parser = argparse.ArgumentParser(description='Extract subtitles from mkv files.')
parser.add_argument('-f', '--file', help="source filename (mkv) to extract subtitle from")
args = parser.parse_args()

if args.file is None:
        mkvs = glob.glob("*.mkv")
        if (len(mkvs) == 0):
                print "No .mkv files in current directory"
        for i in mkvs:
call ([ffmpeg, '-i', i, '-vn', '-an', '-map', '0:m:language:eng', re.sub(r".mkv", ".en.srt", i)])
call ([ffmpeg, '-i', i, '-vn', '-an', '-map', '0:m:language:dut', re.sub(r".mkv", ".nl.srt", i)])
if os.path.exists(re.sub(r".mkv", ".en.srt", i)):
if os.path.getsize(re.sub(r".mkv", ".en.srt", i)) < 1 * 1024:
os.remove(re.sub(r".mkv", ".en.srt", i))
print "Leeg bestand", (re.sub(r".mkv", ".en.srt", i)), "verwijderd"
if os.path.exists(re.sub(r".mkv", ".nl.srt", i)):
if os.path.getsize(re.sub(r".mkv", ".nl.srt", i)) < 1 * 1024:
os.remove(re.sub(r".mkv", ".nl.srt", i))
print "Leeg bestand", (re.sub(r".mkv", ".nl.srt", i)), "verwijderd"

else:
        call(process(args.file))

sys.exit(POSTPROCESS_SUCCESS)
Titel: Re: Post proces script extract subs to srt
Bericht door: Mirx op 29 januari 2018, 20:01:29
Het script liep er nog tegen aan dat wanneer er meerdere ondertitels zijn met dezelfde language tag, het verwerken fout ging. En dat is bij een hoop web-dl tv series het geval omdat er dan zowel een engelse als SDH engelse ondertitel in zit.

Backupproces toegevoegd wat er dan "dom" de eerste 2 ondertitelstreams eruit haalt in het geval de engelse verwerking fout gaat.

Nogmaals, ik heb geen reet verstand van python, en het zal allemaal best mooier kunnen met variabelen etc.

#!/usr/bin/env python
#
##############################################################################
### NZBGET POST-PROCESSING SCRIPT                                          ###

# Script to rip srt/ssa subtitles out of .mkv files
#
# Usage: scriptname.py [filename.mkv]
# If the filename isn't specified all .mkv files in the current directory will be processed
# Developed with ffmpeg 2.1.1, you probably want that or higher if this doesn't work
#

##############################################################################
### OPTIONS                                                                ###

### NZBGET POST-PROCESSING SCRIPT                                          ###
##############################################################################

import glob, re, argparse, os, sys
from subprocess import call

os.chdir(os.environ['NZBPP_DIRECTORY'])

# Exit codes used by NZBGet
POSTPROCESS_SUCCESS=93
POSTPROCESS_ERROR=94

ffmpeg = 'ffmpeg'

parser = argparse.ArgumentParser(description='Extract subtitles from mkv files.')
parser.add_argument('-f', '--file', help="source filename (mkv) to extract subtitle from")
args = parser.parse_args()

if args.file is None:
        mkvs = glob.glob("*.mkv")
        if (len(mkvs) == 0):
                print "No .mkv files in current directory"
        for i in mkvs:
call ([ffmpeg, '-i', i, '-vn', '-an', '-map', '0:m:language:eng', re.sub(r".mkv", ".en.srt", i)])
if os.path.exists(re.sub(r".mkv", ".en.srt", i)):
if os.path.getsize(re.sub(r".mkv", ".en.srt", i)) < 1 * 1024:
os.remove(re.sub(r".mkv", ".en.srt", i))
print "Resultaat: Leeg bestand", (re.sub(r".mkv", ".en.srt", i)), "verwijderd, backup proces uitvoeren"
call ([ffmpeg, '-i', i, '-vn', '-an', '-map', '0:s:0', re.sub(r".mkv", ".en.srt", i)])
if os.path.exists(re.sub(r".mkv", ".en.srt", i)):
if os.path.getsize(re.sub(r".mkv", ".en.srt", i)) < 1 * 1024:
os.remove(re.sub(r".mkv", ".en.srt", i))
print "Resultaat: Leeg bestand backup proces", (re.sub(r".mkv", ".en.srt", i)), "verwijderd"
print "Resultaat: Ondertitel 1 naar", (re.sub(r".mkv", ".en.srt", i)), "gekopieerd, language tag kan fout zijn"
call ([ffmpeg, '-i', i, '-vn', '-an', '-map', '0:s:1', re.sub(r".mkv", ".de.srt", i)])
if os.path.exists(re.sub(r".mkv", ".de.srt", i)):
if os.path.getsize(re.sub(r".mkv", ".de.srt", i)) < 1 * 1024:
os.remove(re.sub(r".mkv", ".de.srt", i))
print "Resultaat: Leeg bestand backup proces", (re.sub(r".mkv", ".de.srt", i)), "verwijderd"
print "Resultaat: Ondertitel 2 naar", (re.sub(r".mkv", ".de.srt", i)), "gekopieerd, language tag kan fout zijn"
elif os.path.getsize(re.sub(r".mkv", ".en.srt", i)) > 1 * 1024:
print "Resultaat: Engelse ondertitel naar", (re.sub(r".mkv", ".en.srt", i)), "gekopieerd"
call ([ffmpeg, '-i', i, '-vn', '-an', '-map', '0:m:language:dut', re.sub(r".mkv", ".nl.srt", i)])
if os.path.exists(re.sub(r".mkv", ".nl.srt", i)):
if os.path.getsize(re.sub(r".mkv", ".nl.srt", i)) < 1 * 1024:
os.remove(re.sub(r".mkv", ".nl.srt", i))
print "Resultaat: Leeg bestand", (re.sub(r".mkv", ".nl.srt", i)), "verwijderd"
print "Resultaat: Nederlandse ondertitel naar", (re.sub(r".mkv", ".nl.srt", i)), "gekopieerd"

else:
        call(process(args.file))

sys.exit(POSTPROCESS_SUCCESS)