Bladeren bron

batch get video feature

丁云鹏 1 jaar geleden
bovenliggende
commit
a72b18243f

+ 23 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/client/FeatureClient.java

@@ -5,6 +5,9 @@ import lombok.extern.slf4j.Slf4j;
 import net.devh.boot.grpc.client.inject.GrpcClient;
 import org.springframework.stereotype.Component;
 
+import java.util.Collections;
+import java.util.List;
+
 /**
  * @author dyp
  */
@@ -47,4 +50,24 @@ public class FeatureClient {
         }
         return response.hasVideoFeature() ? response.getVideoFeature() : null;
     }
+
+    public List<VideoFeatureProto> getAllVideoFeature(List<Long> videoIds) {
+        GetAllVideoFeatureRequest.Builder buildr = GetAllVideoFeatureRequest.newBuilder()
+        for (Long videoId : videoIds) {
+            buildr.addVideoId(videoId + "");
+        }
+        GetAllVideoFeatureResponse response = client.getAllVideoFeature(buildr.build());
+        if (response == null || !response.hasResult()) {
+            log.info("getAllVideoFeature grpc error");
+            return null;
+        }
+        if (response.getResult().getCode() != 1) {
+            log.info("getAllVideoFeature grpc code={}, msg={}", response.getResult().getCode(),
+                    response.getResult().getMessage());
+            return null;
+        }
+        return response.getVideoFeatureCount() > 0
+                ? response.getVideoFeatureList()
+                : Collections.emptyList();
+    }
 }

+ 49 - 21
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/Feature.java

@@ -39,6 +39,16 @@ public final class Feature {
   static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_GetVideoFeatureResponse_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetAllVideoFeatureRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetAllVideoFeatureRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetAllVideoFeatureResponse_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetAllVideoFeatureResponse_fieldAccessorTable;
   static final com.google.protobuf.Descriptors.Descriptor
     internal_static_VideoFeatureProto_descriptor;
   static final 
@@ -76,25 +86,31 @@ public final class Feature {
       "day\030\t \001(\t\"*\n\026GetVideoFeatureRequest\022\020\n\010v" +
       "ideo_id\030\001 \001(\t\"]\n\027GetVideoFeatureResponse" +
       "\022\027\n\006result\030\001 \001(\0132\007.Result\022)\n\rvideo_featu" +
-      "re\030\002 \001(\0132\022.VideoFeatureProto\"\354\002\n\021VideoFe" +
-      "atureProto\022\020\n\010video_id\030\001 \001(\t\022\r\n\005up_id\030\002 " +
-      "\001(\t\022\014\n\004tags\030\003 \001(\t\022\023\n\013play_length\030\004 \001(\t\022\022" +
-      "\n\ntotal_time\030\005 \001(\t\022\031\n\021days_since_upload\030" +
-      "\006 \001(\t\0227\n\026video_day1_cnt_feature\030\007 \001(\0132\027." +
-      "UserActionFeatureProto\0227\n\026video_day3_cnt" +
-      "_feature\030\010 \001(\0132\027.UserActionFeatureProto\022" +
-      "7\n\026video_day7_cnt_feature\030\t \001(\0132\027.UserAc" +
-      "tionFeatureProto\0229\n\030video_month3_cnt_fea" +
-      "ture\030\n \001(\0132\027.UserActionFeatureProto\"\212\001\n\026" +
-      "UserActionFeatureProto\022\017\n\007exp_cnt\030\001 \001(\003\022" +
-      "\021\n\tclick_cnt\030\002 \001(\003\022\021\n\tshare_cnt\030\003 \001(\003\022\022\n" +
-      "\nreturn_cnt\030\004 \001(\003\022\013\n\003ctr\030\005 \001(\001\022\013\n\003str\030\006 " +
-      "\001(\001\022\013\n\003rov\030\007 \001(\0012\231\001\n\016FeatureService\022A\n\016G" +
-      "etUserFeature\022\026.GetUserFeatureRequest\032\027." +
-      "GetUserFeatureResponse\022D\n\017GetVideoFeatur" +
-      "e\022\027.GetVideoFeatureRequest\032\030.GetVideoFea" +
-      "tureResponseB8\n1com.tzld.piaoquan.recomm" +
-      "end.feature.model.featureP\001\210\001\001b\006proto3"
+      "re\030\002 \001(\0132\022.VideoFeatureProto\"-\n\031GetAllVi" +
+      "deoFeatureRequest\022\020\n\010video_id\030\001 \003(\t\"`\n\032G" +
+      "etAllVideoFeatureResponse\022\027\n\006result\030\001 \001(" +
+      "\0132\007.Result\022)\n\rvideo_feature\030\002 \003(\0132\022.Vide" +
+      "oFeatureProto\"\354\002\n\021VideoFeatureProto\022\020\n\010v" +
+      "ideo_id\030\001 \001(\t\022\r\n\005up_id\030\002 \001(\t\022\014\n\004tags\030\003 \001" +
+      "(\t\022\023\n\013play_length\030\004 \001(\t\022\022\n\ntotal_time\030\005 " +
+      "\001(\t\022\031\n\021days_since_upload\030\006 \001(\t\0227\n\026video_" +
+      "day1_cnt_feature\030\007 \001(\0132\027.UserActionFeatu" +
+      "reProto\0227\n\026video_day3_cnt_feature\030\010 \001(\0132" +
+      "\027.UserActionFeatureProto\0227\n\026video_day7_c" +
+      "nt_feature\030\t \001(\0132\027.UserActionFeatureProt" +
+      "o\0229\n\030video_month3_cnt_feature\030\n \001(\0132\027.Us" +
+      "erActionFeatureProto\"\212\001\n\026UserActionFeatu" +
+      "reProto\022\017\n\007exp_cnt\030\001 \001(\003\022\021\n\tclick_cnt\030\002 " +
+      "\001(\003\022\021\n\tshare_cnt\030\003 \001(\003\022\022\n\nreturn_cnt\030\004 \001" +
+      "(\003\022\013\n\003ctr\030\005 \001(\001\022\013\n\003str\030\006 \001(\001\022\013\n\003rov\030\007 \001(" +
+      "\0012\350\001\n\016FeatureService\022A\n\016GetUserFeature\022\026" +
+      ".GetUserFeatureRequest\032\027.GetUserFeatureR" +
+      "esponse\022D\n\017GetVideoFeature\022\027.GetVideoFea" +
+      "tureRequest\032\030.GetVideoFeatureResponse\022M\n" +
+      "\022GetAllVideoFeature\022\032.GetAllVideoFeature" +
+      "Request\032\033.GetAllVideoFeatureResponseB8\n1" +
+      "com.tzld.piaoquan.recommend.feature.mode" +
+      "l.featureP\001\210\001\001b\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -132,14 +148,26 @@ public final class Feature {
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_GetVideoFeatureResponse_descriptor,
         new java.lang.String[] { "Result", "VideoFeature", });
-    internal_static_VideoFeatureProto_descriptor =
+    internal_static_GetAllVideoFeatureRequest_descriptor =
       getDescriptor().getMessageTypes().get(5);
+    internal_static_GetAllVideoFeatureRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetAllVideoFeatureRequest_descriptor,
+        new java.lang.String[] { "VideoId", });
+    internal_static_GetAllVideoFeatureResponse_descriptor =
+      getDescriptor().getMessageTypes().get(6);
+    internal_static_GetAllVideoFeatureResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetAllVideoFeatureResponse_descriptor,
+        new java.lang.String[] { "Result", "VideoFeature", });
+    internal_static_VideoFeatureProto_descriptor =
+      getDescriptor().getMessageTypes().get(7);
     internal_static_VideoFeatureProto_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_VideoFeatureProto_descriptor,
         new java.lang.String[] { "VideoId", "UpId", "Tags", "PlayLength", "TotalTime", "DaysSinceUpload", "VideoDay1CntFeature", "VideoDay3CntFeature", "VideoDay7CntFeature", "VideoMonth3CntFeature", });
     internal_static_UserActionFeatureProto_descriptor =
