2018-10-08 22:19:17 +02:00
package main
import (
"fmt"
"math/rand"
2020-05-19 23:13:01 +02:00
"net/http"
2018-10-08 22:19:17 +02:00
"os"
"time"
2019-10-10 16:50:33 +02:00
"github.com/lbryio/lbry.go/v2/extras/errors"
"github.com/lbryio/lbry.go/v2/extras/util"
2020-06-11 18:45:56 +02:00
"github.com/lbryio/ytsync/v5/manager"
"github.com/lbryio/ytsync/v5/sdk"
ytUtils "github.com/lbryio/ytsync/v5/util"
2020-05-19 23:13:01 +02:00
"github.com/prometheus/client_golang/prometheus/promhttp"
2019-08-13 05:20:09 +02:00
2019-07-15 22:16:02 +02:00
log "github.com/sirupsen/logrus"
2018-10-08 22:19:17 +02:00
"github.com/spf13/cobra"
)
var Version string
const defaultMaxTries = 3
var (
2019-08-30 21:08:28 +02:00
flags sdk . SyncFlags
maxTries int
refill int
limit int
syncStatus string
channelID string
syncFrom int64
syncUntil int64
concurrentJobs int
videosLimit int
maxVideoSize int
maxVideoLength float64
2018-10-08 22:19:17 +02:00
)
func main ( ) {
rand . Seed ( time . Now ( ) . UnixNano ( ) )
log . SetLevel ( log . DebugLevel )
2020-05-19 23:13:01 +02:00
http . Handle ( "/metrics" , promhttp . Handler ( ) )
go func ( ) {
log . Error ( http . ListenAndServe ( ":2112" , nil ) )
} ( )
2018-10-08 22:19:17 +02:00
cmd := & cobra . Command {
Use : "ytsync" ,
Short : "Publish youtube channels into LBRY network automatically." ,
Run : ytSync ,
Args : cobra . RangeArgs ( 0 , 0 ) ,
}
2019-08-30 21:08:28 +02:00
cmd . Flags ( ) . BoolVar ( & flags . StopOnError , "stop-on-error" , false , "If a publish fails, stop all publishing and exit" )
2018-10-08 22:19:17 +02:00
cmd . Flags ( ) . IntVar ( & maxTries , "max-tries" , defaultMaxTries , "Number of times to try a publish that fails" )
2019-08-30 21:08:28 +02:00
cmd . Flags ( ) . BoolVar ( & flags . TakeOverExistingChannel , "takeover-existing-channel" , false , "If channel exists and we don't own it, take over the channel" )
2018-10-08 22:19:17 +02:00
cmd . Flags ( ) . IntVar ( & limit , "limit" , 0 , "limit the amount of channels to sync" )
2019-08-30 21:08:28 +02:00
cmd . Flags ( ) . BoolVar ( & flags . SkipSpaceCheck , "skip-space-check" , false , "Do not perform free space check on startup" )
cmd . Flags ( ) . BoolVar ( & flags . SyncUpdate , "update" , false , "Update previously synced channels instead of syncing new ones" )
cmd . Flags ( ) . BoolVar ( & flags . SingleRun , "run-once" , false , "Whether the process should be stopped after one cycle or not" )
cmd . Flags ( ) . BoolVar ( & flags . RemoveDBUnpublished , "remove-db-unpublished" , false , "Remove videos from the database that are marked as published but aren't really published" )
cmd . Flags ( ) . BoolVar ( & flags . UpgradeMetadata , "upgrade-metadata" , false , "Upgrade videos if they're on the old metadata version" )
cmd . Flags ( ) . BoolVar ( & flags . DisableTransfers , "no-transfers" , false , "Skips the transferring process of videos, channels and supports" )
2019-12-27 18:12:41 +01:00
cmd . Flags ( ) . BoolVar ( & flags . QuickSync , "quick" , false , "Look up only the last 50 videos from youtube" )
2018-10-08 22:19:17 +02:00
cmd . Flags ( ) . StringVar ( & syncStatus , "status" , "" , "Specify which queue to pull from. Overrides --update" )
cmd . Flags ( ) . StringVar ( & channelID , "channelID" , "" , "If specified, only this channel will be synced." )
cmd . Flags ( ) . Int64Var ( & syncFrom , "after" , time . Unix ( 0 , 0 ) . Unix ( ) , "Specify from when to pull jobs [Unix time](Default: 0)" )
2018-10-11 23:21:05 +02:00
cmd . Flags ( ) . Int64Var ( & syncUntil , "before" , time . Now ( ) . AddDate ( 1 , 0 , 0 ) . Unix ( ) , "Specify until when to pull jobs [Unix time](Default: current Unix time)" )
2018-10-08 22:19:17 +02:00
cmd . Flags ( ) . IntVar ( & concurrentJobs , "concurrent-jobs" , 1 , "how many jobs to process concurrently" )
cmd . Flags ( ) . IntVar ( & videosLimit , "videos-limit" , 1000 , "how many videos to process per channel" )
cmd . Flags ( ) . IntVar ( & maxVideoSize , "max-size" , 2048 , "Maximum video size to process (in MB)" )
2019-01-03 19:55:27 +01:00
cmd . Flags ( ) . Float64Var ( & maxVideoLength , "max-length" , 2.0 , "Maximum video length to process (in hours)" )
2018-10-08 22:19:17 +02:00
if err := cmd . Execute ( ) ; err != nil {
fmt . Println ( err )
os . Exit ( 1 )
}
}
func ytSync ( cmd * cobra . Command , args [ ] string ) {
var hostname string
slackToken := os . Getenv ( "SLACK_TOKEN" )
if slackToken == "" {
log . Error ( "A slack token was not present in env vars! Slack messages disabled!" )
} else {
var err error
hostname , err = os . Hostname ( )
if err != nil {
log . Error ( "could not detect system hostname" )
hostname = "ytsync-unknown"
}
2019-08-04 00:34:48 +02:00
if len ( hostname ) > 30 {
hostname = hostname [ 0 : 30 ]
}
2018-10-08 22:19:17 +02:00
util . InitSlack ( os . Getenv ( "SLACK_TOKEN" ) , os . Getenv ( "SLACK_CHANNEL" ) , hostname )
}
2019-01-11 03:02:26 +01:00
if syncStatus != "" && ! util . InSlice ( syncStatus , manager . SyncStatuses ) {
log . Errorf ( "status must be one of the following: %v\n" , manager . SyncStatuses )
2018-10-08 22:19:17 +02:00
return
}
2019-08-30 21:08:28 +02:00
if flags . StopOnError && maxTries != defaultMaxTries {
2018-10-08 22:19:17 +02:00
log . Errorln ( "--stop-on-error and --max-tries are mutually exclusive" )
return
}
if maxTries < 1 {
log . Errorln ( "setting --max-tries less than 1 doesn't make sense" )
return
}
if limit < 0 {
log . Errorln ( "setting --limit less than 0 (unlimited) doesn't make sense" )
return
}
2019-02-22 19:33:00 +01:00
apiURL := os . Getenv ( "LBRY_WEB_API" )
2018-10-08 22:19:17 +02:00
apiToken := os . Getenv ( "LBRY_API_TOKEN" )
youtubeAPIKey := os . Getenv ( "YOUTUBE_API_KEY" )
lbrycrdString := os . Getenv ( "LBRYCRD_STRING" )
awsS3ID := os . Getenv ( "AWS_S3_ID" )
awsS3Secret := os . Getenv ( "AWS_S3_SECRET" )
awsS3Region := os . Getenv ( "AWS_S3_REGION" )
awsS3Bucket := os . Getenv ( "AWS_S3_BUCKET" )
if apiURL == "" {
2019-04-19 03:22:51 +02:00
log . Errorln ( "An API URL was not defined. Please set the environment variable LBRY_WEB_API" )
2018-10-08 22:19:17 +02:00
return
}
if apiToken == "" {
log . Errorln ( "An API Token was not defined. Please set the environment variable LBRY_API_TOKEN" )
return
}
if youtubeAPIKey == "" {
log . Errorln ( "A Youtube API key was not defined. Please set the environment variable YOUTUBE_API_KEY" )
return
}
if awsS3ID == "" {
log . Errorln ( "AWS S3 ID credentials were not defined. Please set the environment variable AWS_S3_ID" )
return
}
if awsS3Secret == "" {
log . Errorln ( "AWS S3 Secret credentials were not defined. Please set the environment variable AWS_S3_SECRET" )
return
}
if awsS3Region == "" {
log . Errorln ( "AWS S3 Region was not defined. Please set the environment variable AWS_S3_REGION" )
return
}
if awsS3Bucket == "" {
log . Errorln ( "AWS S3 Bucket was not defined. Please set the environment variable AWS_S3_BUCKET" )
return
}
if lbrycrdString == "" {
log . Infoln ( "Using default (local) lbrycrd instance. Set LBRYCRD_STRING if you want to use something else" )
}
2019-07-31 05:32:02 +02:00
blobsDir := ytUtils . GetBlobsDir ( )
2018-10-08 22:19:17 +02:00
syncProperties := & sdk . SyncProperties {
SyncFrom : syncFrom ,
SyncUntil : syncUntil ,
YoutubeChannelID : channelID ,
}
apiConfig := & sdk . APIConfig {
YoutubeAPIKey : youtubeAPIKey ,
ApiURL : apiURL ,
ApiToken : apiToken ,
HostName : hostname ,
}
2019-01-11 03:02:26 +01:00
sm := manager . NewSyncManager (
2019-08-30 21:08:28 +02:00
flags ,
2018-10-08 22:19:17 +02:00
maxTries ,
refill ,
limit ,
concurrentJobs ,
concurrentJobs ,
blobsDir ,
videosLimit ,
maxVideoSize ,
lbrycrdString ,
awsS3ID ,
awsS3Secret ,
awsS3Region ,
awsS3Bucket ,
syncStatus ,
syncProperties ,
apiConfig ,
2019-01-03 19:55:27 +01:00
maxVideoLength ,
2018-10-08 22:19:17 +02:00
)
err := sm . Start ( )
if err != nil {
2019-08-04 00:34:48 +02:00
ytUtils . SendErrorToSlack ( errors . FullTrace ( err ) )
2018-10-08 22:19:17 +02:00
}
2019-07-31 05:32:02 +02:00
ytUtils . SendInfoToSlack ( "Syncing process terminated!" )
2018-10-08 22:19:17 +02:00
}