mirror of
https://github.com/clinton-hall/nzbToMedia.git
synced 2025-08-22 06:13:19 -07:00
add windows builder files for nzbget
This commit is contained in:
parent
e8dc2f8683
commit
61df083863
5 changed files with 769 additions and 0 deletions
9
nzbget-postprocessing-files/windows-builder/README.md
Normal file
9
nzbget-postprocessing-files/windows-builder/README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
To compile for windows, add the following files into the same folder.
|
||||||
|
Compile with pyinstaller using options -F -w
|
||||||
|
Transcoder.py
|
||||||
|
Linktastic\linktastic.py folder (not used, but imported in nzbToMediaUtil.py)
|
||||||
|
nzbToMediaUtil.py
|
||||||
|
migratecfg.py
|
||||||
|
nzbToMediaEnv.py
|
||||||
|
nzbToMediaSceneExceptions.py
|
||||||
|
Autoprocess files
|
105
nzbget-postprocessing-files/windows-builder/autoProcessMedia.cfg
Normal file
105
nzbget-postprocessing-files/windows-builder/autoProcessMedia.cfg
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
[CouchPotato]
|
||||||
|
cpsCategory = movie
|
||||||
|
apikey = ac8a2260b147487c9c88a00fc9dde601
|
||||||
|
host = localhost
|
||||||
|
port = 5050
|
||||||
|
username = clinton
|
||||||
|
password = dlo3822
|
||||||
|
ssl = 0
|
||||||
|
web_root =
|
||||||
|
delay = 65
|
||||||
|
method = renamer
|
||||||
|
delete_failed = 0
|
||||||
|
|
||||||
|
[SickBeard]
|
||||||
|
sbCategory = TV
|
||||||
|
host = localhost
|
||||||
|
port = 8081
|
||||||
|
username =
|
||||||
|
password =
|
||||||
|
web_root =
|
||||||
|
ssl = 0
|
||||||
|
watch_dir = C:\TV\new
|
||||||
|
failed_fork = 0
|
||||||
|
|
||||||
|
[HeadPhones]
|
||||||
|
hpCategory = music
|
||||||
|
apikey =
|
||||||
|
host = localhost
|
||||||
|
port = 8181
|
||||||
|
username =
|
||||||
|
password =
|
||||||
|
ssl = 0
|
||||||
|
web_root =
|
||||||
|
delay = 65
|
||||||
|
|
||||||
|
[Mylar]
|
||||||
|
mlCategory = comics
|
||||||
|
host = localhost
|
||||||
|
port = 8090
|
||||||
|
username =
|
||||||
|
password =
|
||||||
|
web_root =
|
||||||
|
ssl = 0
|
||||||
|
|
||||||
|
[Gamez]
|
||||||
|
gzCategory = movie
|
||||||
|
apikey =
|
||||||
|
host = localhost
|
||||||
|
port = 8085
|
||||||
|
username =
|
||||||
|
password =
|
||||||
|
ssl = 0
|
||||||
|
web_root =
|
||||||
|
|
||||||
|
[Torrent]
|
||||||
|
clientAgent = utorrent
|
||||||
|
useLink = 1
|
||||||
|
minSampleSize = 200
|
||||||
|
outputDirectory = C:\TV
|
||||||
|
categories = music_videos,pictures,software
|
||||||
|
uTorrentWEBui = http://localhost:8090/gui/
|
||||||
|
uTorrentUSR = your username
|
||||||
|
uTorrentPWD = your password
|
||||||
|
deleteOriginal = 0
|
||||||
|
|
||||||
|
[Extensions]
|
||||||
|
compressedExtensions = .zip,.rar,.7z,.gz,.bz,.tar,.arj
|
||||||
|
mediaExtensions = .mkv,.avi,.divx,.xvid,.mov,.wmv,.mp4,.mpg,.mpeg,.vob,.iso
|
||||||
|
metaExtensions = .nfo,.sub,.srt,.jpg,.gif
|
||||||
|
|
||||||
|
[Transcoder]
|
||||||
|
transcode = 0
|
||||||
|
duplicate = 1
|
||||||
|
ignoreExtensions = .avi
|
||||||
|
outputVideoExtension = .mp4
|
||||||
|
outputVideoCodec = libx264
|
||||||
|
outputVideoFramerate = 24
|
||||||
|
outputVideoBitrate = 800k
|
||||||
|
outputAudioCodec = libmp3lame
|
||||||
|
outputAudioBitrate = 128k
|
||||||
|
|
||||||
|
[loggers]
|
||||||
|
keys = root
|
||||||
|
|
||||||
|
[handlers]
|
||||||
|
keys = console
|
||||||
|
|
||||||
|
[formatters]
|
||||||
|
keys = generic
|
||||||
|
|
||||||
|
[logger_root]
|
||||||
|
level = NOTSET
|
||||||
|
handlers = console
|
||||||
|
qualname =
|
||||||
|
|
||||||
|
[handler_console]
|
||||||
|
class = StreamHandler
|
||||||
|
args = (sys.stdout,)
|
||||||
|
level = INFO
|
||||||
|
formatter = generic
|
||||||
|
|
||||||
|
[formatter_generic]
|
||||||
|
format = %(asctime)s|%(levelname)-7.7s %(message)s
|
||||||
|
datefmt = %H:%M:%S
|
||||||
|
|
23
nzbget-postprocessing-files/windows-builder/logging.cfg
Normal file
23
nzbget-postprocessing-files/windows-builder/logging.cfg
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# Logging configuration
|
||||||
|
[loggers]
|
||||||
|
keys = root
|
||||||
|
|
||||||
|
[handlers]
|
||||||
|
keys = console
|
||||||
|
|
||||||
|
[formatters]
|
||||||
|
keys = generic
|
||||||
|
|
||||||
|
[logger_root]
|
||||||
|
level = NOTSET
|
||||||
|
handlers = console
|
||||||
|
qualname =
|
||||||
|
|
||||||
|
[handler_console]
|
||||||
|
class = StreamHandler
|
||||||
|
args = (sys.stdout,)
|
||||||
|
level = INFO
|
||||||
|
formatter = generic
|
||||||
|
|
||||||
|
[formatter_generic]
|
||||||
|
format = [%(levelname)-7.7s] %(message)s
|
|
@ -0,0 +1,144 @@
|
||||||
|
#
|
||||||
|
# This file if part of nzbget
|
||||||
|
#
|
||||||
|
# Template configuration file for post-processing script "nzbget-postprocess.sh".
|
||||||
|
# Please refer to "nzbget-postprocess.sh" for usage instructions.
|
||||||
|
#
|
||||||
|
# Copyright (C) 2008-2013 Andrey Prygunkov <hugbug@users.sourceforge.net>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
### PATHS ###
|
||||||
|
|
||||||
|
# Set the full path to location to move failed downloads to.
|
||||||
|
Failed_Directory=/usr/local/downloads/failed
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
### OPTIONS ###
|
||||||
|
|
||||||
|
# Rename img-files to iso (yes, no).
|
||||||
|
RenameIMG=yes
|
||||||
|
|
||||||
|
# Joint TS-files (yes, no).
|
||||||
|
JoinTS=yes
|
||||||
|
|
||||||
|
# Perform SickBeard's postprocessing (yes, no).
|
||||||
|
SickBeard=yes
|
||||||
|
|
||||||
|
# Category for SickBeard's postprocessing.
|
||||||
|
SickBeardCategory=tv
|
||||||
|
|
||||||
|
# Perform Couchpotato's postprocessing (yes, no).
|
||||||
|
CouchPotato=yes
|
||||||
|
|
||||||
|
# Category for Couchpotato's postprocessing.
|
||||||
|
CouchPotatoCategory=movies
|
||||||
|
|
||||||
|
# Perform HeadPhones' postprocessing (yes, no).
|
||||||
|
HeadPhones=yes
|
||||||
|
|
||||||
|
# Category for HeadPhones' postprocessing.
|
||||||
|
HeadPhonesCategory=music
|
||||||
|
|
||||||
|
# Perform Mylar's postprocessing (yes, no).
|
||||||
|
Mylar=yes
|
||||||
|
|
||||||
|
# Category for Mylar's postprocessing.
|
||||||
|
MylarCategory=comics
|
||||||
|
|
||||||
|
# Perform Gamez's postprocessing (yes, no).
|
||||||
|
Gamez=yes
|
||||||
|
|
||||||
|
# Category for Gamez's postprocessing.
|
||||||
|
GamezCategory=games
|
||||||
|
|
||||||
|
# Clean up list. space seperated, in single quotes, default '.nzb .sfv .1'
|
||||||
|
FileCleanUp='.nzb .sfv .1'
|
||||||
|
|
||||||
|
# Remove all files when download fails (yes, no).
|
||||||
|
Delete_Failed=no
|
||||||
|
|
||||||
|
# Toggle detailed output (yes, no).
|
||||||
|
Debug=no
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
### POSTPROCESSING-PARAMETERS ###
|
||||||
|
|
||||||
|
# This section defines parameters, which can be set for each nzb-file
|
||||||
|
# individually using either web-interface or command line.
|
||||||
|
# Example command line for setting parameter "PostProcess" to value "no" for
|
||||||
|
# nzb-file with id=2:
|
||||||
|
# nzbget -E G O PostProcess=no 2
|
||||||
|
|
||||||
|
# Perform postprocessing (yes, no).
|
||||||
|
#
|
||||||
|
# Set to "no" to skip postprocessing for this nzb-file.
|
||||||
|
PostProcess=yes
|
||||||
|
|
||||||
|
# Destination directory.
|
||||||
|
DestDir=
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
### EMAIL-PARAMETERS ###
|
||||||
|
|
||||||
|
# This section defines parameters, which can be set to allow notifications to
|
||||||
|
# be sent via email.
|
||||||
|
# This uses sendEmail as authored by Brandon Zehm <caspian@dotconf.net>
|
||||||
|
|
||||||
|
# List Categories for successful download email, default 'tv movies'
|
||||||
|
Email_successful='tv movies music comics games pictures'
|
||||||
|
|
||||||
|
# List Categories for failed download email, default 'tv movies'
|
||||||
|
Email_failed='tv movies music comics games pictures'
|
||||||
|
|
||||||
|
# Set the full path and file name for sendEmail application.
|
||||||
|
sendEmail=/usr/local/nzbget/var/sendEmail/sendEmail
|
||||||
|
|
||||||
|
# Enter the email address you want this email to be sent from.
|
||||||
|
Email_From=
|
||||||
|
|
||||||
|
# Enter the email address you want this email to be sent to.
|
||||||
|
Email_To=
|
||||||
|
|
||||||
|
# Enter smtp server and port. eg smtp.live.com:25
|
||||||
|
Email_Server=
|
||||||
|
|
||||||
|
# Server uses tsl (auto, yes, no).
|
||||||
|
Tsl=auto
|
||||||
|
|
||||||
|
# Enter your smtp server user name (if required)
|
||||||
|
Email_User=
|
||||||
|
|
||||||
|
# Enter your smtp server password (if required)
|
||||||
|
Email_Pass=
|
||||||
|
|
||||||
|
# Enter your email subject, in single quotes.
|
||||||
|
# Use the following tags between the less than and greater than symbols.
|
||||||
|
# Use status to add 'completed'/'failed'.
|
||||||
|
# Use name to add the nzb name.
|
||||||
|
# Use cat to add the download categoty.
|
||||||
|
# Use script to name the external script used.
|
||||||
|
Email_Subject='The download of <name> has <status>.'
|
||||||
|
|
||||||
|
# Enter your email message, in single quotes.
|
||||||
|
# Use the same substitutes as described above.
|
||||||
|
# Use \r\n for new line.
|
||||||
|
Email_Message='The download of <name> has <status>. \r\n This has been processed by the script <script> for category <cat>.'
|
||||||
|
|
||||||
|
# Append the potprocessing log to the email (yes, no).
|
||||||
|
Add_Log=no
|
|
@ -0,0 +1,488 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
#
|
||||||
|
# This file if part of nzbget
|
||||||
|
#
|
||||||
|
# Example postprocessing script for NZBGet
|
||||||
|
#
|
||||||
|
# Copyright (C) 2008 Peter Roubos <peterroubos@hotmail.com>
|
||||||
|
# Copyright (C) 2008 Otmar Werner
|
||||||
|
# Copyright (C) 2008-2013 Andrey Prygunkov <hugbug@users.sourceforge.net>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
####################### Usage instructions #######################
|
||||||
|
# o Script will cleanup, join ts-files and rename img-files to iso.
|
||||||
|
#
|
||||||
|
# o To use this script with nzbget set the option "PostProcess" in
|
||||||
|
# nzbget configuration file to point to this script file. E.g.:
|
||||||
|
# PostProcess=/home/user/nzbget/nzbget-postprocess.sh
|
||||||
|
#
|
||||||
|
# o The script needs a configuration file. An example configuration file
|
||||||
|
# is provided in file "nzbget-postprocess.conf". Put the configuration file
|
||||||
|
# into the directory where nzbget's configuration file (nzbget.conf) is located.
|
||||||
|
# Then edit the configuration file in any text editor to adjust the settings.
|
||||||
|
#
|
||||||
|
# o You can also edit the script's configuration via web-interface.
|
||||||
|
#
|
||||||
|
# o There are few options, which can be ajdusted for each nzb-file individually.
|
||||||
|
#
|
||||||
|
####################### End of Usage instructions #######################
|
||||||
|
|
||||||
|
import os
|
||||||
|
import logging
|
||||||
|
import logging.config
|
||||||
|
import sys
|
||||||
|
import shutil
|
||||||
|
from configobj import ConfigObj
|
||||||
|
from subprocess import call
|
||||||
|
from glob import iglob
|
||||||
|
import migratecfg
|
||||||
|
import autoProcessComics
|
||||||
|
import autoProcessGames
|
||||||
|
import autoProcessMusic
|
||||||
|
import autoProcessTV
|
||||||
|
import autoProcessMovie
|
||||||
|
|
||||||
|
# Postprocessing function for nzbToCouchPotato and nzbToSickBeard
|
||||||
|
def nzbToMedia(nzbStatus):
|
||||||
|
script = ""
|
||||||
|
result = ""
|
||||||
|
if Debug == "yes":
|
||||||
|
Logger.debug("Post-Process: Executing external postprocessing with argument %s", nzbStatus)
|
||||||
|
PostProcessStatus = nzbStatus
|
||||||
|
# 200 MB in bytes
|
||||||
|
SIZE_CUTOFF = 200 * 1024 * 1024
|
||||||
|
# Ignore 'sample' in files unless 'sample' in Torrent Name
|
||||||
|
for dirpath, dirnames, filenames in os.walk(NZBPP_DIRECTORY):
|
||||||
|
for file in filenames:
|
||||||
|
filePath = os.path.join(dirpath, file)
|
||||||
|
if ('sample' in filePath.lower()) and (not 'sample' in NZBPP_NZBNAME) and (os.path.getsize(filePath) < SIZE_CUTOFF):
|
||||||
|
Logger.info("Post-Process: Deleting sample file %s", filePath)
|
||||||
|
os.unlink(filePath)
|
||||||
|
|
||||||
|
if NZBPP_CATEGORY == CouchPotatoCategory:
|
||||||
|
if CouchPotato == "yes":
|
||||||
|
script = "autoProcessMovie"
|
||||||
|
# Call Couchpotato's postprocessing script
|
||||||
|
Logger.info("Post-Process: Running CouchPotato's postprocessing script")
|
||||||
|
|
||||||
|
if Debug == "yes":
|
||||||
|
Logger.debug("Post-Process: CouchPotato-Script-ARGV1= %s", NZBPP_DIRECTORY)
|
||||||
|
Logger.debug("Post-Process: CouchPotato-Script-ARGV2= %s", NZBPP_NZBFILENAME)
|
||||||
|
Logger.debug("Post-Process: CouchPotato-Script-ARGV3= %s", PostProcessStatus)
|
||||||
|
result = autoProcessMovie.process(NZBPP_DIRECTORY, NZBPP_NZBFILENAME, PostProcessStatus)
|
||||||
|
else:
|
||||||
|
Logger.debug("Post-Process: Ignored to run CouchPotato's postprocessing script as it is disabled by user")
|
||||||
|
|
||||||
|
if NZBPP_CATEGORY == SickBeardCategory:
|
||||||
|
if SickBeard == "yes":
|
||||||
|
script = "autoProcessTv"
|
||||||
|
# Call SickBeard's postprocessing script
|
||||||
|
Logger.info("Post-Process: Running SickBeard's postprocessing script")
|
||||||
|
|
||||||
|
if Debug == "yes":
|
||||||
|
Logger.debug("Post-Process: SickBeard-Script-ARGV1= %s", NZBPP_DIRECTORY)
|
||||||
|
Logger.debug("Post-Process: SickBeard-Script-ARGV2= %s", NZBPP_NZBFILENAME)
|
||||||
|
Logger.debug("Post-Process: SickBeard-Script-ARGV3= %s", PostProcessStatus)
|
||||||
|
result = autoProcessTV.processEpisode(NZBPP_DIRECTORY, NZBPP_NZBFILENAME, PostProcessStatus)
|
||||||
|
else:
|
||||||
|
Logger.debug("Post-Process: Ignored to run SickBeard's postprocessing script as it is disabled by user")
|
||||||
|
|
||||||
|
if NZBPP_CATEGORY == HeadPhonesCategory:
|
||||||
|
if HeadPhones == "yes":
|
||||||
|
script = "autoProcessMusic"
|
||||||
|
# Call HeadPhones' postprocessing script
|
||||||
|
Logger.info("Post-Process: Running HeadPhones' postprocessing script")
|
||||||
|
|
||||||
|
if Debug == "yes":
|
||||||
|
Logger.debug("Post-Process: HeadPhones-Script-ARGV1= %s", NZBPP_DIRECTORY)
|
||||||
|
Logger.debug("Post-Process: HeadPhones-Script-ARGV2= %s", NZBPP_NZBFILENAME)
|
||||||
|
Logger.debug("Post-Process: HeadPhones-Script-ARGV3= %s", PostProcessStatus)
|
||||||
|
result = autoProcessMusic.process(NZBPP_DIRECTORY, NZBPP_NZBFILENAME, PostProcessStatus)
|
||||||
|
else:
|
||||||
|
Logger.debug("Post-Process: Ignored to run HeadPhones' postprocessing script as it is disabled by user")
|
||||||
|
|
||||||
|
if NZBPP_CATEGORY == MylarCategory:
|
||||||
|
if Mylar == "yes":
|
||||||
|
script = "autoProcessComics"
|
||||||
|
# Call Mylar's postprocessing script
|
||||||
|
Logger.info("Post-Process: Running Mylar's postprocessing script")
|
||||||
|
|
||||||
|
if Debug == "yes":
|
||||||
|
Logger.debug("Post-Process: Mylar-Script-ARGV1= %s", NZBPP_DIRECTORY)
|
||||||
|
Logger.debug("Post-Process: Mylar-Script-ARGV2= %s", NZBPP_NZBFILENAME)
|
||||||
|
Logger.debug("Post-Process: Mylar-Script-ARGV3= %s", PostProcessStatus)
|
||||||
|
result = autoProcessComics.processEpisode(NZBPP_DIRECTORY, NZBPP_NZBFILENAME, PostProcessStatus)
|
||||||
|
else:
|
||||||
|
Logger.debug("Post-Process: Ignored to run Mylar's postprocessing script as it is disabled by user")
|
||||||
|
|
||||||
|
if NZBPP_CATEGORY == GamezCategory:
|
||||||
|
if Gamez == "yes":
|
||||||
|
script = "autoProcessGames"
|
||||||
|
# Call Gamez's postprocessing script
|
||||||
|
Logger.info("Post-Process: Running Gamez's postprocessing script")
|
||||||
|
|
||||||
|
if Debug == "yes":
|
||||||
|
Logger.debug("Post-Process: Gamez-Script-ARGV1= %s", NZBPP_DIRECTORY)
|
||||||
|
Logger.debug("Post-Process: Gamez-Script-ARGV2= %s", NZBPP_NZBFILENAME)
|
||||||
|
Logger.debug("Post-Process: Gamez-Script-ARGV3= %s", PostProcessStatus)
|
||||||
|
result = autoProcessGames.process(NZBPP_DIRECTORY, NZBPP_NZBFILENAME, PostProcessStatus)
|
||||||
|
else:
|
||||||
|
Logger.debug("Post-Process: Ignored to run Gamez's postprocessing script as it is disabled by user")
|
||||||
|
|
||||||
|
return script, result
|
||||||
|
|
||||||
|
# Pass on postprocess exit codes to external scripts for handling failed downloads
|
||||||
|
def do_exit(Process_Code):
|
||||||
|
if Debug == "yes":
|
||||||
|
Logger.debug("Post-Process: Executing function 'do_exit' with argument %s", Process_Code)
|
||||||
|
nzbStatus = 0
|
||||||
|
if Process_Code != POSTPROCESS_SUCCESS:
|
||||||
|
if Delete_Failed == "yes":
|
||||||
|
os.chdir(os.path.split(NZBPP_DIRECTORY)[0])
|
||||||
|
shutil.rmtree(NZBPP_DIRECTORY)
|
||||||
|
else:
|
||||||
|
os.mkdir(Failed_Directory)
|
||||||
|
os.chdir(Failed_Directory)
|
||||||
|
for dirpath, dirnames, filenames in os.walk(NZBPP_DIRECTORY):
|
||||||
|
for file in filenames:
|
||||||
|
filePath = os.path.join(dirpath, file)
|
||||||
|
newPath = os.path,join(Failed_Directory, file)
|
||||||
|
shutil.move(filePath, newPath)
|
||||||
|
shutil.rmtree(NZBPP_DIRECTORY)
|
||||||
|
NZBPP_DIRECTORY = Failed_Directory
|
||||||
|
os.chdir(NZBPP_DIRECTORY)
|
||||||
|
nzbStatus=1
|
||||||
|
script = "none"
|
||||||
|
Email_Message2 = Email_Message
|
||||||
|
script, result = nzbToMedia(nzbStatus)
|
||||||
|
Logger.debug("after calling nzbToMedia")
|
||||||
|
Email_Subject.replace("<name>", NZBPP_NZBFILENAME)
|
||||||
|
Email_Subject.replace("<cat>", NZBPP_CATEGORY)
|
||||||
|
Email_Subject.replace("<script>", script)
|
||||||
|
Email_Message2.replace("<name>", NZBPP_NZBFILENAME)
|
||||||
|
Email_Message2.replace("<cat>", NZBPP_CATEGORY)
|
||||||
|
Email_Message2.replace("<script>", script)
|
||||||
|
|
||||||
|
if NZBPP_CATEGORY in Email_successful and nzbStatus == 0:
|
||||||
|
Email_Subject.replace("<status>", "completed")
|
||||||
|
Email_Message2.replace("<status>", "completed")
|
||||||
|
if Add_Log == "yes":
|
||||||
|
Email_Message2 = Email_Message2 + "\r\nLog Result"
|
||||||
|
f = open(logFile2)
|
||||||
|
lines = f.readlines()
|
||||||
|
for line in lines:
|
||||||
|
if line != "":
|
||||||
|
Email_Message2 = Email_Message2 + "\r\n" + line
|
||||||
|
f.close()
|
||||||
|
command = [sendEmail, "-f", Email_From, "-t", Email_To, "-s", Email_Server, "-o", "tsl=" + Tsl]
|
||||||
|
if Email_User != "" and Email_Pass != "":
|
||||||
|
command.append("-xu")
|
||||||
|
command.append(Email_User)
|
||||||
|
command.append("-xp")
|
||||||
|
command.append(Email_Pass)
|
||||||
|
command.append("-u")
|
||||||
|
command.append(Email_Subject)
|
||||||
|
command.append("-m")
|
||||||
|
command.append(Email_Message2)
|
||||||
|
call(command)
|
||||||
|
|
||||||
|
if NZBPP_CATEGORY in Email_failed and nzbStatus != 0:
|
||||||
|
Email_Subject.replace("<status>", "failed")
|
||||||
|
Email_Message.replace("<status>", "failed")
|
||||||
|
if Add_Log == "yes":
|
||||||
|
Email_Message2 = Email_Message2 + "\r\nLog Result"
|
||||||
|
f = open(logFile2)
|
||||||
|
lines = f.readlines()
|
||||||
|
for line in lines:
|
||||||
|
if line != "":
|
||||||
|
Email_Message2 = Email_Message2 + "\r\n" + line
|
||||||
|
f.close()
|
||||||
|
command = [sendEmail, "-f", Email_From, "-t", Email_To, "-s", Email_Server, "-o", "tsl=" + Tsl]
|
||||||
|
if Email_User != "" and Email_Pass != "":
|
||||||
|
command.append("-xu")
|
||||||
|
command.append(Email_User)
|
||||||
|
command.append("-xp")
|
||||||
|
command.append(Email_Pass)
|
||||||
|
command.append("-u")
|
||||||
|
command.append(Email_Subject)
|
||||||
|
command.append("-m")
|
||||||
|
command.append(Email_Message2)
|
||||||
|
call(command)
|
||||||
|
|
||||||
|
exit(Process_Code)
|
||||||
|
|
||||||
|
if os.path.isfile(os.path.join(os.path.dirname(sys.argv[0]), "autoProcessMedia.cfg.sample")):
|
||||||
|
migratecfg.migrate()
|
||||||
|
|
||||||
|
logFile = os.path.join(os.path.dirname(sys.argv[0]), "postprocess.log")
|
||||||
|
logging.config.fileConfig(os.path.join(os.path.dirname(sys.argv[0]), "logging.cfg"))
|
||||||
|
fileHandler = logging.handlers.RotatingFileHandler(logFile, mode='a', maxBytes=20000, backupCount=1, encoding='utf-8', delay=True)
|
||||||
|
fileHandler.formatter = logging.Formatter('%(asctime)s|%(levelname)-7.7s %(message)s', '%H:%M:%S')
|
||||||
|
fileHandler.level = logging.DEBUG
|
||||||
|
logging.getLogger().addHandler(fileHandler)
|
||||||
|
|
||||||
|
logFile2 = os.path.join(os.path.dirname(sys.argv[0]), "tmp.log")
|
||||||
|
fileHandler2 = logging.FileHandler(logFile2, mode='w', encoding='utf-8', delay=True)
|
||||||
|
fileHandler2.formatter = logging.Formatter('%(asctime)s|%(levelname)-7.7s %(message)s', '%H:%M:%S')
|
||||||
|
fileHandler2.level = logging.DEBUG
|
||||||
|
logging.getLogger().addHandler(fileHandler2)
|
||||||
|
|
||||||
|
Logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
# NZBGet passes following arguments to postprocess-programm as environment
|
||||||
|
# variables:
|
||||||
|
# NZBPP_DIRECTORY - path to destination dir for downloaded files;
|
||||||
|
NZBPP_DIRECTORY = os.path.normpath(os.getenv('NZBPP_DIRECTORY'))
|
||||||
|
# NZBPP_NZBNAME - user-friendly name of processed nzb-file as it is displayed
|
||||||
|
# by the program. The file path and extension are removed.
|
||||||
|
# If download was renamed, this parameter reflects the new name;
|
||||||
|
NZBPP_NZBNAME = os.getenv('NZBPP_NZBNAME')
|
||||||
|
# NZBPP_NZBFILENAME - name of processed nzb-file. It includes file extension and also
|
||||||
|
# may include full path;
|
||||||
|
NZBPP_NZBFILENAME = os.getenv('NZBPP_NZBFILENAME')
|
||||||
|
# NZBPP_CATEGORY - category assigned to nzb-file (can be empty string);
|
||||||
|
NZBPP_CATEGORY = os.getenv('NZBPP_CATEGORY')
|
||||||
|
# NZBPP_PARSTATUS - result of par-check:
|
||||||
|
# 0 = not checked: par-check is disabled or nzb-file does
|
||||||
|
# not contain any par-files;
|
||||||
|
# 1 = checked and failed to repair;
|
||||||
|
# 2 = checked and successfully repaired;
|
||||||
|
# 3 = checked and can be repaired but repair is disabled.
|
||||||
|
NZBPP_PARSTATUS = os.getenv('NZBPP_PARSTATUS')
|
||||||
|
# NZBPP_UNPACKSTATUS - result of unpack:
|
||||||
|
# 0 = unpack is disabled or was skipped due to nzb-file
|
||||||
|
# properties or due to errors during par-check;
|
||||||
|
# 1 = unpack failed;
|
||||||
|
# 2 = unpack successful.
|
||||||
|
NZBPP_UNPACKSTATUS = os.getenv('NZBPP_UNPACKSTATUS')
|
||||||
|
NZBOP_CONFIGFILE = os.getenv('NZBOP_CONFIGFILE')
|
||||||
|
NZBOP_UNPACK = os.getenv('NZBOP_UNPACK')
|
||||||
|
NZBPR_PostProcess = os.getenv('NZBPR_PostProcess')
|
||||||
|
NZBPR_DestDir = os.getenv('NZBPR_DestDir')
|
||||||
|
NZBOP_ALLOWREPROCESS = os.getenv('NZBOP_ALLOWREPROCESS')
|
||||||
|
|
||||||
|
# Name of script's configuration file
|
||||||
|
SCRIPT_CONFIG_FILE = "nzbget-postprocess.conf"
|
||||||
|
|
||||||
|
# Exit codes
|
||||||
|
POSTPROCESS_PARCHECK_CURRENT=91
|
||||||
|
POSTPROCESS_PARCHECK_ALL=92
|
||||||
|
POSTPROCESS_SUCCESS=93
|
||||||
|
POSTPROCESS_ERROR=94
|
||||||
|
POSTPROCESS_NONE=95
|
||||||
|
|
||||||
|
# Check if the script is called from nzbget 10.0 or later
|
||||||
|
if NZBPP_DIRECTORY == "" or NZBOP_CONFIGFILE == "":
|
||||||
|
Logger.info("*** NZBGet post-processing script ***")
|
||||||
|
Logger.warning("This script is supposed to be called from nzbget (10.0 or later).")
|
||||||
|
exit(POSTPROCESS_ERROR)
|
||||||
|
|
||||||
|
if NZBOP_UNPACK == "":
|
||||||
|
Logger.error("This script requires nzbget version at least 10.0-testing-r555 or 10.0-stable.")
|
||||||
|
exit(POSTPROCESS_ERROR)
|
||||||
|
|
||||||
|
# Check if postprocessing was disabled in postprocessing parameters
|
||||||
|
# (for current nzb-file) via web-interface or via command line with
|
||||||
|
# "nzbget -E G O PostProcess=no <ID>"
|
||||||
|
if NZBPR_PostProcess == "no":
|
||||||
|
Logger.warning("Post-Process: Post-processing disabled for this nzb-file, exiting")
|
||||||
|
exit(POSTPROCESS_NONE)
|
||||||
|
|
||||||
|
Logger.info("Post-Process: Post-processing script successfully started")
|
||||||
|
#os.chdir(NZBPP_DIRECTORY)
|
||||||
|
|
||||||
|
# Determine the location of configuration file (it must be stored in
|
||||||
|
# the directory with nzbget.conf).
|
||||||
|
ConfigDir = os.path.dirname(NZBOP_CONFIGFILE)
|
||||||
|
ScriptConfigFile = os.path.join(ConfigDir, SCRIPT_CONFIG_FILE)
|
||||||
|
if not os.path.isfile(ScriptConfigFile):
|
||||||
|
Logger.error("Post-Process: Configuration file %s not found, exiting", ScriptConfigFile)
|
||||||
|
exit(POSTPROCESS_ERROR)
|
||||||
|
|
||||||
|
# Readg configuration file
|
||||||
|
config = ConfigObj(ScriptConfigFile)
|
||||||
|
|
||||||
|
Failed_Directory = config['Failed_Directory']
|
||||||
|
RenameIMG = config['RenameIMG']
|
||||||
|
JoinTS = config['JoinTS']
|
||||||
|
SickBeard = config['SickBeard']
|
||||||
|
SickBeardCategory = config['SickBeardCategory']
|
||||||
|
CouchPotato = config['CouchPotato']
|
||||||
|
CouchPotatoCategory = config['CouchPotatoCategory']
|
||||||
|
HeadPhones = config['HeadPhones']
|
||||||
|
HeadPhonesCategory = config['HeadPhonesCategory']
|
||||||
|
Mylar = config['Mylar']
|
||||||
|
MylarCategory = config['MylarCategory']
|
||||||
|
Gamez = config['Gamez']
|
||||||
|
GamezCategory = config['GamezCategory']
|
||||||
|
FileCleanUp = (config['FileCleanUp']).split(' ')
|
||||||
|
Delete_Failed = config['Delete_Failed']
|
||||||
|
Debug = config['Debug']
|
||||||
|
PostProcess = config['PostProcess']
|
||||||
|
DestDir = config['DestDir']
|
||||||
|
Email_successful = (config['Email_successful']).split(' ')
|
||||||
|
Email_failed = (config['Email_failed']).split(' ')
|
||||||
|
sendEmail = config['sendEmail']
|
||||||
|
Email_From = config['Email_From']
|
||||||
|
Email_To = config['Email_To']
|
||||||
|
Email_Server = config['Email_Server']
|
||||||
|
Tsl = config['Tsl']
|
||||||
|
Email_User = config['Email_User']
|
||||||
|
Email_Pass = config['Email_Pass']
|
||||||
|
Email_Subject = config['Email_Subject']
|
||||||
|
Email_Message = config['Email_Message']
|
||||||
|
Add_Log = config['Add_Log']
|
||||||
|
|
||||||
|
# Check nzbget.conf options
|
||||||
|
BadConfig = 0
|
||||||
|
|
||||||
|
if NZBOP_ALLOWREPROCESS == "yes":
|
||||||
|
Logger.error("Post-Process: Please disable option \"AllowReProcess\" in nzbget configuration file")
|
||||||
|
BadConfig = 1
|
||||||
|
|
||||||
|
if NZBOP_UNPACK != "yes":
|
||||||
|
Logger.error("Post-Process: Please enable option \"Unpack\" in nzbget configuration file")
|
||||||
|
BadConfig = 1
|
||||||
|
|
||||||
|
if BadConfig == 1:
|
||||||
|
Logger.error("Post-Process: Exiting due to incompatible nzbget configuration")
|
||||||
|
exit(POSTPROCESS_ERROR)
|
||||||
|
|
||||||
|
# Check par status
|
||||||
|
if NZBPP_PARSTATUS == 3:
|
||||||
|
Logger.warning("Post-Process: Par-check successful, but Par-repair disabled, exiting")
|
||||||
|
do_exit(POSTPROCESS_NONE)
|
||||||
|
|
||||||
|
if NZBPP_PARSTATUS == 1:
|
||||||
|
Logger.warning("Post-Process: Par-check failed, exiting")
|
||||||
|
do_exit(POSTPROCESS_NONE)
|
||||||
|
|
||||||
|
# Check unpack status
|
||||||
|
if NZBPP_UNPACKSTATUS == 1:
|
||||||
|
Logger.warning("Post-Process: Unpack failed, exiting")
|
||||||
|
do_exit(POSTPROCESS_NONE)
|
||||||
|
|
||||||
|
if NZBPP_UNPACKSTATUS == 0 and NZBPP_PARSTATUS != 2:
|
||||||
|
# Unpack is disabled or was skipped due to nzb-file properties or due to errors during par-check
|
||||||
|
|
||||||
|
for dirpath, dirnames, filenames in os.walk(NZBPP_DIRECTORY):
|
||||||
|
for file in filenames:
|
||||||
|
fileExtension = os.path.splitext(file)[1]
|
||||||
|
|
||||||
|
if fileExtension in ['.rar', '.7z', '.7z']:
|
||||||
|
Logger.warning("Post-Process: Archive files exist but unpack skipped, exiting")
|
||||||
|
exit(POSTPROCESS_NONE)
|
||||||
|
|
||||||
|
if fileExtension in ['.par2']:
|
||||||
|
Logger.warning("Post-Process: Unpack skipped and par-check skipped (although par2-files exist), exiting")
|
||||||
|
exit(POSTPROCESS_NONE)
|
||||||
|
|
||||||
|
if os.path.isfile(os.path.join(NZBPP_DIRECTORY, "_brokenlog.txt")):
|
||||||
|
Logger.warning("Post-Process: _brokenlog.txt exists, download is probably damaged, exiting")
|
||||||
|
|
||||||
|
exit(POSTPROCESS_NONE)
|
||||||
|
|
||||||
|
Logger.info("Post-Process: Neither archive- nor par2-files found, _brokenlog.txt doesn't exist, considering download successful")
|
||||||
|
|
||||||
|
# Check if destination directory exists (important for reprocessing of history items)
|
||||||
|
if not os.path.isdir(NZBPP_DIRECTORY):
|
||||||
|
Logger.error("Post-Process: Nothing to post-process: destination directory $NZBPP_DIRECTORY doesn't exist")
|
||||||
|
do_exit(POSTPROCESS_ERROR)
|
||||||
|
|
||||||
|
# All checks done, now processing the files
|
||||||
|
|
||||||
|
# If download contains only nzb-files move them into nzb-directory
|
||||||
|
# for further download
|
||||||
|
|
||||||
|
AllFilesCount = 0
|
||||||
|
NZBFilesCount = 0
|
||||||
|
for dirpath, dirnames, filenames in os.walk(NZBPP_DIRECTORY):
|
||||||
|
for file in filenames:
|
||||||
|
fileExtension = os.path.splitext(file)[1]
|
||||||
|
AllFilesCount = AllFilesCount + 1
|
||||||
|
if fileExtension in ['.nzb']:
|
||||||
|
NZBFilesCount = NZBFilesCount + 1
|
||||||
|
if AllFilesCount == NZBFilesCount:
|
||||||
|
Logger.info("Moving downloaded nzb-files into incoming nzb-directory for further download")
|
||||||
|
for dirpath, dirnames, filenames in os.walk(NZBPP_DIRECTORY):
|
||||||
|
for file in filenames:
|
||||||
|
filePath = os.path.join(dirpath, file)
|
||||||
|
shutil.move(filepath, os.path.join(NZBOP_NZBDIR, file))
|
||||||
|
|
||||||
|
# Clean up
|
||||||
|
Logger.info("Post-Process: Cleaning up")
|
||||||
|
#call(['chmod', '-R', 'a+w', NZBPP_DIRECTORY])
|
||||||
|
|
||||||
|
# Clean up list, space seperated array from GUI
|
||||||
|
for dirpath, dirnames, filenames in os.walk(NZBPP_DIRECTORY):
|
||||||
|
for file in filenames:
|
||||||
|
filePath = os.path.join(dirpath, file)
|
||||||
|
fileExtension = os.path.splitext(file)[1]
|
||||||
|
if fileExtension in FileCleanUp or fileExtension in ['.par']:
|
||||||
|
os.unlink(filePath)
|
||||||
|
|
||||||
|
if JoinTS == "yes":
|
||||||
|
# Join any split .ts files if they are named xxxx.0000.ts xxxx.0001.ts
|
||||||
|
# They will be joined together to a file called xxxx.ts
|
||||||
|
outputname = ""
|
||||||
|
for filename in iglob(os.path.join(NZBPP_DIRECTORY, '*.ts')):
|
||||||
|
file, ext = os.path.splitext(filename) # split off the .ts
|
||||||
|
file2, ext2 = os.path.splitext(file) # split off the .0001
|
||||||
|
outputname = file2 + ext
|
||||||
|
break
|
||||||
|
if outputname != "":
|
||||||
|
Logger.info("Post-Process: Joining ts-files")
|
||||||
|
destination = open('outputname', 'wb')
|
||||||
|
for filename in iglob(os.path.join(NZBPP_DIRECTORY, '*.ts')):
|
||||||
|
shutil.copyfileobj(open(filename, 'rb'), destination)
|
||||||
|
destination.close()
|
||||||
|
Logger.info("Post-Process: Deleting source ts-files")
|
||||||
|
for filename in iglob(os.path.join(NZBPP_DIRECTORY, '*.ts')):
|
||||||
|
if filename != outputname:
|
||||||
|
os.unlink(filename)
|
||||||
|
|
||||||
|
if RenameIMG == "yes":
|
||||||
|
# Rename img file to iso
|
||||||
|
# It will be renamed to .img.iso so you can see that it has been renamed
|
||||||
|
for dirpath, dirnames, filenames in os.walk(NZBPP_DIRECTORY):
|
||||||
|
for file in filenames:
|
||||||
|
filePath = os.path.join(dirpath, file)
|
||||||
|
fileExtension = os.path.splitext(file)[1]
|
||||||
|
if fileExtension in ['.img']:
|
||||||
|
Logger.info("Post-Process: Renaming img-files to iso")
|
||||||
|
newPath = os.path.join(dirpath, file + ".iso")
|
||||||
|
shutil.move(filePath, newPath)
|
||||||
|
|
||||||
|
# Check if destination directory was set in postprocessing parameters
|
||||||
|
# (for current nzb-file) via web-interface or via command line with
|
||||||
|
# "nzbget -E G O DestDir=/new/path <ID>"
|
||||||
|
if not (NZBPR_DestDir == None or NZBPR_DestDir == ""):
|
||||||
|
Logger.info("Post-Process: moving files to %s", NZBPR_DestDir)
|
||||||
|
os.mkdir(NZBPR_DestDir)
|
||||||
|
for dirpath, dirnames, filenames in os.walk(NZBPP_DIRECTORY):
|
||||||
|
for file in filenames:
|
||||||
|
filePath = os.path.join(dirpath, file)
|
||||||
|
newPath = os.path,join(NZBPR_DestDir, file)
|
||||||
|
shutil.move(filePath, newPath)
|
||||||
|
os.chdir(NZBPR_DestDir)
|
||||||
|
shutil.rmtree(NZBPP_DIRECTORY)
|
||||||
|
NZBPP_DIRECTORY = NZBPR_DestDir
|
||||||
|
os.chdir(NZBPP_DIRECTORY)
|
||||||
|
|
||||||
|
# All OK, requesting cleaning up of download queue
|
||||||
|
do_exit(POSTPROCESS_SUCCESS)
|
Loading…
Add table
Add a link
Reference in a new issue