diff --git a/manager/setup.go b/manager/setup.go index cc18faa..cfb1670 100644 --- a/manager/setup.go +++ b/manager/setup.go @@ -135,10 +135,11 @@ func (s *Sync) walletSetup() error { } else if claimAddress == nil { return errors.Err("could not get an address") } - if s.DbChannelData.PublishAddress == "" || !s.shouldTransfer() { - s.DbChannelData.PublishAddress = string(claimAddress.Items[0].Address) + if s.DbChannelData.PublishAddress.Address == "" || !s.shouldTransfer() { + s.DbChannelData.PublishAddress.Address = string(claimAddress.Items[0].Address) + s.DbChannelData.PublishAddress.IsMine = true } - if s.DbChannelData.PublishAddress == "" { + if s.DbChannelData.PublishAddress.Address == "" { return errors.Err("found blank claim address") } diff --git a/manager/transfer.go b/manager/transfer.go index fde2530..9bc592c 100644 --- a/manager/transfer.go +++ b/manager/transfer.go @@ -235,7 +235,7 @@ func transferVideos(s *Sync) error { streamUpdateOptions := jsonrpc.StreamUpdateOptions{ StreamCreateOptions: &jsonrpc.StreamCreateOptions{ ClaimCreateOptions: jsonrpc.ClaimCreateOptions{ - ClaimAddress: &s.DbChannelData.PublishAddress, + ClaimAddress: &s.DbChannelData.PublishAddress.Address, FundingAccountIDs: []string{ account, }, @@ -335,7 +335,7 @@ func transferChannel(s *Sync) error { Bid: util.PtrToString(fmt.Sprintf("%.6f", channelClaimAmount-0.005)), ChannelCreateOptions: jsonrpc.ChannelCreateOptions{ ClaimCreateOptions: jsonrpc.ClaimCreateOptions{ - ClaimAddress: &s.DbChannelData.PublishAddress, + ClaimAddress: &s.DbChannelData.PublishAddress.Address, }, }, } diff --git a/manager/ytsync.go b/manager/ytsync.go index b584cc0..206ceeb 100644 --- a/manager/ytsync.go +++ b/manager/ytsync.go @@ -260,7 +260,7 @@ func deleteSyncFolder(videoDirectory string) { } func (s *Sync) shouldTransfer() bool { - return s.DbChannelData.TransferState >= 1 && s.DbChannelData.PublishAddress != "" && !s.Manager.CliFlags.DisableTransfers && s.DbChannelData.TransferState != 3 + return s.DbChannelData.TransferState >= 1 && s.DbChannelData.PublishAddress.Address != "" && !s.Manager.CliFlags.DisableTransfers && s.DbChannelData.TransferState != 3 } func (s *Sync) setChannelTerminationStatus(e *error) { @@ -417,7 +417,8 @@ func (s *Sync) fixDupes(claims []jsonrpc.Claim) (bool, error) { claimToAbandon = cl videoIDs[videoID] = c } - if claimToAbandon.Address != s.DbChannelData.PublishAddress && !s.syncedVideos[videoID].Transferred { + //it's likely that all we need is s.DbChannelData.PublishAddress.IsMine but better be safe than sorry I guess + if (claimToAbandon.Address != s.DbChannelData.PublishAddress.Address || s.DbChannelData.PublishAddress.IsMine) && !s.syncedVideos[videoID].Transferred { log.Debugf("abandoning %+v", claimToAbandon) _, err := s.daemon.StreamAbandon(claimToAbandon.Txid, claimToAbandon.Nout, nil, true) if err != nil { @@ -425,7 +426,7 @@ func (s *Sync) fixDupes(claims []jsonrpc.Claim) (bool, error) { } abandonedClaims = true } else { - log.Debugf("lbrynet stream abandon --txid=%s --nout=%d", claimToAbandon.Txid, claimToAbandon.Nout) + log.Debugf("claim is not ours. Have the user run this: lbrynet stream abandon --txid=%s --nout=%d", claimToAbandon.Txid, claimToAbandon.Nout) } } return abandonedClaims, nil @@ -975,7 +976,7 @@ func (s *Sync) processVideo(v ytapi.Video) (err error) { return err } sp := sources.SyncParams{ - ClaimAddress: s.DbChannelData.PublishAddress, + ClaimAddress: s.DbChannelData.PublishAddress.Address, Amount: publishAmount, ChannelID: s.DbChannelData.ChannelClaimID, MaxVideoSize: s.DbChannelData.SizeLimit, diff --git a/namer/names.go b/namer/names.go index 413cd9f..5d214a9 100644 --- a/namer/names.go +++ b/namer/names.go @@ -10,7 +10,7 @@ import ( "sync" ) -var claimNameRegexp = regexp.MustCompile(`[=&#:$@%?;\\"/<>%{}|^~\x60[\]\s]`) +var claimNameRegexp = regexp.MustCompile(`[=&#:$@%??;、\\"/<>%{}||^~\x60[\]\s]`) type Namer struct { mu *sync.Mutex @@ -82,7 +82,7 @@ func getClaimNameFromTitle(title string, attempt int) string { tmpName := name + "-" + chunk if len(tmpName) > maxLen { if len(name) < 20 { - name = tmpName[:maxLen] + name = truncateUnicode(tmpName, maxLen-len(name)) } break } diff --git a/namer/names_test.go b/namer/names_test.go index d02f8e7..7db5bc8 100644 --- a/namer/names_test.go +++ b/namer/names_test.go @@ -12,15 +12,17 @@ func Test_getClaimNameFromTitle(t *testing.T) { name = getClaimNameFromTitle("SADB - \"A Weak Woman With a Strong Hood\"", 0) assert.Equal(t, "sadb-a-weak-woman-with-a-strong-hood", name) name = getClaimNameFromTitle("錢包整理術 5 Tips、哪種錢包最NG?|有錢人默默在做的「錢包整理術」 ft.@SHIN LI", 0) - assert.Equal(t, "錢包整理術-5-tips、哪種錢包最", name) + assert.Equal(t, "錢包整理術-5-tips-哪種錢包最ng", name) name = getClaimNameFromTitle("اسرع-طريقة-لتختيم", 0) assert.Equal(t, "اسرع-طريقة-لتختيم", name) name = getClaimNameFromTitle("شكرا على 380 مشترك😍😍😍😍 لي يريد دعم ادا وصلنا المقطع 40 لايك وراح ادعم قناتين", 0) - assert.Equal(t, "شكرا-على-380-مشترك😍😍\xf0\x9f", name) + assert.Equal(t, "شكرا-على-380-مشترك😍😍😍", name) name = getClaimNameFromTitle("test-@", 0) assert.Equal(t, "test", name) name = getClaimNameFromTitle("『あなたはただの空の殻でした』", 0) assert.Equal(t, "『あなたはただの空の殻でした』", name) + name = getClaimNameFromTitle("精靈樂章-這樣的夥伴沒問題嗎 幽暗隕石坑(夢魘) 王有無敵狀態...要會閃不然會被秒(無課)", 2) + assert.Equal(t, "精靈樂章-這樣的夥伴沒問題嗎-2", name) name = getClaimNameFromTitle("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 50) assert.Equal(t, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-50", name) } diff --git a/shared/shared.go b/shared/shared.go index 7cf3c63..d493056 100644 --- a/shared/shared.go +++ b/shared/shared.go @@ -1,10 +1,12 @@ package shared import ( + "encoding/json" "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/lbryio/lbry.go/v2/extras/errors" ) type Fee struct { @@ -13,19 +15,34 @@ type Fee struct { Currency string `json:"currency"` } type YoutubeChannel struct { - ChannelId string `json:"channel_id"` - TotalVideos uint `json:"total_videos"` - TotalSubscribers uint `json:"total_subscribers"` - 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"` - PublicKey string `json:"public_key"` - LengthLimit int `json:"length_limit"` - SizeLimit int `json:"size_limit"` - LastUploadedVideo string `json:"last_uploaded_video"` - WipeDB bool `json:"wipe_db"` + ChannelId string `json:"channel_id"` + TotalVideos uint `json:"total_videos"` + TotalSubscribers uint `json:"total_subscribers"` + DesiredChannelName string `json:"desired_channel_name"` + Fee *Fee `json:"fee"` + ChannelClaimID string `json:"channel_claim_id"` + TransferState int `json:"transfer_state"` + PublishAddress PublishAddress `json:"publish_address"` + PublicKey string `json:"public_key"` + LengthLimit int `json:"length_limit"` + SizeLimit int `json:"size_limit"` + LastUploadedVideo string `json:"last_uploaded_video"` + WipeDB bool `json:"wipe_db"` +} + +type PublishAddress struct { + Address string `json:"address"` + IsMine bool `json:"is_mine"` +} + +func (p *PublishAddress) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return errors.Err(err) + } + p.Address = s + p.IsMine = false + return nil } var NeverRetryFailures = []string{