SickBeard - Auto-updating from Git
- Not quite complete - still needs testing - Seems to break SABnzbd+ when installing Python??
This commit is contained in:
43
Sickbeard/Sickbeard.nuspec
Normal file
43
Sickbeard/Sickbeard.nuspec
Normal file
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0"?>
|
||||
<package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<metadata>
|
||||
<id>SickBeard.Source</id>
|
||||
<title>Sick Beard Usenet PVR</title>
|
||||
<version>10.00.1600.22-Alpha</version>
|
||||
<authors>midgetspy</authors>
|
||||
<owners>Ethan Brown</owners>
|
||||
<summary>The ultimate PVR application that searches for and manages your TV shows.</summary>
|
||||
<description>Sick Beard is a PVR for newsgroup users (with limited torrent support). It watches for new episodes of your favorite shows and when they are posted it downloads them, sorts and renames them, and optionally generates metadata for them. It currently supports NZBs.org, NZBMatrix, NZBs'R'Us, Newzbin, Womble's Index, NZB.su, TVTorrents and EZRSS and retrieves show information from theTVDB.com and TVRage.com.
|
||||
|
||||
This package
|
||||
- Installs SABnzbd+ (compiled version)
|
||||
- Installs Python
|
||||
- Installs Cheetah with Windows optimizations
|
||||
- Git clones the SickBeard source to site-packages
|
||||
- Configures Git within SickBeard to auto-update
|
||||
- Configures for XBMC metadata
|
||||
- Configures XMBC notifications - to port 9090 as SABnzbd+ uses 8080
|
||||
- Configures SickBeard to send NZBs to SABnzbd+ using API key
|
||||
- Configures the SickBeard post-processing script in SABnzbd+
|
||||
- Configures SickBeard to run as a Windows service
|
||||
</description>
|
||||
<projectUrl>http://sickbeard.com/</projectUrl>
|
||||
<tags>Sickbeard Python Usenet</tags>
|
||||
<!-- Eula is in installer
|
||||
<licenseUrl></licenseUrl>
|
||||
-->
|
||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
||||
<iconUrl>https://github.com/Iristyle/ChocolateyPackages/raw/master/SickBeard/sickbeard.png</iconUrl>
|
||||
<releaseNotes></releaseNotes>
|
||||
<dependencies>
|
||||
<dependency id="python" version="[2.7,3.0)" />
|
||||
<dependency id="Git.Install" />
|
||||
<dependency id="rktools.2003" />
|
||||
<dependency id="Python.Cheetah" />
|
||||
<dependency id="SABnzbd" />
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
<file src="tools\**" target="tools" />
|
||||
</files>
|
||||
</package>
|
BIN
Sickbeard/sickbeard.png
Normal file
BIN
Sickbeard/sickbeard.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
259
Sickbeard/tools/chocolateyInstall.ps1
Normal file
259
Sickbeard/tools/chocolateyInstall.ps1
Normal file
@@ -0,0 +1,259 @@
|
||||
$package = 'Sickbeard'
|
||||
|
||||
try {
|
||||
|
||||
function Get-CurrentDirectory
|
||||
{
|
||||
$thisName = $MyInvocation.MyCommand.Name
|
||||
[IO.Path]::GetDirectoryName((Get-Content function:$thisName).File)
|
||||
}
|
||||
|
||||
# load INI parser
|
||||
. (Join-Path (Get-CurrentDirectory) 'Get-IniContent.ps1')
|
||||
. (Join-Path (Get-CurrentDirectory) 'Out-IniFile.ps1')
|
||||
|
||||
#simulate the unix command for finding things in path
|
||||
#http://stackoverflow.com/questions/63805/equivalent-of-nix-which-command-in-powershell
|
||||
function Which([string]$cmd)
|
||||
{
|
||||
Get-Command -ErrorAction "SilentlyContinue" $cmd |
|
||||
Select -ExpandProperty Definition
|
||||
}
|
||||
|
||||
function WaitService([string]$name, [int]$seconds)
|
||||
{
|
||||
Write-Host "Waiting up to $($seconds)s for $name to start..."
|
||||
$result = 0..($seconds * 2) |
|
||||
% {
|
||||
$service = Get-Service $name -ErrorAction SilentlyContinue
|
||||
if ($service -and ($service.Status -eq 'Running'))
|
||||
{ return $true }
|
||||
elseif ($service)
|
||||
{ Start-Sleep -Milliseconds 500 }
|
||||
return $false
|
||||
} |
|
||||
Select -Last 1
|
||||
|
||||
return $result
|
||||
}
|
||||
|
||||
# Use PYTHONHOME if it exists, or fallback to 'Where' to search PATH
|
||||
if ($Env:PYTHONHOME) { $localPython = Join-Path $Env:PYTHONHOME 'python.exe' }
|
||||
|
||||
if (!$Env:PYTHONHOME -or !(Test-Path $localPython))
|
||||
{ $localPython = Which python.exe }
|
||||
|
||||
if (!(Test-Path $localPython))
|
||||
{
|
||||
Write-ChocolateyFailure 'SickBeard requires a Python runtime to install'
|
||||
return
|
||||
}
|
||||
|
||||
$pythonRoot = Split-Path $localPython
|
||||
|
||||
$sitePackages = (Join-Path (Join-Path $pythonRoot 'Lib') 'site-packages')
|
||||
if (!(Test-Path $sitePackages))
|
||||
{
|
||||
Write-ChocolateyFailure 'Could not find Python site-packages directory'
|
||||
return
|
||||
}
|
||||
|
||||
# grab the latest sources if not present
|
||||
Push-Location $sitePackages
|
||||
$git = Which git
|
||||
$sickBeardPath = (Join-Path $sitePackages 'Sick-Beard')
|
||||
if (Test-Path $sickBeardPath)
|
||||
{
|
||||
Write-ChocolateySuccess 'SickBeard already installed!'
|
||||
return
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-ChocolateySuccess 'Cloning SickBeard source from GitHub'
|
||||
&git clone https://github.com/midgetspy/Sick-Beard
|
||||
}
|
||||
|
||||
# Read SABNzbd+ config file to find scripts directory
|
||||
$sabDataPath = Join-Path $Env:LOCALAPPDATA 'sabnzbd'
|
||||
$sabIniPath = Join-Path $sabDataPath 'sabnzbd.ini'
|
||||
if (Test-Path $sabIniPath)
|
||||
{
|
||||
Write-Host "Reading SABnzbd+ config file at $sabIniPath"
|
||||
$sabConfig = Get-IniContent $sabIniPath
|
||||
|
||||
# 3 options - missing script_dir, script_dir set to "", or configured script_dir
|
||||
if (!$sabConfig.misc.script_dir -or `
|
||||
($sabConfig.misc.script_dir -eq "`"`""))
|
||||
{
|
||||
$scriptDir = (Join-Path $sabDataPath 'scripts')
|
||||
Write-Host "Configured SABnzbd+ script_dir to $scriptDir"
|
||||
$sabConfig.misc.script_dir = $scriptDir
|
||||
$sabConfig | Out-IniFile -FilePath $sabIniPath -Force
|
||||
}
|
||||
|
||||
if (!(Test-Path $sabConfig.misc.script_dir))
|
||||
{
|
||||
[Void]New-Item -Path $sabConfig.misc.script_dir -Type Directory
|
||||
}
|
||||
|
||||
# copy and configure autoprocessing scripts in SABNzbd+ scripts directory
|
||||
Write-Host "Copying SickBeard post-processing scripts to SABnzbd+"
|
||||
$sourceScripts = (Join-Path $sickBeardPath 'autoProcessTV')
|
||||
Get-ChildItem $sourceScripts |
|
||||
? { !(Test-Path (Join-Path $sabConfig.misc.script_dir $_.Name)) } |
|
||||
Copy-Item -Destination $sabConfig.misc.script_dir
|
||||
|
||||
if (!$sabconfig.categories.tv)
|
||||
{
|
||||
Write-Host "Configuring tv category inside SABnzbd+"
|
||||
$tv = New-Object Collections.Specialized.OrderedDictionary
|
||||
$tv.priority = 0;
|
||||
$tv.pp = 3; # Download + Unpack +Repair +Delete
|
||||
$tv.name = 'tv';
|
||||
$tv.script = 'sabToSickBeard.py';
|
||||
$tv.newzbin = '';
|
||||
$tv.dir = 'tv';
|
||||
$sabconfig.categories.tv = $tv
|
||||
}
|
||||
|
||||
if (([string]::IsNullOrEmpty($sabconfig.categories.tv.script)) -or `
|
||||
($sabconfig.categories.tv.script -ieq 'None'))
|
||||
{
|
||||
$sabconfig.categories.tv.script = 'sabToSickBeard.py'
|
||||
}
|
||||
|
||||
Write-Host 'Configured tv category in SABnzbd+'
|
||||
$sabConfig | Out-IniFile -FilePath $sabIniPath -Force
|
||||
}
|
||||
|
||||
# regardless of sabnzbd+ install status, .PY should be executable
|
||||
if (($ENV:PATHEXT -split ';') -inotcontains '.PY')
|
||||
{
|
||||
Write-Host 'Adding .PY to PATHEXT'
|
||||
$ENV:PATHEXT += ';.PY'
|
||||
[Environment]::SetEnvironmentVariable('PATHEXT', $ENV:PATHEXT, 'Machine')
|
||||
}
|
||||
|
||||
# find resource kit tools and configure sickbeard as a service
|
||||
# http://htpcbuild.com/htpc-software/sickbeard/sickbeard-service/
|
||||
# http://stackoverflow.com/questions/32404/can-i-run-a-python-script-as-a-service-in-windows-how
|
||||
$resourceKit = ${Env:ProgramFiles(x86)}, $Env:ProgramFiles |
|
||||
% { Join-Path (Join-Path $_ 'Windows Resource Kits') 'Tools' } |
|
||||
? { Test-Path $_ } |
|
||||
Select -First 1
|
||||
|
||||
if ($resourceKit)
|
||||
{
|
||||
Write-Host "Found resource kit - registering SickBeard as a service"
|
||||
Push-Location $resourceKit
|
||||
$srvAny = Join-Path $resourceKit 'srvany.exe'
|
||||
.\instsrv SickBeard $srvany
|
||||
|
||||
# Set-Service cmdlet doesn't have depend OR delayed start :(
|
||||
Write-Host "Configuring service delayed auto with Tcpip dependency"
|
||||
sc.exe config SickBeard depend= Tcpip
|
||||
sc.exe config SickBeard start= delayed-auto
|
||||
|
||||
New-Item HKLM:\SYSTEM\CurrentControlSet\Services -Name SickBeard `
|
||||
-ErrorAction SilentlyContinue | Out-Null
|
||||
New-Item HKLM:\SYSTEM\CurrentControlSet\Services\SickBeard `
|
||||
-Name Parameters -ErrorAction SilentlyContinue | Out-Null
|
||||
$sickParams = Get-Item HKLM:\SYSTEM\CurrentControlSet\Services\SickBeard\Parameters
|
||||
New-ItemProperty -Path $sickParams.PSPath -PropertyType String `
|
||||
-Name 'AppDirectory' -Value $pythonRoot -Force | Out-Null
|
||||
$pythonW = (Join-Path $pythonRoot 'pythonw.exe')
|
||||
New-ItemProperty -Path $sickParams.PSPath -PropertyType String `
|
||||
-Name 'Application' -Value $pythonW -Force | Out-Null
|
||||
$startSickBeard = (Join-Path $sickBeardPath 'sickbeard.py')
|
||||
New-ItemProperty -Path $sickParams.PSPath -PropertyType String `
|
||||
-Name 'AppParameters' -Value $startSickBeard -Force | Out-Null
|
||||
|
||||
Start-Service SickBeard
|
||||
|
||||
# config files are created on first start-up
|
||||
if (WaitService 'SickBeard', 20)
|
||||
{
|
||||
$configPath = (Join-Path $sickBeardPath 'config.ini')
|
||||
$sickBeardConfig = Get-IniContent $configPath
|
||||
|
||||
Write-Host "Configuring Windows Firewall for the SickBeard port"
|
||||
# configure windows firewall
|
||||
netsh advfirewall firewall delete rule name="SickBeard"
|
||||
# program="$pythonW"
|
||||
$port = $sickBeardConfig.General.web_port
|
||||
netsh advfirewall firewall add rule name="SickBeard" dir=in protocol=tcp localport=$port action=allow
|
||||
|
||||
# http://forums.sabnzbd.org/viewtopic.php?t=3072&start=855
|
||||
$sickBeardConfig.General.git_path = $git
|
||||
$sickBeardConfig.General.launch_browser = 0
|
||||
$sickBeardConfig.General.use_api = 1
|
||||
$sickBeardConfig.General.process_automatically = 0
|
||||
$sickBeardConfig.General.move_associated_files = 1
|
||||
$sickBeardConfig.General.api_key = [Guid]::NewGuid().ToString('n')
|
||||
$sickBeardConfig.General.metadata_xbmc = '1|1|1|1|1|1'
|
||||
$sickBeardConfig.General.naming_pattern = '%SN - %Sx%0E - %EN'
|
||||
#range like x03-05
|
||||
$sickBeardConfig.General.naming_multi_ep = 8
|
||||
|
||||
# configure for XBMC with default user / pass of xbmc / xbmc
|
||||
$sickBeardConfig.XBMC.use_xbmc = 1
|
||||
$sickBeardConfig.XBMC.xbmc_update_library = 1
|
||||
$sickBeardConfig.XBMC.xbmc_host = 'localhost:9090'
|
||||
$sickBeardConfig.XBMC.xbmc_username = 'xbmc'
|
||||
$sickBeardConfig.XBMC.xbmc_password = 'xbmc'
|
||||
|
||||
# configure SickBeard to use SABNzbd
|
||||
$sickBeardConfig.General.nzb_method = 'sabnzbd'
|
||||
$sickBeardConfig.SABnzbd.sab_username = $sabConfig.misc.username
|
||||
$sickBeardConfig.SABnzbd.sab_password = $sabConfig.misc.password
|
||||
$sickBeardConfig.SABnzbd.sab_apikey = $sabConfig.misc.api_key
|
||||
$sickBeardConfig.SABnzbd.sab_category = 'tv'
|
||||
$sickBeardConfig.SABnzbd.sab_host = "http://localhost:$($sabConfig.misc.port)/"
|
||||
|
||||
$sickBeardConfig | Out-IniFile -File $configPath -Force -Encoding ASCII
|
||||
|
||||
Stop-Service SickBeard
|
||||
Start-Service SickBeard
|
||||
}
|
||||
|
||||
$autoConfig = Join-Path $sabConfig.misc.script_dir 'autoProcessTV.cfg'
|
||||
if (!(Test-Path $autoConfig))
|
||||
{
|
||||
$processConfig = @{
|
||||
'SickBeard' = @{
|
||||
host = $sickBeardConfig.General.web_host;
|
||||
port = $sickBeardConfig.General.web_port;
|
||||
username = $sickBeardConfig.General.web_username;
|
||||
password = $sickBeardConfig.General.web_password;
|
||||
web_root = $sickBeardConfig.General.web_root;
|
||||
ssl = 0;
|
||||
}
|
||||
}
|
||||
$processConfig | Out-IniFile -FilePath $autoConfig
|
||||
Write-Host @"
|
||||
SickBeard SABNzbd+ post-processing scripts configured
|
||||
If SickBeard is reconfigured with a username or password or another
|
||||
host then those same changes must be made to $sickBeardConfig
|
||||
"@
|
||||
}
|
||||
|
||||
Write-Host 'Restarting SABnzbd+ to accept configuration changes'
|
||||
$url = ("http://localhost:$($sabConfig.misc.port)/api?mode=restart" +
|
||||
"&apikey=$($sabConfig.misc.api_key)")
|
||||
(New-Object Net.WebClient).DownloadString($url)
|
||||
|
||||
#wait up to 5 seconds for service to fire up
|
||||
if (WaitService 'SickBeard' 5)
|
||||
{
|
||||
#launch local default browser for additional config
|
||||
[Diagnostics.Process]::Start("http://localhost:$($sickBeardConfig.General.web_port)")
|
||||
}
|
||||
|
||||
Pop-Location
|
||||
}
|
||||
|
||||
Write-ChocolateySuccess $package
|
||||
} catch {
|
||||
Write-ChocolateyFailure $package "$($_.Exception.Message)"
|
||||
throw
|
||||
}
|
Reference in New Issue
Block a user