-      getDescriptor().getMessageTypes().get(6);
+      getDescriptor().getMessageTypes().get(8);
     internal_static_UserActionFeatureProto_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_UserActionFeatureProto_descriptor,

+ 71 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/FeatureService.java

@@ -27,6 +27,14 @@ public  abstract class FeatureService
         com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest request,
         com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse> done);
 
+    /**
+     * <code>rpc GetAllVideoFeature(.GetAllVideoFeatureRequest) returns (.GetAllVideoFeatureResponse);</code>
+     */
+    public abstract void getAllVideoFeature(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse> done);
+
   }
 
   public static com.google.protobuf.Service newReflectiveService(
@@ -48,6 +56,14 @@ public  abstract class FeatureService
         impl.getVideoFeature(controller, request, done);
       }
 
+      @java.lang.Override
+      public  void getAllVideoFeature(
+          com.google.protobuf.RpcController controller,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request,
+          com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse> done) {
+        impl.getAllVideoFeature(controller, request, done);
+      }
+
     };
   }
 
@@ -74,6 +90,8 @@ public  abstract class FeatureService
             return impl.getUserFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest)request);
           case 1:
             return impl.getVideoFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest)request);
+          case 2:
+            return impl.getAllVideoFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest)request);
           default:
             throw new java.lang.AssertionError("Can't get here.");
         }
@@ -92,6 +110,8 @@ public  abstract class FeatureService
             return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest.getDefaultInstance();
           case 1:
             return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest.getDefaultInstance();
+          case 2:
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.getDefaultInstance();
           default:
             throw new java.lang.AssertionError("Can't get here.");
         }
@@ -110,6 +130,8 @@ public  abstract class FeatureService
             return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse.getDefaultInstance();
           case 1:
             return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse.getDefaultInstance();
+          case 2:
+            return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance();
           default:
             throw new java.lang.AssertionError("Can't get here.");
         }
@@ -134,6 +156,14 @@ public  abstract class FeatureService
       com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest request,
       com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse> done);
 
