protobufs, part 2

continued from multi-areas

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

:(