code: func (material *Material) AddVideo(filename, title, introduction string) (mediaID string, url string, err error) {
  	var accessToken string
  	accessToken, err = material.GetAccessToken()
  	if err != nil {
  		return
  	}
  
  	uri := fmt.Sprintf("%s?access_token=%s&type=video", addMaterialURL, accessToken)
  
  	videoDesc := &reqVideo{
  		Title:        title,
  		Introduction: introduction,
  	}
  	var fieldValue []byte
  	fieldValue, err = json.Marshal(videoDesc)
  	if err != nil {
  		return
  	}
  
  	fields := []util.MultipartFormField{
  		{
  			IsFile:    true,
  			Fieldname: "video",
  			Filename:  filename,
  		},
  		{
  			IsFile:    true,
  			Fieldname: "description",
  			Value:     fieldValue,
  		},
  	}
  
  	var response []byte
  	response, err = util.PostMultipartForm(fields, uri)
  	if err != nil {
  		return
  	}
  
  	var resMaterial resAddMaterial
  	err = json.Unmarshal(response, &resMaterial)
  	if err != nil {
  		return
  	}
  	if resMaterial.ErrCode != 0 {
  		err = fmt.Errorf("AddMaterial error : errcode=%v , errmsg=%v", resMaterial.ErrCode, resMaterial.ErrMsg)
  		return
  	}
  	mediaID = resMaterial.MediaID
  	url = resMaterial.URL
  	return
  }
docs: //AddVideo 永久视频素材文件上传