+  /**
+   * <code>rpc GetAllVideoFeature(.GetAllVideoFeatureRequest) returns (.GetAllVideoFeatureResponse);</code>
+   */
+  public abstract void getAllVideoFeature(
+      com.google.protobuf.RpcController controller,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request,
+      com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse> done);
+
   public static final
       com.google.protobuf.Descriptors.ServiceDescriptor
       getDescriptor() {
@@ -166,6 +196,11 @@ public  abstract class FeatureService
           com.google.protobuf.RpcUtil.<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse>specializeCallback(
             done));
         return;
+      case 2:
+        this.getAllVideoFeature(controller, (com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest)request,
+          com.google.protobuf.RpcUtil.<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse>specializeCallback(
+            done));
+        return;
       default:
         throw new java.lang.AssertionError("Can't get here.");
     }
@@ -184,6 +219,8 @@ public  abstract class FeatureService
         return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureRequest.getDefaultInstance();
       case 1:
         return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest.getDefaultInstance();
+      case 2:
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.getDefaultInstance();
       default:
         throw new java.lang.AssertionError("Can't get here.");
     }
@@ -202,6 +239,8 @@ public  abstract class FeatureService
         return com.tzld.piaoquan.recommend.feature.model.feature.GetUserFeatureResponse.getDefaultInstance();
       case 1:
         return com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse.getDefaultInstance();
+      case 2:
+        return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance();
       default:
         throw new java.lang.AssertionError("Can't get here.");
     }
@@ -252,6 +291,21 @@ public  abstract class FeatureService
           com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse.class,
           com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse.getDefaultInstance()));
     }
+
+    public  void getAllVideoFeature(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request,
+        com.google.protobuf.RpcCallback<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse> done) {
+      channel.callMethod(
+        getDescriptor().getMethods().get(2),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance(),
+        com.google.protobuf.RpcUtil.generalizeCallback(
+          done,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.class,
+          com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance()));
+    }
   }
 
   public static BlockingInterface newBlockingStub(
@@ -269,6 +323,11 @@ public  abstract class FeatureService
         com.google.protobuf.RpcController controller,
         com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest request)
         throws com.google.protobuf.ServiceException;
+
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse getAllVideoFeature(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request)
+        throws com.google.protobuf.ServiceException;
   }
 
   private static final class BlockingStub implements BlockingInterface {
@@ -301,6 +360,18 @@ public  abstract class FeatureService
         com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse.getDefaultInstance());
     }
 
+
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse getAllVideoFeature(
+        com.google.protobuf.RpcController controller,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request)
+        throws com.google.protobuf.ServiceException {
+      return (com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse) channel.callBlockingMethod(
+        getDescriptor().getMethods().get(2),
+        controller,
+        request,
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance());
+    }
+
   }
 
   // @@protoc_insertion_point(class_scope:FeatureService)

+ 74 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/FeatureServiceGrpc.java

@@ -89,6 +89,37 @@ public final class FeatureServiceGrpc {
     return getGetVideoFeatureMethod;
   }
 
+  private static volatile io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse> getGetAllVideoFeatureMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "GetAllVideoFeature",
+      requestType = com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.class,
+      responseType = com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest,
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse> getGetAllVideoFeatureMethod() {
+    io.grpc.MethodDescriptor<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest, com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse> getGetAllVideoFeatureMethod;
+    if ((getGetAllVideoFeatureMethod = FeatureServiceGrpc.getGetAllVideoFeatureMethod) == null) {
+      synchronized (FeatureServiceGrpc.class) {
+        if ((getGetAllVideoFeatureMethod = FeatureServiceGrpc.getGetAllVideoFeatureMethod) == null) {
+          FeatureServiceGrpc.getGetAllVideoFeatureMethod = getGetAllVideoFeatureMethod =
+              io.grpc.MethodDescriptor.<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest, com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetAllVideoFeature"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new FeatureServiceMethodDescriptorSupplier("GetAllVideoFeature"))
+              .build();
+        }
+      }
+    }
+    return getGetAllVideoFeatureMethod;
+  }
+
   /**
    * Creates a new async stub that supports all call types for the service
    */
@@ -151,6 +182,13 @@ public final class FeatureServiceGrpc {
       asyncUnimplementedUnaryCall(getGetVideoFeatureMethod(), responseObserver);
     }
 
+    /**
+     */
+    public void getAllVideoFeature(com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse> responseObserver) {
+      asyncUnimplementedUnaryCall(getGetAllVideoFeatureMethod(), responseObserver);
+    }
+
     @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
       return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
           .addMethod(
@@ -167,6 +205,13 @@ public final class FeatureServiceGrpc {
                 com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest,
                 com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse>(
                   this, METHODID_GET_VIDEO_FEATURE)))
+          .addMethod(
+            getGetAllVideoFeatureMethod(),
+            asyncUnaryCall(
+              new MethodHandlers<
+                com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest,
+                com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse>(
+                  this, METHODID_GET_ALL_VIDEO_FEATURE)))
           .build();
     }
   }
