Skip to content

Commit 9d23c8d

Browse files
committed
add bilibili user surpport
1 parent 0dfc8f1 commit 9d23c8d

File tree

10 files changed

+262
-17
lines changed

10 files changed

+262
-17
lines changed

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM golang:1.20 as builder
1+
FROM golang:1.22 as builder
22

33
ENV TAG="nightly"
44
ENV COMMIT=""

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
BINPATH := $(abspath ./bin)
22

33
.PHONY: all
4-
all: build test
4+
all: build #test
55

66
#
77
# Build Podsync CLI binary

go.mod

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
module github.com/mxpv/podsync
22

3-
go 1.21
3+
go 1.22
44

55
require (
66
github.com/BrianHicks/finch v0.0.0-20140409222414-419bd73c29ec
77
github.com/aws/aws-sdk-go v1.44.144
88
github.com/dgraph-io/badger v1.6.2
99
github.com/eduncan911/podcast v1.4.2
1010
github.com/gilliek/go-opml v1.0.0
11+
github.com/go-resty/resty/v2 v2.16.2 // indirect
1112
github.com/golang/mock v1.6.0
1213
github.com/hashicorp/go-multierror v1.1.1
1314
github.com/jessevdk/go-flags v1.6.1
@@ -19,13 +20,16 @@ require (
1920
github.com/stretchr/testify v1.9.0
2021
github.com/zackradisic/soundcloud-api v0.1.8
2122
golang.org/x/oauth2 v0.23.0
22-
golang.org/x/sync v0.7.0
23+
golang.org/x/sync v0.10.0
2324
google.golang.org/api v0.0.0-20180718221112-efcb5f25ac56
2425
gopkg.in/natefinch/lumberjack.v2 v2.2.1
2526
)
2627

28+
require github.com/CuteReimu/bilibili/v2 v2.0.0-20250103120454-5e8ece713d77
29+
2730
require (
2831
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect
32+
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f // indirect
2933
github.com/cespare/xxhash v1.1.0 // indirect
3034
github.com/davecgh/go-spew v1.1.1 // indirect
3135
github.com/dgraph-io/ristretto v0.0.2 // indirect
@@ -34,9 +38,13 @@ require (
3438
github.com/grafov/m3u8 v0.11.1 // indirect
3539
github.com/hashicorp/errwrap v1.0.0 // indirect
3640
github.com/jmespath/go-jmespath v0.4.0 // indirect
41+
github.com/mattn/go-colorable v0.1.13 // indirect
42+
github.com/mattn/go-isatty v0.0.20 // indirect
3743
github.com/pmezard/go-difflib v1.0.0 // indirect
38-
golang.org/x/net v0.23.0 // indirect
39-
golang.org/x/sys v0.21.0 // indirect
44+
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect
45+
github.com/spf13/cast v1.7.1 // indirect
46+
golang.org/x/net v0.33.0 // indirect
47+
golang.org/x/sys v0.28.0 // indirect
4048
google.golang.org/protobuf v1.33.0 // indirect
4149
gopkg.in/yaml.v3 v3.0.1 // indirect
42-
)
50+
)

go.sum

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M=
22
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
3+
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f h1:2dk3eOnYllh+wUOuDhOoC2vUVoJF/5z478ryJ+wzEII=
4+
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f/go.mod h1:4a58ifQTEe2uwwsaqbh3i2un5/CBPg+At/qHpt18Tmk=
35
github.com/BrianHicks/finch v0.0.0-20140409222414-419bd73c29ec h1:1VPruZMM1WQC7POhjxbZOWK564cuFz1hlpwYW6ocM4E=
46
github.com/BrianHicks/finch v0.0.0-20140409222414-419bd73c29ec/go.mod h1:+hWo/MWgY8VtjZvdrYM2nPRMaK40zX2iPsH/qD0+Xs0=
57
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
8+
github.com/CuteReimu/bilibili/v2 v2.0.0-20250103120454-5e8ece713d77 h1:STWyuKTWvAjOT/iqvkmpisPSzXJdqlg+4NzUYdf/UZE=
9+
github.com/CuteReimu/bilibili/v2 v2.0.0-20250103120454-5e8ece713d77/go.mod h1:g5XYIOZ8NTGRQNDT2dNRVzSqng4xRZbqurkA0SJbDi8=
610
github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
711
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
812
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
@@ -27,9 +31,13 @@ github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4
2731
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
2832
github.com/eduncan911/podcast v1.4.2 h1:S+fsUlbR2ULFou2Mc52G/MZI8JVJHedbxLQnoA+MY/w=
2933
github.com/eduncan911/podcast v1.4.2/go.mod h1:mSxiK1z5KeNO0YFaQ3ElJlUZbbDV9dA7R9c1coeeXkc=
34+
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
35+
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
3036
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
3137
github.com/gilliek/go-opml v1.0.0 h1:X8xVjtySRXU/x6KvaiXkn7OV3a4DHqxY8Rpv6U/JvCY=
3238
github.com/gilliek/go-opml v1.0.0/go.mod h1:fOxmtlzyBvUjU6bjpdjyxCGlWz+pgtAHrHf/xRZl3lk=
39+
github.com/go-resty/resty/v2 v2.16.2 h1:CpRqTjIzq/rweXUt9+GxzzQdlkqMdt8Lm/fuK/CAbAg=
40+
github.com/go-resty/resty/v2 v2.16.2/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU=
3341
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
3442
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
3543
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -53,12 +61,19 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y
5361
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
5462
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
5563
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
56-
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
5764
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
65+
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
66+
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
5867
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
59-
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
6068
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
69+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
70+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
6171
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
72+
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
73+
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
74+
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
75+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
76+
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
6277
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
6378
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
6479
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
@@ -71,16 +86,22 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
7186
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
7287
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
7388
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
89+
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
90+
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
7491
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
7592
github.com/silentsokolov/go-vimeo v0.0.0-20190116124215-06829264260c h1:KhHx/Ta3c9C1gcSo5UhDeo/D4JnhnxJTrlcOEOFiMfY=
7693
github.com/silentsokolov/go-vimeo v0.0.0-20190116124215-06829264260c/go.mod h1:10FeaKUMy5t3KLsYfy54dFrq0rpwcfyKkKcF7vRGIRY=
7794
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
7895
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
96+
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=
97+
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
7998
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
8099
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
81100
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
82101
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
83102
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
103+
github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
104+
github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
84105
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
85106
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
86107
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
@@ -109,15 +130,15 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
109130
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
110131
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
111132
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
112-
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
113-
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
133+
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
134+
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
114135
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
115136
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
116137
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
117138
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
118139
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
119-
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
120-
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
140+
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
141+
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
121142
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
122143
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
123144
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -129,18 +150,22 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
129150
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
130151
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
131152
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
153+
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
132154
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
133-
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
134-
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
155+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
156+
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
157+
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
135158
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
136159
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
137160
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
138161
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
139162
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
140163
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
141164
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
142-
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
143-
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
165+
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
166+
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
167+
golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
168+
golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
144169
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
145170
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
146171
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=

pkg/builder/bilibili.go

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package builder
2+
3+
import (
4+
"context"
5+
6+
"strconv"
7+
"time"
8+
9+
"github.com/CuteReimu/bilibili/v2"
10+
"github.com/mxpv/podsync/pkg/feed"
11+
"github.com/pkg/errors"
12+
13+
"github.com/mxpv/podsync/pkg/model"
14+
)
15+
16+
type BilibiliBuilder struct {
17+
client *bilibili.Client
18+
}
19+
20+
func (b *BilibiliBuilder) queryFeed(feed *model.Feed, info *model.Info) error {
21+
22+
switch info.LinkType {
23+
case model.TypeChannel:
24+
//TODO channel surpport
25+
return errors.New("Bilibili channel not supported.")
26+
case model.TypeUser:
27+
// query user info
28+
mid, err := strconv.Atoi(info.ItemID)
29+
if err != nil {
30+
return err
31+
}
32+
userCardParam := bilibili.GetUserCardParam{Mid: mid, Photo: false}
33+
userCard, err := b.client.GetUserCard(userCardParam)
34+
if err != nil {
35+
return err
36+
}
37+
38+
feed.Author = userCard.Card.Name
39+
feed.CoverArt = userCard.Card.Face
40+
feed.Title = userCard.Card.Name
41+
feed.Description = userCard.Card.Sign
42+
43+
// query video collection
44+
videoParam := bilibili.GetVideoByKeywordsParam{Mid: mid, Keywords: "", Pn: feed.PageSize}
45+
videoCollection, err := b.client.GetVideoByKeywords(videoParam)
46+
if err != nil {
47+
return err
48+
}
49+
50+
feed.PubDate = time.Unix(int64(videoCollection.Archives[0].Pubdate), 0)
51+
52+
for _, videoInfo := range videoCollection.Archives {
53+
bvid := videoInfo.Bvid
54+
desc, err := b.client.GetVideoDesc(bilibili.VideoParam{Bvid: bvid})
55+
if err == nil {
56+
e := model.Episode{
57+
ID: videoInfo.Bvid,
58+
Title: videoInfo.Title,
59+
Description: desc,
60+
Duration: int64(videoInfo.Duration),
61+
Size: int64(videoInfo.Duration * 15000), // very rough estimate
62+
VideoURL: "https://www.bilibili.com/" + videoInfo.Bvid,
63+
PubDate: time.Unix(int64(videoInfo.Pubdate), 0),
64+
Thumbnail: videoInfo.Pic,
65+
Status: model.EpisodeNew,
66+
}
67+
feed.Episodes = append(feed.Episodes, &e)
68+
}
69+
}
70+
71+
return nil
72+
default:
73+
return errors.New("unsupported link format")
74+
}
75+
}
76+
77+
func (b *BilibiliBuilder) Build(ctx context.Context, cfg *feed.Config) (*model.Feed, error) {
78+
info, err := ParseURL(cfg.URL)
79+
if err != nil {
80+
return nil, err
81+
}
82+
83+
_feed := &model.Feed{
84+
ItemID: info.ItemID,
85+
Provider: info.Provider,
86+
LinkType: info.LinkType,
87+
Format: cfg.Format,
88+
Quality: cfg.Quality,
89+
CoverArtQuality: cfg.Custom.CoverArtQuality,
90+
PageSize: cfg.PageSize,
91+
PlaylistSort: cfg.PlaylistSort,
92+
PrivateFeed: cfg.PrivateFeed,
93+
UpdatedAt: time.Now().UTC(),
94+
ItemURL: cfg.URL,
95+
}
96+
97+
// Query general information about feed (title, description, lang, etc)
98+
if err := b.queryFeed(_feed, &info); err != nil {
99+
return nil, err
100+
}
101+
102+
return _feed, nil
103+
}
104+
105+
func NewBilibiliBuilder() (*BilibiliBuilder, error) {
106+
sc := bilibili.New()
107+
108+
return &BilibiliBuilder{client: sc}, nil
109+
}

pkg/builder/bilibili_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package builder
2+
3+
import (
4+
"testing"
5+
6+
"github.com/mxpv/podsync/pkg/feed"
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
func TestBilibili_BuildFeed(t *testing.T) {
12+
builder, err := NewBilibiliBuilder()
13+
require.NoError(t, err)
14+
15+
urls := []string{
16+
"https://space.bilibili.com/1302298364",
17+
"https://space.bilibili.com/397490386/channel/seriesdetail?sid=1203833",
18+
}
19+
20+
t.Run(urls[0], func(t *testing.T) {
21+
feed, err := builder.Build(testCtx, &feed.Config{URL: urls[0]})
22+
require.NoError(t, err)
23+
24+
assert.NotEmpty(t, feed.Title)
25+
assert.NotEmpty(t, feed.Description)
26+
assert.NotEmpty(t, feed.Author)
27+
assert.NotEmpty(t, feed.ItemURL)
28+
29+
assert.NotZero(t, len(feed.Episodes))
30+
31+
for _, item := range feed.Episodes {
32+
assert.NotEmpty(t, item.Title)
33+
assert.NotEmpty(t, item.VideoURL)
34+
assert.NotZero(t, item.Duration)
35+
assert.NotEmpty(t, item.Title)
36+
assert.NotEmpty(t, item.Thumbnail)
37+
}
38+
})
39+
40+
t.Run(urls[1], func(t *testing.T) {
41+
_, err := builder.Build(testCtx, &feed.Config{URL: urls[1]})
42+
require.Error(t, err, "Bilibili channel not supported.")
43+
44+
})
45+
46+
}

pkg/builder/builder.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ func New(ctx context.Context, provider model.Provider, key string) (Builder, err
2121
return NewVimeoBuilder(ctx, key)
2222
case model.ProviderSoundcloud:
2323
return NewSoundcloudBuilder()
24+
case model.ProviderBilibili:
25+
return NewBilibiliBuilder()
2426
default:
2527
return nil, errors.Errorf("unsupported provider %q", provider)
2628
}

0 commit comments

Comments
 (0)