golift.io/starr@v1.0.0/sonarr/manualimport.go (about)

     1  package sonarr
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"encoding/json"
     7  	"fmt"
     8  	"net/url"
     9  
    10  	"golift.io/starr"
    11  )
    12  
    13  // Define Base Path for Manual Import calls.
    14  const bpManualImport = APIver + "/manualimport"
    15  
    16  // ManualImportInput is the input data for a manual import request using a POST request.
    17  type ManualImportInput struct {
    18  	ID                int64                `json:"id"`
    19  	Path              string               `json:"path"`
    20  	SeriesID          int64                `json:"seriesId"`
    21  	SeasonNumber      int                  `json:"seasonNumber"`
    22  	Episodes          []*Episode           `json:"episodes"`
    23  	EpisodeIDs        []int64              `json:"episodeIds"`
    24  	Quality           *starr.Quality       `json:"quality"`
    25  	Languages         []*starr.Value       `json:"languages"`
    26  	ReleaseGroup      string               `json:"releaseGroup"`
    27  	DownloadID        string               `json:"downloadId"`
    28  	CustomFormats     []*CustomFormatInput `json:"customFormats"`
    29  	CustomFormatScore int64                `json:"customFormatScore"`
    30  	Rejections        []*Rejection         `json:"rejections"`
    31  }
    32  
    33  // ManualImportOutput is the output data for a manual import request.
    34  type ManualImportOutput struct {
    35  	ID                int64                 `json:"id"`
    36  	Path              string                `json:"path"`
    37  	RelativePath      string                `json:"relativePath"`
    38  	FolderName        string                `json:"folderName"`
    39  	Name              string                `json:"name"`
    40  	Size              int                   `json:"size"`
    41  	Series            *Series               `json:"series"`
    42  	SeasonNumber      int                   `json:"seasonNumber"`
    43  	Episodes          []*Episode            `json:"episodes"`
    44  	EpisodeFileID     int64                 `json:"episodeFileId"`
    45  	Quality           *starr.Quality        `json:"quality"`
    46  	Languages         []*starr.Value        `json:"languages"`
    47  	ReleaseGroup      string                `json:"releaseGroup"`
    48  	QualityWeight     int64                 `json:"qualityWeight"`
    49  	DownloadID        string                `json:"downloadId"`
    50  	CustomFormats     []*CustomFormatOutput `json:"customFormats"`
    51  	CustomFormatScore int64                 `json:"customFormatScore"`
    52  	Rejections        []*Rejection          `json:"rejections"`
    53  }
    54  
    55  // Rejection is part of the manual import payload.
    56  type Rejection struct {
    57  	Reason string `json:"reason"`
    58  	// permanent or temporary
    59  	Type string `json:"type"`
    60  }
    61  
    62  // ManualImportParams provides the input parameters for the GET /manualimport API.
    63  type ManualImportParams struct {
    64  	Folder              string
    65  	DownloadID          string
    66  	SeriesID            int64
    67  	SeasonNumber        int
    68  	FilterExistingFiles bool
    69  }
    70  
    71  // ManualImport initiates a manual import (GET).
    72  func (s *Sonarr) ManualImport(params *ManualImportParams) (*ManualImportOutput, error) {
    73  	return s.ManualImportContext(context.Background(), params)
    74  }
    75  
    76  // ManualImportContext initiates a manual import (GET).
    77  func (s *Sonarr) ManualImportContext(ctx context.Context, params *ManualImportParams) (*ManualImportOutput, error) {
    78  	var output ManualImportOutput
    79  
    80  	req := starr.Request{URI: bpManualImport, Query: make(url.Values)}
    81  	req.Query.Add("folder", params.Folder)
    82  	req.Query.Add("downloadId", params.DownloadID)
    83  	req.Query.Add("seriesId", fmt.Sprint(params.SeriesID))
    84  	req.Query.Add("seasonNumber", fmt.Sprint(params.SeasonNumber))
    85  	req.Query.Add("filterExistingFiles", fmt.Sprint(params.FilterExistingFiles))
    86  
    87  	if err := s.GetInto(ctx, req, &output); err != nil {
    88  		return nil, fmt.Errorf("api.Get(%s): %w", &req, err)
    89  	}
    90  
    91  	return &output, nil
    92  }
    93  
    94  // ManualImportReprocess reprocesses a manual import (POST).
    95  func (s *Sonarr) ManualImportReprocess(manualimport *ManualImportInput) error {
    96  	return s.ManualImportReprocessContext(context.Background(), manualimport)
    97  }
    98  
    99  // ManualImportReprocessContext reprocesses a manual import (POST).
   100  func (s *Sonarr) ManualImportReprocessContext(ctx context.Context, manualimport *ManualImportInput) error {
   101  	var output interface{}
   102  
   103  	var body bytes.Buffer
   104  	if err := json.NewEncoder(&body).Encode(manualimport); err != nil {
   105  		return fmt.Errorf("json.Marshal(%s): %w", bpManualImport, err)
   106  	}
   107  
   108  	req := starr.Request{URI: bpManualImport, Body: &body}
   109  	if err := s.PostInto(ctx, req, &output); err != nil {
   110  		return fmt.Errorf("api.Post(%s): %w", &req, err)
   111  	}
   112  
   113  	return nil
   114  }