@@ -200,6 +245,14 @@ public final class FeatureServiceGrpc {
       asyncUnaryCall(
           getChannel().newCall(getGetVideoFeatureMethod(), getCallOptions()), request, responseObserver);
     }
+
+    /**
+     */
+    public void getAllVideoFeature(com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request,
+        io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse> responseObserver) {
+      asyncUnaryCall(
+          getChannel().newCall(getGetAllVideoFeatureMethod(), getCallOptions()), request, responseObserver);
+    }
   }
 
   /**
@@ -229,6 +282,13 @@ public final class FeatureServiceGrpc {
       return blockingUnaryCall(
           getChannel(), getGetVideoFeatureMethod(), getCallOptions(), request);
     }
+
+    /**
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse getAllVideoFeature(com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request) {
+      return blockingUnaryCall(
+          getChannel(), getGetAllVideoFeatureMethod(), getCallOptions(), request);
+    }
   }
 
   /**
@@ -260,10 +320,19 @@ public final class FeatureServiceGrpc {
       return futureUnaryCall(
           getChannel().newCall(getGetVideoFeatureMethod(), getCallOptions()), request);
     }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse> getAllVideoFeature(
+        com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest request) {
+      return futureUnaryCall(
+          getChannel().newCall(getGetAllVideoFeatureMethod(), getCallOptions()), request);
+    }
   }
 
   private static final int METHODID_GET_USER_FEATURE = 0;
   private static final int METHODID_GET_VIDEO_FEATURE = 1;
+  private static final int METHODID_GET_ALL_VIDEO_FEATURE = 2;
 
   private static final class MethodHandlers<Req, Resp> implements
       io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
@@ -290,6 +359,10 @@ public final class FeatureServiceGrpc {
           serviceImpl.getVideoFeature((com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureRequest) request,
               (io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetVideoFeatureResponse>) responseObserver);
           break;
+        case METHODID_GET_ALL_VIDEO_FEATURE:
+          serviceImpl.getAllVideoFeature((com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest) request,
+              (io.grpc.stub.StreamObserver<com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse>) responseObserver);
+          break;
         default:
           throw new AssertionError();
       }
@@ -353,6 +426,7 @@ public final class FeatureServiceGrpc {
               .setSchemaDescriptor(new FeatureServiceFileDescriptorSupplier())
               .addMethod(getGetUserFeatureMethod())
               .addMethod(getGetVideoFeatureMethod())
+              .addMethod(getGetAllVideoFeatureMethod())
               .build();
         }
       }

+ 614 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAllVideoFeatureRequest.java

@@ -0,0 +1,614 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+/**
+ * Protobuf type {@code GetAllVideoFeatureRequest}
+ */
+public final class GetAllVideoFeatureRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetAllVideoFeatureRequest)
+    GetAllVideoFeatureRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetAllVideoFeatureRequest.newBuilder() to construct.
+  private GetAllVideoFeatureRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetAllVideoFeatureRequest() {
+    videoId_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetAllVideoFeatureRequest();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetAllVideoFeatureRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            java.lang.String s = input.readStringRequireUtf8();
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              videoId_ = new com.google.protobuf.LazyStringArrayList();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            videoId_.add(s);
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        videoId_ = videoId_.getUnmodifiableView();
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllVideoFeatureRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllVideoFeatureRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.class, com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.Builder.class);
+  }
+
+  public static final int VIDEO_ID_FIELD_NUMBER = 1;
+  private com.google.protobuf.LazyStringList videoId_;
+  /**
+   * <code>repeated string video_id = 1;</code>
+   * @return A list containing the videoId.
+   */
+  public com.google.protobuf.ProtocolStringList
+      getVideoIdList() {
+    return videoId_;
+  }
+  /**
+   * <code>repeated string video_id = 1;</code>
+   * @return The count of videoId.
+   */
+  public int getVideoIdCount() {
+    return videoId_.size();
+  }
+  /**
+   * <code>repeated string video_id = 1;</code>
+   * @param index The index of the element to return.
+   * @return The videoId at the given index.
+   */
+  public java.lang.String getVideoId(int index) {
+    return videoId_.get(index);
+  }
+  /**
+   * <code>repeated string video_id = 1;</code>
+   * @param index The index of the value to return.
+   * @return The bytes of the videoId at the given index.
+   */
+  public com.google.protobuf.ByteString
+      getVideoIdBytes(int index) {
+    return videoId_.getByteString(index);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    for (int i = 0; i < videoId_.size(); i++) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, videoId_.getRaw(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    {
+      int dataSize = 0;
+      for (int i = 0; i < videoId_.size(); i++) {
+        dataSize += computeStringSizeNoTag(videoId_.getRaw(i));
+      }
+      size += dataSize;
+      size += 1 * getVideoIdList().size();
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest other = (com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest) obj;
+
+    if (!getVideoIdList()
+        .equals(other.getVideoIdList())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (getVideoIdCount() > 0) {
+      hash = (37 * hash) + VIDEO_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getVideoIdList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code GetAllVideoFeatureRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetAllVideoFeatureRequest)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllVideoFeatureRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllVideoFeatureRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.class, com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      videoId_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      bitField0_ = (bitField0_ & ~0x00000001);
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllVideoFeatureRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest result = new com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest(this);
+      int from_bitField0_ = bitField0_;
+      if (((bitField0_ & 0x00000001) != 0)) {
+        videoId_ = videoId_.getUnmodifiableView();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      }
+      result.videoId_ = videoId_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest.getDefaultInstance()) return this;
+      if (!other.videoId_.isEmpty()) {
+        if (videoId_.isEmpty()) {
+          videoId_ = other.videoId_;
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          ensureVideoIdIsMutable();
+          videoId_.addAll(other.videoId_);
+        }
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.google.protobuf.LazyStringList videoId_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+    private void ensureVideoIdIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        videoId_ = new com.google.protobuf.LazyStringArrayList(videoId_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+    /**
+     * <code>repeated string video_id = 1;</code>
+     * @return A list containing the videoId.
+     */
+    public com.google.protobuf.ProtocolStringList
+        getVideoIdList() {
+      return videoId_.getUnmodifiableView();
+    }
+    /**
+     * <code>repeated string video_id = 1;</code>
+     * @return The count of videoId.
+     */
+    public int getVideoIdCount() {
+      return videoId_.size();
+    }
+    /**
+     * <code>repeated string video_id = 1;</code>
+     * @param index The index of the element to return.
+     * @return The videoId at the given index.
+     */
+    public java.lang.String getVideoId(int index) {
+      return videoId_.get(index);
+    }
+    /**
+     * <code>repeated string video_id = 1;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the videoId at the given index.
+     */
+    public com.google.protobuf.ByteString
+        getVideoIdBytes(int index) {
+      return videoId_.getByteString(index);
+    }
+    /**
+     * <code>repeated string video_id = 1;</code>
+     * @param index The index to set the value at.
+     * @param value The videoId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setVideoId(
+        int index, java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureVideoIdIsMutable();
+      videoId_.set(index, value);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated string video_id = 1;</code>
+     * @param value The videoId to add.
+     * @return This builder for chaining.
+     */
+    public Builder addVideoId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureVideoIdIsMutable();
+      videoId_.add(value);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated string video_id = 1;</code>
+     * @param values The videoId to add.
+     * @return This builder for chaining.
+     */
+    public Builder addAllVideoId(
+        java.lang.Iterable<java.lang.String> values) {
+      ensureVideoIdIsMutable();
+      com.google.protobuf.AbstractMessageLite.Builder.addAll(
+          values, videoId_);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated string video_id = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearVideoId() {
+      videoId_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      bitField0_ = (bitField0_ & ~0x00000001);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>repeated string video_id = 1;</code>
+     * @param value The bytes of the videoId to add.
+     * @return This builder for chaining.
+     */
+    public Builder addVideoIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      ensureVideoIdIsMutable();
+      videoId_.add(value);
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:GetAllVideoFeatureRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetAllVideoFeatureRequest)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetAllVideoFeatureRequest>
+      PARSER = new com.google.protobuf.AbstractParser<GetAllVideoFeatureRequest>() {
+    @java.lang.Override
+    public GetAllVideoFeatureRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetAllVideoFeatureRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetAllVideoFeatureRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetAllVideoFeatureRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 34 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAllVideoFeatureRequestOrBuilder.java

@@ -0,0 +1,34 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+public interface GetAllVideoFeatureRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetAllVideoFeatureRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>repeated string video_id = 1;</code>
+   * @return A list containing the videoId.
+   */
+  java.util.List<java.lang.String>
+      getVideoIdList();
+  /**
+   * <code>repeated string video_id = 1;</code>
+   * @return The count of videoId.
+   */
+  int getVideoIdCount();
+  /**
+   * <code>repeated string video_id = 1;</code>
+   * @param index The index of the element to return.
+   * @return The videoId at the given index.
+   */
+  java.lang.String getVideoId(int index);
+  /**
+   * <code>repeated string video_id = 1;</code>
+   * @param index The index of the value to return.
+   * @return The bytes of the videoId at the given index.
+   */
+  com.google.protobuf.ByteString
+      getVideoIdBytes(int index);
+}

+ 958 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAllVideoFeatureResponse.java

@@ -0,0 +1,958 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+/**
+ * Protobuf type {@code GetAllVideoFeatureResponse}
+ */
+public final class GetAllVideoFeatureResponse extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:GetAllVideoFeatureResponse)
+    GetAllVideoFeatureResponseOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use GetAllVideoFeatureResponse.newBuilder() to construct.
+  private GetAllVideoFeatureResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private GetAllVideoFeatureResponse() {
+    videoFeature_ = java.util.Collections.emptyList();
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new GetAllVideoFeatureResponse();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private GetAllVideoFeatureResponse(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            com.tzld.piaoquan.recommend.feature.model.common.Result.Builder subBuilder = null;
+            if (result_ != null) {
+              subBuilder = result_.toBuilder();
+            }
+            result_ = input.readMessage(com.tzld.piaoquan.recommend.feature.model.common.Result.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(result_);
+              result_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              videoFeature_ = new java.util.ArrayList<com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto>();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            videoFeature_.add(
+                input.readMessage(com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto.parser(), extensionRegistry));
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        videoFeature_ = java.util.Collections.unmodifiableList(videoFeature_);
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllVideoFeatureResponse_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllVideoFeatureResponse_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.class, com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.Builder.class);
+  }
+
+  public static final int RESULT_FIELD_NUMBER = 1;
+  private com.tzld.piaoquan.recommend.feature.model.common.Result result_;
+  /**
+   * <code>.Result result = 1;</code>
+   * @return Whether the result field is set.
+   */
+  @java.lang.Override
+  public boolean hasResult() {
+    return result_ != null;
+  }
+  /**
+   * <code>.Result result = 1;</code>
+   * @return The result.
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.common.Result getResult() {
+    return result_ == null ? com.tzld.piaoquan.recommend.feature.model.common.Result.getDefaultInstance() : result_;
+  }
+  /**
+   * <code>.Result result = 1;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder getResultOrBuilder() {
+    return getResult();
+  }
+
+  public static final int VIDEO_FEATURE_FIELD_NUMBER = 2;
+  private java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto> videoFeature_;
+  /**
+   * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+   */
+  @java.lang.Override
+  public java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto> getVideoFeatureList() {
+    return videoFeature_;
+  }
+  /**
+   * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+   */
+  @java.lang.Override
+  public java.util.List<? extends com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProtoOrBuilder> 
+      getVideoFeatureOrBuilderList() {
+    return videoFeature_;
+  }
+  /**
+   * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+   */
+  @java.lang.Override
+  public int getVideoFeatureCount() {
+    return videoFeature_.size();
+  }
+  /**
+   * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto getVideoFeature(int index) {
+    return videoFeature_.get(index);
+  }
+  /**
+   * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+   */
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProtoOrBuilder getVideoFeatureOrBuilder(
+      int index) {
+    return videoFeature_.get(index);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (result_ != null) {
+      output.writeMessage(1, getResult());
+    }
+    for (int i = 0; i < videoFeature_.size(); i++) {
+      output.writeMessage(2, videoFeature_.get(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (result_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getResult());
+    }
+    for (int i = 0; i < videoFeature_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(2, videoFeature_.get(i));
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse other = (com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse) obj;
+
+    if (hasResult() != other.hasResult()) return false;
+    if (hasResult()) {
+      if (!getResult()
+          .equals(other.getResult())) return false;
+    }
+    if (!getVideoFeatureList()
+        .equals(other.getVideoFeatureList())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasResult()) {
+      hash = (37 * hash) + RESULT_FIELD_NUMBER;
+      hash = (53 * hash) + getResult().hashCode();
+    }
+    if (getVideoFeatureCount() > 0) {
+      hash = (37 * hash) + VIDEO_FEATURE_FIELD_NUMBER;
+      hash = (53 * hash) + getVideoFeatureList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code GetAllVideoFeatureResponse}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:GetAllVideoFeatureResponse)
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponseOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllVideoFeatureResponse_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllVideoFeatureResponse_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.class, com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+        getVideoFeatureFieldBuilder();
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (resultBuilder_ == null) {
+        result_ = null;
+      } else {
+        result_ = null;
+        resultBuilder_ = null;
+      }
+      if (videoFeatureBuilder_ == null) {
+        videoFeature_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      } else {
+        videoFeatureBuilder_.clear();
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.Feature.internal_static_GetAllVideoFeatureResponse_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse getDefaultInstanceForType() {
+      return com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse build() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse buildPartial() {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse result = new com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse(this);
+      int from_bitField0_ = bitField0_;
+      if (resultBuilder_ == null) {
+        result.result_ = result_;
+      } else {
+        result.result_ = resultBuilder_.build();
+      }
+      if (videoFeatureBuilder_ == null) {
+        if (((bitField0_ & 0x00000001) != 0)) {
+          videoFeature_ = java.util.Collections.unmodifiableList(videoFeature_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.videoFeature_ = videoFeature_;
+      } else {
+        result.videoFeature_ = videoFeatureBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse) {
+        return mergeFrom((com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse other) {
+      if (other == com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse.getDefaultInstance()) return this;
+      if (other.hasResult()) {
+        mergeResult(other.getResult());
+      }
+      if (videoFeatureBuilder_ == null) {
+        if (!other.videoFeature_.isEmpty()) {
+          if (videoFeature_.isEmpty()) {
+            videoFeature_ = other.videoFeature_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureVideoFeatureIsMutable();
+            videoFeature_.addAll(other.videoFeature_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.videoFeature_.isEmpty()) {
+          if (videoFeatureBuilder_.isEmpty()) {
+            videoFeatureBuilder_.dispose();
+            videoFeatureBuilder_ = null;
+            videoFeature_ = other.videoFeature_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+            videoFeatureBuilder_ = 
+              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                 getVideoFeatureFieldBuilder() : null;
+          } else {
+            videoFeatureBuilder_.addAllMessages(other.videoFeature_);
+          }
+        }
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private com.tzld.piaoquan.recommend.feature.model.common.Result result_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.common.Result, com.tzld.piaoquan.recommend.feature.model.common.Result.Builder, com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder> resultBuilder_;
+    /**
+     * <code>.Result result = 1;</code>
+     * @return Whether the result field is set.
+     */
+    public boolean hasResult() {
+      return resultBuilder_ != null || result_ != null;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     * @return The result.
+     */
+    public com.tzld.piaoquan.recommend.feature.model.common.Result getResult() {
+      if (resultBuilder_ == null) {
+        return result_ == null ? com.tzld.piaoquan.recommend.feature.model.common.Result.getDefaultInstance() : result_;
+      } else {
+        return resultBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder setResult(com.tzld.piaoquan.recommend.feature.model.common.Result value) {
+      if (resultBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        result_ = value;
+        onChanged();
+      } else {
+        resultBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder setResult(
+        com.tzld.piaoquan.recommend.feature.model.common.Result.Builder builderForValue) {
+      if (resultBuilder_ == null) {
+        result_ = builderForValue.build();
+        onChanged();
+      } else {
+        resultBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder mergeResult(com.tzld.piaoquan.recommend.feature.model.common.Result value) {
+      if (resultBuilder_ == null) {
+        if (result_ != null) {
+          result_ =
+            com.tzld.piaoquan.recommend.feature.model.common.Result.newBuilder(result_).mergeFrom(value).buildPartial();
+        } else {
+          result_ = value;
+        }
+        onChanged();
+      } else {
+        resultBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public Builder clearResult() {
+      if (resultBuilder_ == null) {
+        result_ = null;
+        onChanged();
+      } else {
+        result_ = null;
+        resultBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.common.Result.Builder getResultBuilder() {
+      
+      onChanged();
+      return getResultFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder getResultOrBuilder() {
+      if (resultBuilder_ != null) {
+        return resultBuilder_.getMessageOrBuilder();
+      } else {
+        return result_ == null ?
+            com.tzld.piaoquan.recommend.feature.model.common.Result.getDefaultInstance() : result_;
+      }
+    }
+    /**
+     * <code>.Result result = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.common.Result, com.tzld.piaoquan.recommend.feature.model.common.Result.Builder, com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder> 
+        getResultFieldBuilder() {
+      if (resultBuilder_ == null) {
+        resultBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.common.Result, com.tzld.piaoquan.recommend.feature.model.common.Result.Builder, com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder>(
+                getResult(),
+                getParentForChildren(),
+                isClean());
+        result_ = null;
+      }
+      return resultBuilder_;
+    }
+
+    private java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto> videoFeature_ =
+      java.util.Collections.emptyList();
+    private void ensureVideoFeatureIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        videoFeature_ = new java.util.ArrayList<com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto>(videoFeature_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProtoOrBuilder> videoFeatureBuilder_;
+
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto> getVideoFeatureList() {
+      if (videoFeatureBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(videoFeature_);
+      } else {
+        return videoFeatureBuilder_.getMessageList();
+      }
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public int getVideoFeatureCount() {
+      if (videoFeatureBuilder_ == null) {
+        return videoFeature_.size();
+      } else {
+        return videoFeatureBuilder_.getCount();
+      }
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto getVideoFeature(int index) {
+      if (videoFeatureBuilder_ == null) {
+        return videoFeature_.get(index);
+      } else {
+        return videoFeatureBuilder_.getMessage(index);
+      }
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public Builder setVideoFeature(
+        int index, com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto value) {
+      if (videoFeatureBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureVideoFeatureIsMutable();
+        videoFeature_.set(index, value);
+        onChanged();
+      } else {
+        videoFeatureBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public Builder setVideoFeature(
+        int index, com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto.Builder builderForValue) {
+      if (videoFeatureBuilder_ == null) {
+        ensureVideoFeatureIsMutable();
+        videoFeature_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        videoFeatureBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public Builder addVideoFeature(com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto value) {
+      if (videoFeatureBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureVideoFeatureIsMutable();
+        videoFeature_.add(value);
+        onChanged();
+      } else {
+        videoFeatureBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public Builder addVideoFeature(
+        int index, com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto value) {
+      if (videoFeatureBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureVideoFeatureIsMutable();
+        videoFeature_.add(index, value);
+        onChanged();
+      } else {
+        videoFeatureBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public Builder addVideoFeature(
+        com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto.Builder builderForValue) {
+      if (videoFeatureBuilder_ == null) {
+        ensureVideoFeatureIsMutable();
+        videoFeature_.add(builderForValue.build());
+        onChanged();
+      } else {
+        videoFeatureBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public Builder addVideoFeature(
+        int index, com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto.Builder builderForValue) {
+      if (videoFeatureBuilder_ == null) {
+        ensureVideoFeatureIsMutable();
+        videoFeature_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        videoFeatureBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public Builder addAllVideoFeature(
+        java.lang.Iterable<? extends com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto> values) {
+      if (videoFeatureBuilder_ == null) {
+        ensureVideoFeatureIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, videoFeature_);
+        onChanged();
+      } else {
+        videoFeatureBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public Builder clearVideoFeature() {
+      if (videoFeatureBuilder_ == null) {
+        videoFeature_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+      } else {
+        videoFeatureBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public Builder removeVideoFeature(int index) {
+      if (videoFeatureBuilder_ == null) {
+        ensureVideoFeatureIsMutable();
+        videoFeature_.remove(index);
+        onChanged();
+      } else {
+        videoFeatureBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto.Builder getVideoFeatureBuilder(
+        int index) {
+      return getVideoFeatureFieldBuilder().getBuilder(index);
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProtoOrBuilder getVideoFeatureOrBuilder(
+        int index) {
+      if (videoFeatureBuilder_ == null) {
+        return videoFeature_.get(index);  } else {
+        return videoFeatureBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public java.util.List<? extends com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProtoOrBuilder> 
+         getVideoFeatureOrBuilderList() {
+      if (videoFeatureBuilder_ != null) {
+        return videoFeatureBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(videoFeature_);
+      }
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto.Builder addVideoFeatureBuilder() {
+      return getVideoFeatureFieldBuilder().addBuilder(
+          com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto.Builder addVideoFeatureBuilder(
+        int index) {
+      return getVideoFeatureFieldBuilder().addBuilder(
+          index, com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+     */
+    public java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto.Builder> 
+         getVideoFeatureBuilderList() {
+      return getVideoFeatureFieldBuilder().getBuilderList();
+    }
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProtoOrBuilder> 
+        getVideoFeatureFieldBuilder() {
+      if (videoFeatureBuilder_ == null) {
+        videoFeatureBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+            com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto, com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto.Builder, com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProtoOrBuilder>(
+                videoFeature_,
+                ((bitField0_ & 0x00000001) != 0),
+                getParentForChildren(),
+                isClean());
+        videoFeature_ = null;
+      }
+      return videoFeatureBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:GetAllVideoFeatureResponse)
+  }
+
+  // @@protoc_insertion_point(class_scope:GetAllVideoFeatureResponse)
+  private static final com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse();
+  }
+
+  public static com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<GetAllVideoFeatureResponse>
+      PARSER = new com.google.protobuf.AbstractParser<GetAllVideoFeatureResponse>() {
+    @java.lang.Override
+    public GetAllVideoFeatureResponse parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new GetAllVideoFeatureResponse(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<GetAllVideoFeatureResponse> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<GetAllVideoFeatureResponse> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.recommend.feature.model.feature.GetAllVideoFeatureResponse getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 48 - 0
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/model/feature/GetAllVideoFeatureResponseOrBuilder.java

@@ -0,0 +1,48 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/recommend/feature/feature.proto
+
+package com.tzld.piaoquan.recommend.feature.model.feature;
+
+public interface GetAllVideoFeatureResponseOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:GetAllVideoFeatureResponse)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>.Result result = 1;</code>
+   * @return Whether the result field is set.
+   */
+  boolean hasResult();
+  /**
+   * <code>.Result result = 1;</code>
+   * @return The result.
+   */
+  com.tzld.piaoquan.recommend.feature.model.common.Result getResult();
+  /**
+   * <code>.Result result = 1;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.common.ResultOrBuilder getResultOrBuilder();
+
+  /**
+   * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+   */
+  java.util.List<com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto> 
+      getVideoFeatureList();
+  /**
+   * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProto getVideoFeature(int index);
+  /**
+   * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+   */
+  int getVideoFeatureCount();
+  /**
+   * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+   */
+  java.util.List<? extends com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProtoOrBuilder> 
+      getVideoFeatureOrBuilderList();
+  /**
+   * <code>repeated .VideoFeatureProto video_feature = 2;</code>
+   */
+  com.tzld.piaoquan.recommend.feature.model.feature.VideoFeatureProtoOrBuilder getVideoFeatureOrBuilder(
+      int index);
+}

+ 10 - 0
recommend-feature-client/src/main/proto/com/tzld/piaoquan/recommend/feature/feature.proto

@@ -41,6 +41,15 @@ message GetVideoFeatureResponse {
   VideoFeatureProto video_feature = 2;
 }
 
+message GetAllVideoFeatureRequest {
+  repeated string video_id = 1;
+}
+
+message GetAllVideoFeatureResponse {
+  Result result = 1;
+  repeated VideoFeatureProto video_feature = 2;
+}
+
 message VideoFeatureProto {
   string video_id = 1;
   string up_id = 2;
@@ -68,5 +77,6 @@ message UserActionFeatureProto{
 service FeatureService {
   rpc GetUserFeature (GetUserFeatureRequest) returns (GetUserFeatureResponse);
   rpc GetVideoFeature (GetVideoFeatureRequest) returns (GetVideoFeatureResponse);
+  rpc GetAllVideoFeature (GetAllVideoFeatureRequest) returns (GetAllVideoFeatureResponse);
 
 }