diff --git a/e2e/data_setup.sh b/e2e/data_setup.sh index 2d46529..a1ad9a1 100755 --- a/e2e/data_setup.sh +++ b/e2e/data_setup.sh @@ -15,6 +15,9 @@ mysql -u lbry -plbry -D lbry -h "127.0.0.1" -P 15500 -e "$ASSIGNGROOP" #Add youtuber to sync ADDYTSYNCER='INSERT INTO user (given_name) VALUE("youtuber")' mysql -u lbry -plbry -D lbry -h "127.0.0.1" -P 15500 -e "$ADDYTSYNCER" +#Insert an auth token for the youtuber to be used by ytsync +ADDYTSYNCAUTHTOKEN='INSERT INTO auth_token (user_id, value) VALUE(2,"youtubertoken")' +mysql -u lbry -plbry -D lbry -h "127.0.0.1" -P 15500 -e "$ADDYTSYNCAUTHTOKEN" #Add their youtube channel to be synced ADDYTCHANNEL="INSERT INTO youtube_data (user_id, status_token,desired_lbry_channel,channel_id,channel_name,status,created_at,source,total_videos,total_subscribers) VALUE(2,'3qzGyuVjQaf7t4pKKu2Er1NRW2LJkeWw','@beamertest','UCCyr5j8akeu9j4Q7urV0Lqw','BeamerAtLBRY','queued','2019-08-01 00:00:00','sync',1,0)" diff --git a/e2e/e2e.sh b/e2e/e2e.sh index 027b5d0..96e738e 100755 --- a/e2e/e2e.sh +++ b/e2e/e2e.sh @@ -50,16 +50,25 @@ echo "successfully started..." #Data Setup for test ./data_setup.sh -# Execute the test! +# Execute the sync test! ./../bin/ytsync --channelID UCCyr5j8akeu9j4Q7urV0Lqw #Force channel intended...just in case. This channel lines up with the api container -# Assert the status status=$(mysql -u lbry -plbry -ss -D lbry -h "127.0.0.1" -P 15500 -e 'SELECT status FROM youtube_data WHERE id=1') videoStatus=$(mysql -u lbry -plbry -ss -D lbry -h "127.0.0.1" -P 15500 -e 'SELECT status FROM synced_video WHERE id=1') -if [[ $status != "synced" || $videoStatus != "published" ]]; then -docker-compose logs --tail="all" lbrycrd -docker-compose logs --tail="all" walletserver -docker-compose logs --tail="all" lbrynet -docker-compose logs --tail="all" internalapis +# Reset status for tranfer test +mysql -u lbry -plbry -ss -D lbry -h "127.0.0.1" -P 15500 -e "UPDATE youtube_data SET status = 'queued' WHERE id = 1" +# Trigger transfer api +echo "curl -i -H 'Accept: application/json' -H 'Content-Type: application/json' http://localhost:15400/yt/transfer?auth_token=youtubertoken&address=n1Ygra2pyD6cpESv9GtPM9kDkr4bPeu1Dc" +# Execute the transfer test! +./../bin/ytsync --channelID UCCyr5j8akeu9j4Q7urV0Lqw #Force channel intended...just in case. This channel lines up with the api container +transferStatus=$(mysql -u lbry -plbry -ss -D lbry -h "127.0.0.1" -P 15500 -e 'SELECT transferred FROM youtube_data WHERE id=1') +if [[ $status != "synced" || $videoStatus != "published" || transferStatus != "1" ]]; then +echo "Channel Status: $status" +echo "Video Status: $videoStatus" +echo "Transfer Status: $transferStatus" +#docker-compose logs --tail="all" lbrycrd +#docker-compose logs --tail="all" walletserver +#docker-compose logs --tail="all" lbrynet +#docker-compose logs --tail="all" internalapis echo "List local /var/tmp" find /var/tmp exit 1; fi; \ No newline at end of file diff --git a/e2e/lbrycrd/docker/build.sh b/e2e/lbrycrd/docker/build.sh index 0487e72..12ad558 100755 --- a/e2e/lbrycrd/docker/build.sh +++ b/e2e/lbrycrd/docker/build.sh @@ -4,5 +4,5 @@ if [ $# -eq 0 ] echo "No docker tag argument supplied. Use './build.sh '" exit 1 fi -docker build --tag lbry/lbrycrd:$1 . +docker build --build-arg VERSION=$1 --tag lbry/lbrycrd:$1 . docker push lbry/lbrycrd:$1 \ No newline at end of file diff --git a/manager/manager.go b/manager/manager.go index fb72f1d..6a31f08 100644 --- a/manager/manager.go +++ b/manager/manager.go @@ -147,6 +147,8 @@ func (s *SyncManager) Start() error { AwsS3Bucket: s.awsS3Bucket, namer: namer.NewNamer(), Fee: channels[0].Fee, + publishAddress: channels[0].PublishAddress, + transferState: channels[0].TransferState, } shouldInterruptLoop = true } else { @@ -189,6 +191,8 @@ func (s *SyncManager) Start() error { AwsS3Bucket: s.awsS3Bucket, namer: namer.NewNamer(), Fee: c.Fee, + publishAddress: c.PublishAddress, + transferState: c.TransferState, }) if q != StatusFailed { continue queues diff --git a/manager/setup.go b/manager/setup.go index a669c50..4672d90 100644 --- a/manager/setup.go +++ b/manager/setup.go @@ -125,6 +125,9 @@ func (s *Sync) walletSetup() error { if s.claimAddress == "" { return errors.Err("found blank claim address") } + if s.transferState > 0 && s.publishAddress != "" { + s.claimAddress = s.publishAddress + } err = s.ensureEnoughUTXOs() if err != nil { diff --git a/manager/transfer.go b/manager/transfer.go new file mode 100644 index 0000000..1174051 --- /dev/null +++ b/manager/transfer.go @@ -0,0 +1,41 @@ +package manager + +import ( + "github.com/lbryio/lbry.go/extras/errors" + "github.com/lbryio/lbry.go/extras/jsonrpc" + "github.com/lbryio/lbry.go/extras/util" +) + +func TransferChannel(channel *Sync) error { + //Transfer channel + for _, video := range channel.syncedVideos { + //Todo - Wait for prior sync to see that the publish is confirmed in lbrycrd? + //Todo - We need to fix the ClaimSearch call in lbry.go for 38.5 lbrynet + c, err := channel.daemon.ClaimSearch(nil, &video.ClaimID, nil, nil) + if err != nil { + errors.Err(err) + } + if len(c.Claims) == 0 { + errors.Err("cannot transfer: no claim found for this video") + } else if len(c.Claims) > 1 { + errors.Err("cannot transfer: too many claims. claimID: %s", video.ClaimID) + } + + streamUpdateOptions := jsonrpc.StreamUpdateOptions{ + StreamCreateOptions: &jsonrpc.StreamCreateOptions{ + ClaimCreateOptions: jsonrpc.ClaimCreateOptions{ClaimAddress: &channel.publishAddress}, + }, + Bid: util.PtrToString("0.009"), // Todo - Dont hardcode + } + + _, err = channel.daemon.StreamUpdate(video.ClaimID, streamUpdateOptions) + if err != nil { + return err + } + // Todo - Post to remote db that video is transferred + } + + // Todo - Transfer Channel as last step and post back to remote db that channel is transferred. + + return nil +} diff --git a/manager/ytsync.go b/manager/ytsync.go index 39a93d8..2d1db77 100644 --- a/manager/ytsync.go +++ b/manager/ytsync.go @@ -88,6 +88,8 @@ type Sync struct { namer *namer.Namer walletMux *sync.RWMutex queue chan video + transferState int + publishAddress string } func (s *Sync) AppendSyncedVideo(videoID string, published bool, failureReason string, claimName string, claimID string, metadataVersion int8, size int64) { @@ -308,7 +310,16 @@ func (s *Sync) FullCycle() (e error) { return err } - return s.doSync() + err = s.doSync() + if err != nil { + return err + } + + if s.transferState == 1 && s.publishAddress != "" { // Channel needs transfer + return TransferChannel(s) + } + + return nil } func deleteSyncFolder(videoDirectory string) { diff --git a/sdk/api.go b/sdk/api.go index 952200b..e683201 100644 --- a/sdk/api.go +++ b/sdk/api.go @@ -45,6 +45,8 @@ type YoutubeChannel struct { DesiredChannelName string `json:"desired_channel_name"` Fee *Fee `json:"fee"` ChannelClaimID string `json:"channel_claim_id"` + TransferState int `json:"transfer_state"` + PublishAddress string `json:"publish_address"` } func (a *APIConfig) FetchChannels(status string, cp *SyncProperties) ([]YoutubeChannel, error) {