2019-06-29 22:33:49 +00:00
using System ;
2017-09-01 01:10:50 +00:00
using System.Collections.Generic ;
2016-03-15 22:43:21 +00:00
using System.Collections.Specialized ;
using System.Linq ;
2015-05-20 23:22:10 +00:00
using FluentValidation.Results ;
2016-03-15 22:43:21 +00:00
using NLog ;
using NzbDrone.Common.Disk ;
using NzbDrone.Common.Processes ;
2019-03-22 00:47:54 +00:00
using NzbDrone.Common.Serializer ;
2017-09-23 01:59:24 +00:00
using NzbDrone.Core.Music ;
2017-03-02 05:28:48 +00:00
using NzbDrone.Core.ThingiProvider ;
2016-03-15 22:43:21 +00:00
using NzbDrone.Core.Validation ;
2015-05-20 23:22:10 +00:00
namespace NzbDrone.Core.Notifications.CustomScript
{
public class CustomScript : NotificationBase < CustomScriptSettings >
{
2016-03-15 22:43:21 +00:00
private readonly IDiskProvider _diskProvider ;
private readonly IProcessProvider _processProvider ;
private readonly Logger _logger ;
2015-05-20 23:22:10 +00:00
2016-03-15 22:43:21 +00:00
public CustomScript ( IDiskProvider diskProvider , IProcessProvider processProvider , Logger logger )
2015-05-20 23:22:10 +00:00
{
2016-03-15 22:43:21 +00:00
_diskProvider = diskProvider ;
_processProvider = processProvider ;
_logger = logger ;
2015-05-20 23:22:10 +00:00
}
2016-12-28 07:52:20 +00:00
public override string Name = > "Custom Script" ;
2021-08-04 22:47:40 +00:00
public override string Link = > "https://wiki.servarr.com/lidarr/custom-scripts" ;
2015-05-20 23:22:10 +00:00
2017-03-02 05:28:48 +00:00
public override ProviderMessage Message = > new ProviderMessage ( "Testing will execute the script with the EventType set to Test, ensure your script handles this correctly" , ProviderMessageType . Warning ) ;
2016-03-15 22:43:21 +00:00
public override void OnGrab ( GrabMessage message )
2015-05-20 23:22:10 +00:00
{
2017-09-23 01:59:24 +00:00
var artist = message . Artist ;
var remoteAlbum = message . Album ;
var releaseGroup = remoteAlbum . ParsedAlbumInfo . ReleaseGroup ;
2016-03-15 22:43:21 +00:00
var environmentVariables = new StringDictionary ( ) ;
2017-03-30 03:49:38 +00:00
environmentVariables . Add ( "Lidarr_EventType" , "Grab" ) ;
2017-09-23 01:59:24 +00:00
environmentVariables . Add ( "Lidarr_Artist_Id" , artist . Id . ToString ( ) ) ;
2018-12-15 00:02:43 +00:00
environmentVariables . Add ( "Lidarr_Artist_Name" , artist . Metadata . Value . Name ) ;
environmentVariables . Add ( "Lidarr_Artist_MBId" , artist . Metadata . Value . ForeignArtistId ) ;
environmentVariables . Add ( "Lidarr_Artist_Type" , artist . Metadata . Value . Type ) ;
2017-09-23 01:59:24 +00:00
environmentVariables . Add ( "Lidarr_Release_AlbumCount" , remoteAlbum . Albums . Count . ToString ( ) ) ;
environmentVariables . Add ( "Lidarr_Release_AlbumReleaseDates" , string . Join ( "," , remoteAlbum . Albums . Select ( e = > e . ReleaseDate ) ) ) ;
environmentVariables . Add ( "Lidarr_Release_AlbumTitles" , string . Join ( "|" , remoteAlbum . Albums . Select ( e = > e . Title ) ) ) ;
2020-10-16 16:10:25 +00:00
environmentVariables . Add ( "Lidarr_Release_AlbumMBIds" , string . Join ( "|" , remoteAlbum . Albums . Select ( e = > e . ForeignAlbumId ) ) ) ;
2017-09-23 01:59:24 +00:00
environmentVariables . Add ( "Lidarr_Release_Title" , remoteAlbum . Release . Title ) ;
2018-05-20 02:20:08 +00:00
environmentVariables . Add ( "Lidarr_Release_Indexer" , remoteAlbum . Release . Indexer ? ? string . Empty ) ;
2017-09-23 01:59:24 +00:00
environmentVariables . Add ( "Lidarr_Release_Size" , remoteAlbum . Release . Size . ToString ( ) ) ;
environmentVariables . Add ( "Lidarr_Release_Quality" , remoteAlbum . ParsedAlbumInfo . Quality . Quality . Name ) ;
environmentVariables . Add ( "Lidarr_Release_QualityVersion" , remoteAlbum . ParsedAlbumInfo . Quality . Revision . Version . ToString ( ) ) ;
2017-10-30 01:44:03 +00:00
environmentVariables . Add ( "Lidarr_Release_ReleaseGroup" , releaseGroup ? ? string . Empty ) ;
2017-10-28 20:30:38 +00:00
environmentVariables . Add ( "Lidarr_Download_Client" , message . DownloadClient ? ? string . Empty ) ;
environmentVariables . Add ( "Lidarr_Download_Id" , message . DownloadId ? ? string . Empty ) ;
2016-03-15 22:43:21 +00:00
ExecuteScript ( environmentVariables ) ;
2015-05-20 23:22:10 +00:00
}
2019-03-22 00:47:54 +00:00
public override void OnReleaseImport ( AlbumDownloadMessage message )
2015-05-20 23:22:10 +00:00
{
2017-09-23 01:59:24 +00:00
var artist = message . Artist ;
2018-04-25 03:19:00 +00:00
var album = message . Album ;
2018-12-27 02:48:03 +00:00
var release = message . Release ;
2016-03-15 22:43:21 +00:00
var environmentVariables = new StringDictionary ( ) ;
2019-03-22 00:47:54 +00:00
environmentVariables . Add ( "Lidarr_EventType" , "AlbumDownload" ) ;
2017-09-23 01:59:24 +00:00
environmentVariables . Add ( "Lidarr_Artist_Id" , artist . Id . ToString ( ) ) ;
2018-12-15 00:02:43 +00:00
environmentVariables . Add ( "Lidarr_Artist_Name" , artist . Metadata . Value . Name ) ;
2017-09-23 01:59:24 +00:00
environmentVariables . Add ( "Lidarr_Artist_Path" , artist . Path ) ;
2018-12-15 00:02:43 +00:00
environmentVariables . Add ( "Lidarr_Artist_MBId" , artist . Metadata . Value . ForeignArtistId ) ;
environmentVariables . Add ( "Lidarr_Artist_Type" , artist . Metadata . Value . Type ) ;
2018-04-25 03:19:00 +00:00
environmentVariables . Add ( "Lidarr_Album_Id" , album . Id . ToString ( ) ) ;
environmentVariables . Add ( "Lidarr_Album_Title" , album . Title ) ;
environmentVariables . Add ( "Lidarr_Album_MBId" , album . ForeignAlbumId ) ;
2018-12-27 02:48:03 +00:00
environmentVariables . Add ( "Lidarr_AlbumRelease_MBId" , release . ForeignReleaseId ) ;
2018-04-25 03:19:00 +00:00
environmentVariables . Add ( "Lidarr_Album_ReleaseDate" , album . ReleaseDate . ToString ( ) ) ;
2017-10-28 20:30:38 +00:00
environmentVariables . Add ( "Lidarr_Download_Client" , message . DownloadClient ? ? string . Empty ) ;
environmentVariables . Add ( "Lidarr_Download_Id" , message . DownloadId ? ? string . Empty ) ;
2016-03-15 22:43:21 +00:00
2019-03-22 00:47:54 +00:00
if ( message . TrackFiles . Any ( ) )
{
2019-06-08 19:13:58 +00:00
environmentVariables . Add ( "Lidarr_AddedTrackPaths" , string . Join ( "|" , message . TrackFiles . Select ( e = > e . Path ) ) ) ;
2019-03-22 00:47:54 +00:00
}
2017-09-01 01:10:50 +00:00
if ( message . OldFiles . Any ( ) )
{
2019-06-08 19:13:58 +00:00
environmentVariables . Add ( "Lidarr_DeletedPaths" , string . Join ( "|" , message . OldFiles . Select ( e = > e . Path ) ) ) ;
2017-09-01 01:10:50 +00:00
}
2016-03-15 22:43:21 +00:00
ExecuteScript ( environmentVariables ) ;
2015-05-20 23:22:10 +00:00
}
2019-03-22 00:47:54 +00:00
public override void OnRename ( Artist artist )
{
var environmentVariables = new StringDictionary ( ) ;
environmentVariables . Add ( "Lidarr_EventType" , "Rename" ) ;
environmentVariables . Add ( "Lidarr_Artist_Id" , artist . Id . ToString ( ) ) ;
environmentVariables . Add ( "Lidarr_Artist_Name" , artist . Metadata . Value . Name ) ;
environmentVariables . Add ( "Lidarr_Artist_Path" , artist . Path ) ;
environmentVariables . Add ( "Lidarr_Artist_MBId" , artist . Metadata . Value . ForeignArtistId ) ;
environmentVariables . Add ( "Lidarr_Artist_Type" , artist . Metadata . Value . Type ) ;
ExecuteScript ( environmentVariables ) ;
}
public override void OnTrackRetag ( TrackRetagMessage message )
2018-04-04 03:45:59 +00:00
{
var artist = message . Artist ;
var album = message . Album ;
2018-12-27 02:48:03 +00:00
var release = message . Release ;
2019-03-22 00:47:54 +00:00
var trackFile = message . TrackFile ;
2018-04-04 03:45:59 +00:00
var environmentVariables = new StringDictionary ( ) ;
2019-03-22 00:47:54 +00:00
environmentVariables . Add ( "Lidarr_EventType" , "TrackRetag" ) ;
2018-04-04 03:45:59 +00:00
environmentVariables . Add ( "Lidarr_Artist_Id" , artist . Id . ToString ( ) ) ;
2018-12-15 00:02:43 +00:00
environmentVariables . Add ( "Lidarr_Artist_Name" , artist . Metadata . Value . Name ) ;
2018-04-04 03:45:59 +00:00
environmentVariables . Add ( "Lidarr_Artist_Path" , artist . Path ) ;
2018-12-15 00:02:43 +00:00
environmentVariables . Add ( "Lidarr_Artist_MBId" , artist . Metadata . Value . ForeignArtistId ) ;
environmentVariables . Add ( "Lidarr_Artist_Type" , artist . Metadata . Value . Type ) ;
2018-04-04 03:45:59 +00:00
environmentVariables . Add ( "Lidarr_Album_Id" , album . Id . ToString ( ) ) ;
environmentVariables . Add ( "Lidarr_Album_Title" , album . Title ) ;
environmentVariables . Add ( "Lidarr_Album_MBId" , album . ForeignAlbumId ) ;
2018-12-27 02:48:03 +00:00
environmentVariables . Add ( "Lidarr_AlbumRelease_MBId" , release . ForeignReleaseId ) ;
2018-04-25 03:19:00 +00:00
environmentVariables . Add ( "Lidarr_Album_ReleaseDate" , album . ReleaseDate . ToString ( ) ) ;
2019-03-22 00:47:54 +00:00
environmentVariables . Add ( "Lidarr_TrackFile_Id" , trackFile . Id . ToString ( ) ) ;
environmentVariables . Add ( "Lidarr_TrackFile_TrackCount" , trackFile . Tracks . Value . Count . ToString ( ) ) ;
2019-06-08 19:13:58 +00:00
environmentVariables . Add ( "Lidarr_TrackFile_Path" , trackFile . Path ) ;
2019-03-22 00:47:54 +00:00
environmentVariables . Add ( "Lidarr_TrackFile_TrackNumbers" , string . Join ( "," , trackFile . Tracks . Value . Select ( e = > e . TrackNumber ) ) ) ;
environmentVariables . Add ( "Lidarr_TrackFile_TrackTitles" , string . Join ( "|" , trackFile . Tracks . Value . Select ( e = > e . Title ) ) ) ;
environmentVariables . Add ( "Lidarr_TrackFile_Quality" , trackFile . Quality . Quality . Name ) ;
environmentVariables . Add ( "Lidarr_TrackFile_QualityVersion" , trackFile . Quality . Revision . Version . ToString ( ) ) ;
environmentVariables . Add ( "Lidarr_TrackFile_ReleaseGroup" , trackFile . ReleaseGroup ? ? string . Empty ) ;
environmentVariables . Add ( "Lidarr_TrackFile_SceneName" , trackFile . SceneName ? ? string . Empty ) ;
environmentVariables . Add ( "Lidarr_Tags_Diff" , message . Diff . ToJson ( ) ) ;
environmentVariables . Add ( "Lidarr_Tags_Scrubbed" , message . Scrubbed . ToString ( ) ) ;
2018-05-27 04:55:43 +00:00
2018-04-04 03:45:59 +00:00
ExecuteScript ( environmentVariables ) ;
}
2019-03-22 00:47:54 +00:00
public override void OnHealthIssue ( HealthCheck . HealthCheck healthCheck )
2015-05-20 23:22:10 +00:00
{
2016-03-15 22:43:21 +00:00
var environmentVariables = new StringDictionary ( ) ;
2019-03-22 00:47:54 +00:00
environmentVariables . Add ( "Lidarr_EventType" , "HealthIssue" ) ;
environmentVariables . Add ( "Lidarr_Health_Issue_Level" , nameof ( healthCheck . Type ) ) ;
environmentVariables . Add ( "Lidarr_Health_Issue_Message" , healthCheck . Message ) ;
environmentVariables . Add ( "Lidarr_Health_Issue_Type" , healthCheck . Source . Name ) ;
environmentVariables . Add ( "Lidarr_Health_Issue_Wiki" , healthCheck . WikiUrl . ToString ( ) ? ? string . Empty ) ;
2016-03-15 22:43:21 +00:00
ExecuteScript ( environmentVariables ) ;
2015-05-20 23:22:10 +00:00
}
2016-03-15 22:43:21 +00:00
public override ValidationResult Test ( )
2015-05-20 23:22:10 +00:00
{
2016-03-15 22:43:21 +00:00
var failures = new List < ValidationFailure > ( ) ;
if ( ! _diskProvider . FileExists ( Settings . Path ) )
2015-05-20 23:22:10 +00:00
{
2016-03-15 22:43:21 +00:00
failures . Add ( new NzbDroneValidationFailure ( "Path" , "File does not exist" ) ) ;
2015-05-20 23:22:10 +00:00
}
2016-03-15 22:43:21 +00:00
2017-03-02 05:28:48 +00:00
try
2019-06-29 22:33:49 +00:00
{
2017-03-02 05:28:48 +00:00
var environmentVariables = new StringDictionary ( ) ;
environmentVariables . Add ( "Lidarr_EventType" , "Test" ) ;
2019-06-29 22:33:49 +00:00
2017-03-02 05:28:48 +00:00
var processOutput = ExecuteScript ( environmentVariables ) ;
2019-06-29 22:33:49 +00:00
2017-03-02 05:28:48 +00:00
if ( processOutput . ExitCode ! = 0 )
2019-06-29 22:33:49 +00:00
{
2017-03-02 05:28:48 +00:00
failures . Add ( new NzbDroneValidationFailure ( string . Empty , $"Script exited with code: {processOutput.ExitCode}" ) ) ;
2019-06-29 22:33:49 +00:00
}
}
2017-03-02 05:28:48 +00:00
catch ( Exception ex )
{
_logger . Error ( ex ) ;
failures . Add ( new NzbDroneValidationFailure ( string . Empty , ex . Message ) ) ;
}
2019-06-29 22:33:49 +00:00
2016-03-15 22:43:21 +00:00
return new ValidationResult ( failures ) ;
2015-05-20 23:22:10 +00:00
}
2017-03-02 05:28:48 +00:00
private ProcessOutput ExecuteScript ( StringDictionary environmentVariables )
2015-05-20 23:22:10 +00:00
{
2016-03-15 22:43:21 +00:00
_logger . Debug ( "Executing external script: {0}" , Settings . Path ) ;
2015-05-20 23:22:10 +00:00
2017-03-02 05:28:48 +00:00
var processOutput = _processProvider . StartAndCapture ( Settings . Path , Settings . Arguments , environmentVariables ) ;
2016-03-15 22:43:21 +00:00
2017-03-02 05:28:48 +00:00
_logger . Debug ( "Executed external script: {0} - Status: {1}" , Settings . Path , processOutput . ExitCode ) ;
_logger . Debug ( $"Script Output: {System.Environment.NewLine}{string.Join(System.Environment.NewLine, processOutput.Lines)}" ) ;
2019-06-29 22:33:49 +00:00
2017-03-02 05:28:48 +00:00
return processOutput ;
2019-06-29 22:33:49 +00:00
}
2015-05-20 23:22:10 +00:00
}
}