2024-06-28
continued from multi-areasThis doesn't expose anything useful but it does expose something:
I came across grpcurl via the orange
site, seems like exactly what i need
Tried it with the actors API, used on the current desktop site:
g@GARRET-LAPTOP-NEW-SHINY-EDITION:~$ grpcurl actor-and-article.annex.radiko.jp:443 describe
grpc.health.v1.Health is a service:
service Health {
rpc Check ( .grpc.health.v1.HealthCheckRequest ) returns ( .grpc.health.v1.HealthCheckResponse );
rpc Watch ( .grpc.health.v1.HealthCheckRequest ) returns ( stream .grpc.health.v1.HealthCheckResponse );
}
grpc.reflection.v1.ServerReflection is a service:
service ServerReflection {
rpc ServerReflectionInfo ( stream .grpc.reflection.v1.ServerReflectionRequest ) returns ( stream .grpc.reflection.v1.ServerReflectionResponse );
}
grpc.reflection.v1alpha.ServerReflection is a service:
service ServerReflection {
rpc ServerReflectionInfo ( stream .grpc.reflection.v1alpha.ServerReflectionRequest ) returns ( stream .grpc.reflection.v1alpha.ServerReflectionResponse );
}
radiko.ActorService is a service:
service ActorService {
rpc BatchGetActors ( .radiko.BatchGetActorsRequest ) returns ( .radiko.BatchGetActorsResponse ) {
option (.google.api.http) = { post: "/v1/actors/batch_get", body: "*" };
option (.grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { summary: "BatchGetActors", description: "minds-rの複数のPersonIDから人物データを取得するAPIです。 minds-rのPersonIDがArtist CommonsのAcIDと紐付いている場合は、ACの情報が利用されます。" };
}
rpc GetActor ( .radiko.GetActorRequest ) returns ( .radiko.GetActorResponse ) {
option (.google.api.http) = { get: "/v1/actors/{actor_key}" };
option (.grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { summary: "GetActor", description: "minds-rのPersonIDから人物データを取得するAPI です。minds-rのPersonIDがArtist CommonsのAcIDと紐付いている場合は、ACの情報が利用されます。" };
}
rpc SearchActors ( .radiko.SearchActorsRequest ) returns ( .radiko.SearchActorsResponse ) {
option (.google.api.http) = { post: "/v1/actors/search", body: "*" };
option (.grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { summary: "SearchActors", description: "人物名に対して人物情報を返却するAPIです。 minds-rのPersonIDがArtist CommonsのAcIDと紐付いている場合は、ACの情報が利用されます。" };
}
}
radiko.ArticleService is a service:
service ArticleService {
rpc GetArticle ( .radiko.GetArticleRequest ) returns ( .radiko.GetArticleResponse ) {
option (.google.api.http) = { get: "/v1/articles/{article_id}" };
option (.grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { summary: "GetArticle", description: "article_idの記事を取得します" };
}
rpc SearchArticles ( .radiko.SearchArticlesRequest ) returns ( .radiko.SearchArticlesResponse ) {
option (.google.api.http) = { post: "/v1/articles/search", body: "*" };
option (.grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
summary: "SearchArticles",
description: "radiko newsの記事を返却するためのAPIです。 検索対象は、 出演者名、actor_key,season_key,r_season_key"
};
}
}
Amazing success!
Continuing in the same fashion:
g@GARRET-LAPTOP-NEW-SHINY-EDITION:~$ for i in .radiko.BatchGetActorsRequest .radiko.BatchGetActorsResponse .radiko.GetActorRequest .radiko.GetActorResponse .radiko.SearchActorsRequest .radiko.SearchActorsResponse .radiko.GetArticleRequest .radiko.GetArticleResponse .radiko.SearchArticlesRequest .radiko.SearchArticlesResponse
> do
> grpcurl actor-and-article.annex.radiko.jp:443 describe $i
> done
radiko.BatchGetActorsRequest is a message:
message BatchGetActorsRequest {
repeated string actor_keys = 1;
}
radiko.BatchGetActorsResponse is a message:
message BatchGetActorsResponse {
repeated .radiko.Actor actors = 1;
}
radiko.GetActorRequest is a message:
message GetActorRequest {
string actor_key = 1;
}
radiko.GetActorResponse is a message:
message GetActorResponse {
.radiko.Actor actor = 1;
}
radiko.SearchActorsRequest is a message:
message SearchActorsRequest {
string actor_name = 1;
int32 from = 2;
int32 limit = 3;
}
radiko.SearchActorsResponse is a message:
message SearchActorsResponse {
repeated .radiko.Actor actors = 1;
int32 result_count = 2;
int32 from = 3;
int32 total_count = 4;
}
radiko.GetArticleRequest is a message:
message GetArticleRequest {
int32 article_id = 1;
}
radiko.GetArticleResponse is a message:
message GetArticleResponse {
.radiko.Article article = 1;
}
radiko.SearchArticlesRequest is a message:
message SearchArticlesRequest {
string keyword = 1;
string actor_key = 2;
string r_season_key = 6;
string season_key = 7;
int32 from = 100;
int32 limit = 101;
reserved 3 to 5;
}
radiko.SearchArticlesResponse is a message:
message SearchArticlesResponse {
repeated .radiko.Article articles = 1;
int32 result_count = 2;
int32 from = 3;
int32 total_count = 4;
}
g@GARRET-LAPTOP-NEW-SHINY-EDITION:~$ for i in .radiko.Actor .radiko.Article; do grpcurl actor-and-article.annex.radiko.jp:443 describe $i; done
radiko.Actor is a message:
message Actor {
string key = 1;
string name = 2;
string name_kana = 3;
string name_english = 4;
repeated .radiko.Actor.Image images = 5;
string description = 6;
string information = 7;
message Image {
string url = 1;
string genre = 2;
int32 width = 3;
int32 height = 4;
string size_type = 5;
}
}
radiko.Article is a message:
message Article {
int32 id = 1;
string title = 2;
string publisher_name = 3;
string image_url = 4;
string url = 5;
}
g@GARRET-LAPTOP-NEW-SHINY-EDITION:~$ grpcurl actor-and-article.annex.radiko.jp:443 describe .radiko.Actor.Image
radiko.Actor.Image is a message:
message Image {
string url = 1;
string genre = 2;
int32 width = 3;
int32 height = 4;
string size_type = 5;
}
Excellent, can probably massage that into a proper .proto file
with not very much effort
so that's rather marvellous, I wonder if I can do the same thing
with the actual useful API:
g@GARRET-LAPTOP-NEW-SHINY-EDITION:~$ grpcurl api.annex.radiko.jp:443 list Failed to list services: server does not support the reflection API
:(
2025-07-09 update
I haven't looked at this since, but there is now a yt-dlp blessed protobuf library "protobug" by Grub4K which looks very nice indeed
I tried to do stuff with the google one and apparently i have to have it auto generate code? which then didnt work
small indie company no bully