diff --git a/lyrics.go b/lyrics.go index db781e8..22479a0 100644 --- a/lyrics.go +++ b/lyrics.go @@ -22,12 +22,12 @@ func GetHttpClient() *http.Client { } type LyricResponse struct { - Errors []interface{} `json:"errors"` - Data []struct { - Attributes struct { - TtmlLocalizations string `json:"ttmlLocalizations"` - } `json:"attributes"` - } `json:"data"` + Errors []interface{} `json:"errors"` + Data []struct { + Attributes struct { + TtmlLocalizations string `json:"ttmlLocalizations"` + } `json:"attributes"` + } `json:"data"` } func GetLyrics(adamID string, region string, language string, token string, musicToken string) (string, error) { diff --git a/main.go b/main.go index db378fa..a15063a 100644 --- a/main.go +++ b/main.go @@ -492,6 +492,49 @@ func (s *server) License(c context.Context, req *pb.LicenseRequest) (*pb.License }, nil } +func (s *server) Tokens(c context.Context, req *pb.TokensRequest) (*pb.TokensReply, error) { + p, ok := peer.FromContext(c) + if ok { + log.Infof("tokens request from %s", p.Addr.String()) + } else { + log.Infof("tokens request from unknown peer") + } + instanceID, err := SelectMVInstance(req.Data.AdamId) + if err != nil { + return &pb.TokensReply{ + Header: &pb.ReplyHeader{Code: -1, Msg: err.Error()}, + Data: nil, + }, nil + } + if instanceID == "" { + return &pb.TokensReply{ + Header: &pb.ReplyHeader{Code: -1, Msg: "no available instance"}, + Data: nil, + }, nil + } + bearer, err := GetToken() + if err != nil { + return &pb.TokensReply{ + Header: &pb.ReplyHeader{Code: -1, Msg: err.Error()}, + Data: nil, + }, nil + } + musicToken, err := GetMusicToken(GetInstance(instanceID)) + if err != nil { + return &pb.TokensReply{ + Header: &pb.ReplyHeader{Code: -1, Msg: err.Error()}, + Data: nil, + }, nil + } + return &pb.TokensReply{ + Header: &pb.ReplyHeader{Code: 0, Msg: "SUCCESS"}, + Data: &pb.TokensDataResponse{ + BearerToken: bearer, + MusicUserToken: musicToken, + }, + }, nil +} + func newServer() *server { s := &server{} return s diff --git a/proto/manager.pb.go b/proto/manager.pb.go index 964a617..749e391 100644 --- a/proto/manager.pb.go +++ b/proto/manager.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.6 -// protoc v5.29.0--dev +// protoc-gen-go v1.36.11 +// protoc v7.34.1 // source: proto/manager.proto package proto @@ -1463,6 +1463,198 @@ func (x *WebPlaybackDataResponse) GetM3U8() string { return "" } +type TokensRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Data *TokensDataRequest `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TokensRequest) Reset() { + *x = TokensRequest{} + mi := &file_proto_manager_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TokensRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TokensRequest) ProtoMessage() {} + +func (x *TokensRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_manager_proto_msgTypes[28] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TokensRequest.ProtoReflect.Descriptor instead. +func (*TokensRequest) Descriptor() ([]byte, []int) { + return file_proto_manager_proto_rawDescGZIP(), []int{28} +} + +func (x *TokensRequest) GetData() *TokensDataRequest { + if x != nil { + return x.Data + } + return nil +} + +type TokensDataRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + AdamId string `protobuf:"bytes,1,opt,name=adam_id,json=adamId,proto3" json:"adam_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TokensDataRequest) Reset() { + *x = TokensDataRequest{} + mi := &file_proto_manager_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TokensDataRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TokensDataRequest) ProtoMessage() {} + +func (x *TokensDataRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_manager_proto_msgTypes[29] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TokensDataRequest.ProtoReflect.Descriptor instead. +func (*TokensDataRequest) Descriptor() ([]byte, []int) { + return file_proto_manager_proto_rawDescGZIP(), []int{29} +} + +func (x *TokensDataRequest) GetAdamId() string { + if x != nil { + return x.AdamId + } + return "" +} + +type TokensReply struct { + state protoimpl.MessageState `protogen:"open.v1"` + Header *ReplyHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` + Data *TokensDataResponse `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TokensReply) Reset() { + *x = TokensReply{} + mi := &file_proto_manager_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TokensReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TokensReply) ProtoMessage() {} + +func (x *TokensReply) ProtoReflect() protoreflect.Message { + mi := &file_proto_manager_proto_msgTypes[30] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TokensReply.ProtoReflect.Descriptor instead. +func (*TokensReply) Descriptor() ([]byte, []int) { + return file_proto_manager_proto_rawDescGZIP(), []int{30} +} + +func (x *TokensReply) GetHeader() *ReplyHeader { + if x != nil { + return x.Header + } + return nil +} + +func (x *TokensReply) GetData() *TokensDataResponse { + if x != nil { + return x.Data + } + return nil +} + +type TokensDataResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + BearerToken string `protobuf:"bytes,1,opt,name=bearer_token,json=bearerToken,proto3" json:"bearer_token,omitempty"` + MusicUserToken string `protobuf:"bytes,2,opt,name=music_user_token,json=musicUserToken,proto3" json:"music_user_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TokensDataResponse) Reset() { + *x = TokensDataResponse{} + mi := &file_proto_manager_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TokensDataResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TokensDataResponse) ProtoMessage() {} + +func (x *TokensDataResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_manager_proto_msgTypes[31] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TokensDataResponse.ProtoReflect.Descriptor instead. +func (*TokensDataResponse) Descriptor() ([]byte, []int) { + return file_proto_manager_proto_rawDescGZIP(), []int{31} +} + +func (x *TokensDataResponse) GetBearerToken() string { + if x != nil { + return x.BearerToken + } + return "" +} + +func (x *TokensDataResponse) GetMusicUserToken() string { + if x != nil { + return x.MusicUserToken + } + return "" +} + type ErrorReply struct { state protoimpl.MessageState `protogen:"open.v1"` Header *ReplyHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` @@ -1472,7 +1664,7 @@ type ErrorReply struct { func (x *ErrorReply) Reset() { *x = ErrorReply{} - mi := &file_proto_manager_proto_msgTypes[28] + mi := &file_proto_manager_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1484,7 +1676,7 @@ func (x *ErrorReply) String() string { func (*ErrorReply) ProtoMessage() {} func (x *ErrorReply) ProtoReflect() protoreflect.Message { - mi := &file_proto_manager_proto_msgTypes[28] + mi := &file_proto_manager_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1497,7 +1689,7 @@ func (x *ErrorReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ErrorReply.ProtoReflect.Descriptor instead. func (*ErrorReply) Descriptor() ([]byte, []int) { - return file_proto_manager_proto_rawDescGZIP(), []int{28} + return file_proto_manager_proto_rawDescGZIP(), []int{32} } func (x *ErrorReply) GetHeader() *ReplyHeader { @@ -1597,10 +1789,20 @@ const file_proto_manager_proto_rawDesc = "" + "\x04data\x18\x02 \x01(\v2#.manager.v1.WebPlaybackDataResponseR\x04data\"F\n" + "\x17WebPlaybackDataResponse\x12\x17\n" + "\aadam_id\x18\x01 \x01(\tR\x06adamId\x12\x12\n" + - "\x04m3u8\x18\x02 \x01(\tR\x04m3u8\"=\n" + + "\x04m3u8\x18\x02 \x01(\tR\x04m3u8\"B\n" + + "\rTokensRequest\x121\n" + + "\x04data\x18\x01 \x01(\v2\x1d.manager.v1.TokensDataRequestR\x04data\",\n" + + "\x11TokensDataRequest\x12\x17\n" + + "\aadam_id\x18\x01 \x01(\tR\x06adamId\"r\n" + + "\vTokensReply\x12/\n" + + "\x06header\x18\x01 \x01(\v2\x17.manager.v1.ReplyHeaderR\x06header\x122\n" + + "\x04data\x18\x02 \x01(\v2\x1e.manager.v1.TokensDataResponseR\x04data\"a\n" + + "\x12TokensDataResponse\x12!\n" + + "\fbearer_token\x18\x01 \x01(\tR\vbearerToken\x12(\n" + + "\x10music_user_token\x18\x02 \x01(\tR\x0emusicUserToken\"=\n" + "\n" + "ErrorReply\x12/\n" + - "\x06header\x18\x01 \x01(\v2\x17.manager.v1.ReplyHeaderR\x06header2\x98\x04\n" + + "\x06header\x18\x01 \x01(\v2\x17.manager.v1.ReplyHeaderR\x06header2\xd6\x04\n" + "\x15WrapperManagerService\x129\n" + "\x06Status\x12\x16.google.protobuf.Empty\x1a\x17.manager.v1.StatusReply\x12=\n" + "\x05Login\x12\x18.manager.v1.LoginRequest\x1a\x16.manager.v1.LoginReply(\x010\x01\x12<\n" + @@ -1609,7 +1811,8 @@ const file_proto_manager_proto_rawDesc = "" + "\x04M3U8\x12\x17.manager.v1.M3U8Request\x1a\x15.manager.v1.M3U8Reply\x12<\n" + "\x06Lyrics\x12\x19.manager.v1.LyricsRequest\x1a\x17.manager.v1.LyricsReply\x12?\n" + "\aLicense\x12\x1a.manager.v1.LicenseRequest\x1a\x18.manager.v1.LicenseReply\x12K\n" + - "\vWebPlayback\x12\x1e.manager.v1.WebPlaybackRequest\x1a\x1c.manager.v1.WebPlaybackReplyB\x1dZ\x1bwrapper-manager/proto;protob\x06proto3" + "\vWebPlayback\x12\x1e.manager.v1.WebPlaybackRequest\x1a\x1c.manager.v1.WebPlaybackReply\x12<\n" + + "\x06Tokens\x12\x19.manager.v1.TokensRequest\x1a\x17.manager.v1.TokensReplyB\x1dZ\x1bwrapper-manager/proto;protob\x06proto3" var ( file_proto_manager_proto_rawDescOnce sync.Once @@ -1623,7 +1826,7 @@ func file_proto_manager_proto_rawDescGZIP() []byte { return file_proto_manager_proto_rawDescData } -var file_proto_manager_proto_msgTypes = make([]protoimpl.MessageInfo, 29) +var file_proto_manager_proto_msgTypes = make([]protoimpl.MessageInfo, 33) var file_proto_manager_proto_goTypes = []any{ (*ReplyHeader)(nil), // 0: manager.v1.ReplyHeader (*StatusReply)(nil), // 1: manager.v1.StatusReply @@ -1653,8 +1856,12 @@ var file_proto_manager_proto_goTypes = []any{ (*WebPlaybackDataRequest)(nil), // 25: manager.v1.WebPlaybackDataRequest (*WebPlaybackReply)(nil), // 26: manager.v1.WebPlaybackReply (*WebPlaybackDataResponse)(nil), // 27: manager.v1.WebPlaybackDataResponse - (*ErrorReply)(nil), // 28: manager.v1.ErrorReply - (*emptypb.Empty)(nil), // 29: google.protobuf.Empty + (*TokensRequest)(nil), // 28: manager.v1.TokensRequest + (*TokensDataRequest)(nil), // 29: manager.v1.TokensDataRequest + (*TokensReply)(nil), // 30: manager.v1.TokensReply + (*TokensDataResponse)(nil), // 31: manager.v1.TokensDataResponse + (*ErrorReply)(nil), // 32: manager.v1.ErrorReply + (*emptypb.Empty)(nil), // 33: google.protobuf.Empty } var file_proto_manager_proto_depIdxs = []int32{ 0, // 0: manager.v1.StatusReply.header:type_name -> manager.v1.ReplyHeader @@ -1680,28 +1887,33 @@ var file_proto_manager_proto_depIdxs = []int32{ 25, // 20: manager.v1.WebPlaybackRequest.data:type_name -> manager.v1.WebPlaybackDataRequest 0, // 21: manager.v1.WebPlaybackReply.header:type_name -> manager.v1.ReplyHeader 27, // 22: manager.v1.WebPlaybackReply.data:type_name -> manager.v1.WebPlaybackDataResponse - 0, // 23: manager.v1.ErrorReply.header:type_name -> manager.v1.ReplyHeader - 29, // 24: manager.v1.WrapperManagerService.Status:input_type -> google.protobuf.Empty - 3, // 25: manager.v1.WrapperManagerService.Login:input_type -> manager.v1.LoginRequest - 6, // 26: manager.v1.WrapperManagerService.Logout:input_type -> manager.v1.LogoutRequest - 9, // 27: manager.v1.WrapperManagerService.Decrypt:input_type -> manager.v1.DecryptRequest - 12, // 28: manager.v1.WrapperManagerService.M3U8:input_type -> manager.v1.M3U8Request - 16, // 29: manager.v1.WrapperManagerService.Lyrics:input_type -> manager.v1.LyricsRequest - 20, // 30: manager.v1.WrapperManagerService.License:input_type -> manager.v1.LicenseRequest - 24, // 31: manager.v1.WrapperManagerService.WebPlayback:input_type -> manager.v1.WebPlaybackRequest - 1, // 32: manager.v1.WrapperManagerService.Status:output_type -> manager.v1.StatusReply - 5, // 33: manager.v1.WrapperManagerService.Login:output_type -> manager.v1.LoginReply - 8, // 34: manager.v1.WrapperManagerService.Logout:output_type -> manager.v1.LogoutReply - 10, // 35: manager.v1.WrapperManagerService.Decrypt:output_type -> manager.v1.DecryptReply - 14, // 36: manager.v1.WrapperManagerService.M3U8:output_type -> manager.v1.M3U8Reply - 18, // 37: manager.v1.WrapperManagerService.Lyrics:output_type -> manager.v1.LyricsReply - 22, // 38: manager.v1.WrapperManagerService.License:output_type -> manager.v1.LicenseReply - 26, // 39: manager.v1.WrapperManagerService.WebPlayback:output_type -> manager.v1.WebPlaybackReply - 32, // [32:40] is the sub-list for method output_type - 24, // [24:32] is the sub-list for method input_type - 24, // [24:24] is the sub-list for extension type_name - 24, // [24:24] is the sub-list for extension extendee - 0, // [0:24] is the sub-list for field type_name + 29, // 23: manager.v1.TokensRequest.data:type_name -> manager.v1.TokensDataRequest + 0, // 24: manager.v1.TokensReply.header:type_name -> manager.v1.ReplyHeader + 31, // 25: manager.v1.TokensReply.data:type_name -> manager.v1.TokensDataResponse + 0, // 26: manager.v1.ErrorReply.header:type_name -> manager.v1.ReplyHeader + 33, // 27: manager.v1.WrapperManagerService.Status:input_type -> google.protobuf.Empty + 3, // 28: manager.v1.WrapperManagerService.Login:input_type -> manager.v1.LoginRequest + 6, // 29: manager.v1.WrapperManagerService.Logout:input_type -> manager.v1.LogoutRequest + 9, // 30: manager.v1.WrapperManagerService.Decrypt:input_type -> manager.v1.DecryptRequest + 12, // 31: manager.v1.WrapperManagerService.M3U8:input_type -> manager.v1.M3U8Request + 16, // 32: manager.v1.WrapperManagerService.Lyrics:input_type -> manager.v1.LyricsRequest + 20, // 33: manager.v1.WrapperManagerService.License:input_type -> manager.v1.LicenseRequest + 24, // 34: manager.v1.WrapperManagerService.WebPlayback:input_type -> manager.v1.WebPlaybackRequest + 28, // 35: manager.v1.WrapperManagerService.Tokens:input_type -> manager.v1.TokensRequest + 1, // 36: manager.v1.WrapperManagerService.Status:output_type -> manager.v1.StatusReply + 5, // 37: manager.v1.WrapperManagerService.Login:output_type -> manager.v1.LoginReply + 8, // 38: manager.v1.WrapperManagerService.Logout:output_type -> manager.v1.LogoutReply + 10, // 39: manager.v1.WrapperManagerService.Decrypt:output_type -> manager.v1.DecryptReply + 14, // 40: manager.v1.WrapperManagerService.M3U8:output_type -> manager.v1.M3U8Reply + 18, // 41: manager.v1.WrapperManagerService.Lyrics:output_type -> manager.v1.LyricsReply + 22, // 42: manager.v1.WrapperManagerService.License:output_type -> manager.v1.LicenseReply + 26, // 43: manager.v1.WrapperManagerService.WebPlayback:output_type -> manager.v1.WebPlaybackReply + 30, // 44: manager.v1.WrapperManagerService.Tokens:output_type -> manager.v1.TokensReply + 36, // [36:45] is the sub-list for method output_type + 27, // [27:36] is the sub-list for method input_type + 27, // [27:27] is the sub-list for extension type_name + 27, // [27:27] is the sub-list for extension extendee + 0, // [0:27] is the sub-list for field type_name } func init() { file_proto_manager_proto_init() } @@ -1715,7 +1927,7 @@ func file_proto_manager_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_manager_proto_rawDesc), len(file_proto_manager_proto_rawDesc)), NumEnums: 0, - NumMessages: 29, + NumMessages: 33, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/manager.proto b/proto/manager.proto index df6ec78..1972cae 100644 --- a/proto/manager.proto +++ b/proto/manager.proto @@ -14,6 +14,7 @@ service WrapperManagerService { rpc Lyrics (LyricsRequest) returns (LyricsReply); rpc License (LicenseRequest) returns (LicenseReply); rpc WebPlayback (WebPlaybackRequest) returns (WebPlaybackReply); + rpc Tokens (TokensRequest) returns (TokensReply); } // 通用响应头结构 @@ -171,6 +172,26 @@ message WebPlaybackDataResponse { string m3u8 = 2; } +// ---------- Tokens ---------- + +message TokensRequest { + TokensDataRequest data = 1; +} + +message TokensDataRequest { + string adam_id = 1; +} + +message TokensReply { + ReplyHeader header = 1; + TokensDataResponse data = 2; +} + +message TokensDataResponse { + string bearer_token = 1; + string music_user_token = 2; +} + // ---------- Error ---------- message ErrorReply { diff --git a/proto/manager_grpc.pb.go b/proto/manager_grpc.pb.go index 0a50ad5..4132c0a 100644 --- a/proto/manager_grpc.pb.go +++ b/proto/manager_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.5.1 -// - protoc v5.29.0--dev +// - protoc-gen-go-grpc v1.6.1 +// - protoc v7.34.1 // source: proto/manager.proto package proto @@ -28,6 +28,7 @@ const ( WrapperManagerService_Lyrics_FullMethodName = "/manager.v1.WrapperManagerService/Lyrics" WrapperManagerService_License_FullMethodName = "/manager.v1.WrapperManagerService/License" WrapperManagerService_WebPlayback_FullMethodName = "/manager.v1.WrapperManagerService/WebPlayback" + WrapperManagerService_Tokens_FullMethodName = "/manager.v1.WrapperManagerService/Tokens" ) // WrapperManagerServiceClient is the client API for WrapperManagerService service. @@ -42,6 +43,7 @@ type WrapperManagerServiceClient interface { Lyrics(ctx context.Context, in *LyricsRequest, opts ...grpc.CallOption) (*LyricsReply, error) License(ctx context.Context, in *LicenseRequest, opts ...grpc.CallOption) (*LicenseReply, error) WebPlayback(ctx context.Context, in *WebPlaybackRequest, opts ...grpc.CallOption) (*WebPlaybackReply, error) + Tokens(ctx context.Context, in *TokensRequest, opts ...grpc.CallOption) (*TokensReply, error) } type wrapperManagerServiceClient struct { @@ -138,6 +140,16 @@ func (c *wrapperManagerServiceClient) WebPlayback(ctx context.Context, in *WebPl return out, nil } +func (c *wrapperManagerServiceClient) Tokens(ctx context.Context, in *TokensRequest, opts ...grpc.CallOption) (*TokensReply, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(TokensReply) + err := c.cc.Invoke(ctx, WrapperManagerService_Tokens_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // WrapperManagerServiceServer is the server API for WrapperManagerService service. // All implementations must embed UnimplementedWrapperManagerServiceServer // for forward compatibility. @@ -150,6 +162,7 @@ type WrapperManagerServiceServer interface { Lyrics(context.Context, *LyricsRequest) (*LyricsReply, error) License(context.Context, *LicenseRequest) (*LicenseReply, error) WebPlayback(context.Context, *WebPlaybackRequest) (*WebPlaybackReply, error) + Tokens(context.Context, *TokensRequest) (*TokensReply, error) mustEmbedUnimplementedWrapperManagerServiceServer() } @@ -161,28 +174,31 @@ type WrapperManagerServiceServer interface { type UnimplementedWrapperManagerServiceServer struct{} func (UnimplementedWrapperManagerServiceServer) Status(context.Context, *emptypb.Empty) (*StatusReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Status not implemented") + return nil, status.Error(codes.Unimplemented, "method Status not implemented") } func (UnimplementedWrapperManagerServiceServer) Login(grpc.BidiStreamingServer[LoginRequest, LoginReply]) error { - return status.Errorf(codes.Unimplemented, "method Login not implemented") + return status.Error(codes.Unimplemented, "method Login not implemented") } func (UnimplementedWrapperManagerServiceServer) Logout(context.Context, *LogoutRequest) (*LogoutReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Logout not implemented") + return nil, status.Error(codes.Unimplemented, "method Logout not implemented") } func (UnimplementedWrapperManagerServiceServer) Decrypt(grpc.BidiStreamingServer[DecryptRequest, DecryptReply]) error { - return status.Errorf(codes.Unimplemented, "method Decrypt not implemented") + return status.Error(codes.Unimplemented, "method Decrypt not implemented") } func (UnimplementedWrapperManagerServiceServer) M3U8(context.Context, *M3U8Request) (*M3U8Reply, error) { - return nil, status.Errorf(codes.Unimplemented, "method M3U8 not implemented") + return nil, status.Error(codes.Unimplemented, "method M3U8 not implemented") } func (UnimplementedWrapperManagerServiceServer) Lyrics(context.Context, *LyricsRequest) (*LyricsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Lyrics not implemented") + return nil, status.Error(codes.Unimplemented, "method Lyrics not implemented") } func (UnimplementedWrapperManagerServiceServer) License(context.Context, *LicenseRequest) (*LicenseReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method License not implemented") + return nil, status.Error(codes.Unimplemented, "method License not implemented") } func (UnimplementedWrapperManagerServiceServer) WebPlayback(context.Context, *WebPlaybackRequest) (*WebPlaybackReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method WebPlayback not implemented") + return nil, status.Error(codes.Unimplemented, "method WebPlayback not implemented") +} +func (UnimplementedWrapperManagerServiceServer) Tokens(context.Context, *TokensRequest) (*TokensReply, error) { + return nil, status.Error(codes.Unimplemented, "method Tokens not implemented") } func (UnimplementedWrapperManagerServiceServer) mustEmbedUnimplementedWrapperManagerServiceServer() {} func (UnimplementedWrapperManagerServiceServer) testEmbeddedByValue() {} @@ -195,7 +211,7 @@ type UnsafeWrapperManagerServiceServer interface { } func RegisterWrapperManagerServiceServer(s grpc.ServiceRegistrar, srv WrapperManagerServiceServer) { - // If the following call pancis, it indicates UnimplementedWrapperManagerServiceServer was + // If the following call panics, it indicates UnimplementedWrapperManagerServiceServer was // embedded by pointer and is nil. This will cause panics if an // unimplemented method is ever invoked, so we test this at initialization // time to prevent it from happening at runtime later due to I/O. @@ -327,6 +343,24 @@ func _WrapperManagerService_WebPlayback_Handler(srv interface{}, ctx context.Con return interceptor(ctx, in, info, handler) } +func _WrapperManagerService_Tokens_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TokensRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WrapperManagerServiceServer).Tokens(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: WrapperManagerService_Tokens_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WrapperManagerServiceServer).Tokens(ctx, req.(*TokensRequest)) + } + return interceptor(ctx, in, info, handler) +} + // WrapperManagerService_ServiceDesc is the grpc.ServiceDesc for WrapperManagerService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -358,6 +392,10 @@ var WrapperManagerService_ServiceDesc = grpc.ServiceDesc{ MethodName: "WebPlayback", Handler: _WrapperManagerService_WebPlayback_Handler, }, + { + MethodName: "Tokens", + Handler: _WrapperManagerService_Tokens_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/region.go b/region.go index d2a8f1e..8bfc46e 100644 --- a/region.go +++ b/region.go @@ -103,6 +103,23 @@ func SelectInstance(adamId string) (string, error) { return "", nil } +func SelectMVInstance(adamId string) (string, error) { + var selectedInstances []string + for _, instance := range Instances { + available, err := checkAvailableOnRegion(adamId, instance.Region, true) + if err != nil { + return "", err + } + if available { + selectedInstances = append(selectedInstances, instance.Id) + } + } + if len(selectedInstances) != 0 { + return selectedInstances[rand.Intn(len(selectedInstances))], nil + } + return "", nil +} + func SelectInstanceForLyrics(adamId string, language string) string { token, err := GetToken() if err != nil {