├── src ├── main │ └── java │ │ └── io │ │ └── xtea │ │ └── videoclean │ │ ├── bean │ │ ├── Info.java │ │ ├── Extra.java │ │ ├── Cover.java │ │ ├── CoverHd.java │ │ ├── PlayUrl.java │ │ ├── CoverItem.java │ │ ├── PlayAddr.java │ │ ├── AvatarLarger.java │ │ ├── AvatarMedium.java │ │ ├── AvatarThumb.java │ │ ├── CoverLarge.java │ │ ├── CoverMedium.java │ │ ├── CoverThumb.java │ │ ├── DynamicCover.java │ │ ├── OriginCover.java │ │ ├── RiskInfos.java │ │ ├── Statistics.java │ │ ├── ShareInfo.java │ │ ├── ApiResult.java │ │ ├── TextExtra.java │ │ ├── ChaList.java │ │ ├── Music.java │ │ ├── Video.java │ │ ├── Author.java │ │ └── ItemList.java │ │ └── Douyin.java └── test │ └── java │ └── io │ └── xtea │ └── videoclean │ └── DouyinTest.java ├── README.md ├── .gitignore └── pom.xml /src/main/java/io/xtea/videoclean/bean/Info.java: -------------------------------------------------------------------------------- 1 | package io.xtea.videoclean.bean; 2 | 3 | /** 4 | * TODO: doc this. 5 | * 6 | * @author xtea 7 | * @date 2020-06-29 15:28 8 | */ 9 | public class Info { 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 短视频水印处理工具 2 | 3 | ## 抖音 4 | 5 | 1. 将无水印视频下载到本地 6 | 7 | ```java 8 | // 抖音分享视频地址. 9 | String msgFromDouyin = "#比尔拉塞尔 我现在都可以打爆你们 https://v.douyin.com/JLeEkWY/ " + 10 | "复制此链接,打开【抖音短视频】,直接观看视频!"; 11 | Douyin.downloadVideo(msgFromDouyin, "/tmp/"); 12 | ``` 13 | 14 | 2. 解析抖音短视频信息 15 | 16 | ```java 17 | ApiResult apiResult = Douyin.fetchVideoScheme(msgFromDouyin); 18 | ``` 19 | 返回结果内容参考源[代码](https://github.com/xtea/videoclean/blob/master/src/main/java/io/xtea/videoclean/bean/ApiResult.java) 20 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/Extra.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import com.google.gson.annotations.Expose; 5 | import com.google.gson.annotations.SerializedName; 6 | 7 | public class Extra { 8 | 9 | @SerializedName("now") 10 | @Expose 11 | private Long now; 12 | @SerializedName("logid") 13 | @Expose 14 | private String logid; 15 | 16 | public Long getNow() { 17 | return now; 18 | } 19 | 20 | public void setNow(Long now) { 21 | this.now = now; 22 | } 23 | 24 | public String getLogid() { 25 | return logid; 26 | } 27 | 28 | public void setLogid(String logid) { 29 | this.logid = logid; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/Cover.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | import com.google.gson.annotations.SerializedName; 7 | 8 | public class Cover { 9 | 10 | @SerializedName("url_list") 11 | @Expose 12 | private List urlList = null; 13 | @SerializedName("uri") 14 | @Expose 15 | private String uri; 16 | 17 | public List getUrlList() { 18 | return urlList; 19 | } 20 | 21 | public void setUrlList(List urlList) { 22 | this.urlList = urlList; 23 | } 24 | 25 | public String getUri() { 26 | return uri; 27 | } 28 | 29 | public void setUri(String uri) { 30 | this.uri = uri; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/CoverHd.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | import com.google.gson.annotations.SerializedName; 7 | 8 | public class CoverHd { 9 | 10 | @SerializedName("uri") 11 | @Expose 12 | private String uri; 13 | @SerializedName("url_list") 14 | @Expose 15 | private List urlList = null; 16 | 17 | public String getUri() { 18 | return uri; 19 | } 20 | 21 | public void setUri(String uri) { 22 | this.uri = uri; 23 | } 24 | 25 | public List getUrlList() { 26 | return urlList; 27 | } 28 | 29 | public void setUrlList(List urlList) { 30 | this.urlList = urlList; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/PlayUrl.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | import com.google.gson.annotations.SerializedName; 7 | 8 | public class PlayUrl { 9 | 10 | @SerializedName("uri") 11 | @Expose 12 | private String uri; 13 | @SerializedName("url_list") 14 | @Expose 15 | private List urlList = null; 16 | 17 | public String getUri() { 18 | return uri; 19 | } 20 | 21 | public void setUri(String uri) { 22 | this.uri = uri; 23 | } 24 | 25 | public List getUrlList() { 26 | return urlList; 27 | } 28 | 29 | public void setUrlList(List urlList) { 30 | this.urlList = urlList; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/CoverItem.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | import com.google.gson.annotations.SerializedName; 7 | 8 | public class CoverItem { 9 | 10 | @SerializedName("uri") 11 | @Expose 12 | private String uri; 13 | @SerializedName("url_list") 14 | @Expose 15 | private List urlList = null; 16 | 17 | public String getUri() { 18 | return uri; 19 | } 20 | 21 | public void setUri(String uri) { 22 | this.uri = uri; 23 | } 24 | 25 | public List getUrlList() { 26 | return urlList; 27 | } 28 | 29 | public void setUrlList(List urlList) { 30 | this.urlList = urlList; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/PlayAddr.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | import com.google.gson.annotations.SerializedName; 7 | 8 | public class PlayAddr { 9 | 10 | @SerializedName("uri") 11 | @Expose 12 | private String uri; 13 | @SerializedName("url_list") 14 | @Expose 15 | private List urlList = null; 16 | 17 | public String getUri() { 18 | return uri; 19 | } 20 | 21 | public void setUri(String uri) { 22 | this.uri = uri; 23 | } 24 | 25 | public List getUrlList() { 26 | return urlList; 27 | } 28 | 29 | public void setUrlList(List urlList) { 30 | this.urlList = urlList; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/AvatarLarger.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | import com.google.gson.annotations.SerializedName; 7 | 8 | public class AvatarLarger { 9 | 10 | @SerializedName("url_list") 11 | @Expose 12 | private List urlList = null; 13 | @SerializedName("uri") 14 | @Expose 15 | private String uri; 16 | 17 | public List getUrlList() { 18 | return urlList; 19 | } 20 | 21 | public void setUrlList(List urlList) { 22 | this.urlList = urlList; 23 | } 24 | 25 | public String getUri() { 26 | return uri; 27 | } 28 | 29 | public void setUri(String uri) { 30 | this.uri = uri; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/AvatarMedium.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | import com.google.gson.annotations.SerializedName; 7 | 8 | public class AvatarMedium { 9 | 10 | @SerializedName("uri") 11 | @Expose 12 | private String uri; 13 | @SerializedName("url_list") 14 | @Expose 15 | private List urlList = null; 16 | 17 | public String getUri() { 18 | return uri; 19 | } 20 | 21 | public void setUri(String uri) { 22 | this.uri = uri; 23 | } 24 | 25 | public List getUrlList() { 26 | return urlList; 27 | } 28 | 29 | public void setUrlList(List urlList) { 30 | this.urlList = urlList; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/AvatarThumb.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | import com.google.gson.annotations.SerializedName; 7 | 8 | public class AvatarThumb { 9 | 10 | @SerializedName("uri") 11 | @Expose 12 | private String uri; 13 | @SerializedName("url_list") 14 | @Expose 15 | private List urlList = null; 16 | 17 | public String getUri() { 18 | return uri; 19 | } 20 | 21 | public void setUri(String uri) { 22 | this.uri = uri; 23 | } 24 | 25 | public List getUrlList() { 26 | return urlList; 27 | } 28 | 29 | public void setUrlList(List urlList) { 30 | this.urlList = urlList; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/CoverLarge.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | import com.google.gson.annotations.SerializedName; 7 | 8 | public class CoverLarge { 9 | 10 | @SerializedName("url_list") 11 | @Expose 12 | private List urlList = null; 13 | @SerializedName("uri") 14 | @Expose 15 | private String uri; 16 | 17 | public List getUrlList() { 18 | return urlList; 19 | } 20 | 21 | public void setUrlList(List urlList) { 22 | this.urlList = urlList; 23 | } 24 | 25 | public String getUri() { 26 | return uri; 27 | } 28 | 29 | public void setUri(String uri) { 30 | this.uri = uri; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/CoverMedium.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | import com.google.gson.annotations.SerializedName; 7 | 8 | public class CoverMedium { 9 | 10 | @SerializedName("uri") 11 | @Expose 12 | private String uri; 13 | @SerializedName("url_list") 14 | @Expose 15 | private List urlList = null; 16 | 17 | public String getUri() { 18 | return uri; 19 | } 20 | 21 | public void setUri(String uri) { 22 | this.uri = uri; 23 | } 24 | 25 | public List getUrlList() { 26 | return urlList; 27 | } 28 | 29 | public void setUrlList(List urlList) { 30 | this.urlList = urlList; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/CoverThumb.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | import com.google.gson.annotations.SerializedName; 7 | 8 | public class CoverThumb { 9 | 10 | @SerializedName("uri") 11 | @Expose 12 | private String uri; 13 | @SerializedName("url_list") 14 | @Expose 15 | private List urlList = null; 16 | 17 | public String getUri() { 18 | return uri; 19 | } 20 | 21 | public void setUri(String uri) { 22 | this.uri = uri; 23 | } 24 | 25 | public List getUrlList() { 26 | return urlList; 27 | } 28 | 29 | public void setUrlList(List urlList) { 30 | this.urlList = urlList; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/DynamicCover.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | import com.google.gson.annotations.SerializedName; 7 | 8 | public class DynamicCover { 9 | 10 | @SerializedName("uri") 11 | @Expose 12 | private String uri; 13 | @SerializedName("url_list") 14 | @Expose 15 | private List urlList = null; 16 | 17 | public String getUri() { 18 | return uri; 19 | } 20 | 21 | public void setUri(String uri) { 22 | this.uri = uri; 23 | } 24 | 25 | public List getUrlList() { 26 | return urlList; 27 | } 28 | 29 | public void setUrlList(List urlList) { 30 | this.urlList = urlList; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/OriginCover.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | import com.google.gson.annotations.SerializedName; 7 | 8 | public class OriginCover { 9 | 10 | @SerializedName("uri") 11 | @Expose 12 | private String uri; 13 | @SerializedName("url_list") 14 | @Expose 15 | private List urlList = null; 16 | 17 | public String getUri() { 18 | return uri; 19 | } 20 | 21 | public void setUri(String uri) { 22 | this.uri = uri; 23 | } 24 | 25 | public List getUrlList() { 26 | return urlList; 27 | } 28 | 29 | public void setUrlList(List urlList) { 30 | this.urlList = urlList; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/RiskInfos.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import com.google.gson.annotations.Expose; 5 | import com.google.gson.annotations.SerializedName; 6 | 7 | public class RiskInfos { 8 | 9 | @SerializedName("type") 10 | @Expose 11 | private Long type; 12 | @SerializedName("content") 13 | @Expose 14 | private String content; 15 | @SerializedName("warn") 16 | @Expose 17 | private Boolean warn; 18 | 19 | public Long getType() { 20 | return type; 21 | } 22 | 23 | public void setType(Long type) { 24 | this.type = type; 25 | } 26 | 27 | public String getContent() { 28 | return content; 29 | } 30 | 31 | public void setContent(String content) { 32 | this.content = content; 33 | } 34 | 35 | public Boolean getWarn() { 36 | return warn; 37 | } 38 | 39 | public void setWarn(Boolean warn) { 40 | this.warn = warn; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/Statistics.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import com.google.gson.annotations.Expose; 5 | import com.google.gson.annotations.SerializedName; 6 | 7 | public class Statistics { 8 | 9 | @SerializedName("aweme_id") 10 | @Expose 11 | private String awemeId; 12 | @SerializedName("comment_count") 13 | @Expose 14 | private Long commentCount; 15 | @SerializedName("digg_count") 16 | @Expose 17 | private Long diggCount; 18 | 19 | public String getAwemeId() { 20 | return awemeId; 21 | } 22 | 23 | public void setAwemeId(String awemeId) { 24 | this.awemeId = awemeId; 25 | } 26 | 27 | public Long getCommentCount() { 28 | return commentCount; 29 | } 30 | 31 | public void setCommentCount(Long commentCount) { 32 | this.commentCount = commentCount; 33 | } 34 | 35 | public Long getDiggCount() { 36 | return diggCount; 37 | } 38 | 39 | public void setDiggCount(Long diggCount) { 40 | this.diggCount = diggCount; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/ShareInfo.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import com.google.gson.annotations.Expose; 5 | import com.google.gson.annotations.SerializedName; 6 | 7 | public class ShareInfo { 8 | 9 | @SerializedName("share_weibo_desc") 10 | @Expose 11 | private String shareWeiboDesc; 12 | @SerializedName("share_desc") 13 | @Expose 14 | private String shareDesc; 15 | @SerializedName("share_title") 16 | @Expose 17 | private String shareTitle; 18 | 19 | public String getShareWeiboDesc() { 20 | return shareWeiboDesc; 21 | } 22 | 23 | public void setShareWeiboDesc(String shareWeiboDesc) { 24 | this.shareWeiboDesc = shareWeiboDesc; 25 | } 26 | 27 | public String getShareDesc() { 28 | return shareDesc; 29 | } 30 | 31 | public void setShareDesc(String shareDesc) { 32 | this.shareDesc = shareDesc; 33 | } 34 | 35 | public String getShareTitle() { 36 | return shareTitle; 37 | } 38 | 39 | public void setShareTitle(String shareTitle) { 40 | this.shareTitle = shareTitle; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/ApiResult.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import com.google.gson.annotations.Expose; 5 | import com.google.gson.annotations.SerializedName; 6 | 7 | import java.util.List; 8 | 9 | 10 | // refer to https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=6842888905025506568 11 | public class ApiResult { 12 | 13 | @SerializedName("status_code") 14 | @Expose 15 | private Long statusCode; 16 | @SerializedName("item_list") 17 | @Expose 18 | private List itemList = null; 19 | @SerializedName("extra") 20 | @Expose 21 | private Extra extra; 22 | 23 | public Long getStatusCode() { 24 | return statusCode; 25 | } 26 | 27 | public void setStatusCode(Long statusCode) { 28 | this.statusCode = statusCode; 29 | } 30 | 31 | public List getItemList() { 32 | return itemList; 33 | } 34 | 35 | public void setItemList(List itemList) { 36 | this.itemList = itemList; 37 | } 38 | 39 | public Extra getExtra() { 40 | return extra; 41 | } 42 | 43 | public void setExtra(Extra extra) { 44 | this.extra = extra; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/TextExtra.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import com.google.gson.annotations.Expose; 5 | import com.google.gson.annotations.SerializedName; 6 | 7 | public class TextExtra { 8 | 9 | @SerializedName("start") 10 | @Expose 11 | private Long start; 12 | @SerializedName("end") 13 | @Expose 14 | private Long end; 15 | @SerializedName("type") 16 | @Expose 17 | private Long type; 18 | @SerializedName("hashtag_name") 19 | @Expose 20 | private String hashtagName; 21 | @SerializedName("hashtag_id") 22 | @Expose 23 | private Long hashtagId; 24 | 25 | public Long getStart() { 26 | return start; 27 | } 28 | 29 | public void setStart(Long start) { 30 | this.start = start; 31 | } 32 | 33 | public Long getEnd() { 34 | return end; 35 | } 36 | 37 | public void setEnd(Long end) { 38 | this.end = end; 39 | } 40 | 41 | public Long getType() { 42 | return type; 43 | } 44 | 45 | public void setType(Long type) { 46 | this.type = type; 47 | } 48 | 49 | public String getHashtagName() { 50 | return hashtagName; 51 | } 52 | 53 | public void setHashtagName(String hashtagName) { 54 | this.hashtagName = hashtagName; 55 | } 56 | 57 | public Long getHashtagId() { 58 | return hashtagId; 59 | } 60 | 61 | public void setHashtagId(Long hashtagId) { 62 | this.hashtagId = hashtagId; 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ############################## 2 | ## Java 3 | ############################## 4 | .mtj.tmp/ 5 | *.class 6 | *.jar 7 | *.war 8 | *.ear 9 | *.nar 10 | hs_err_pid* 11 | 12 | ############################## 13 | ## Maven 14 | ############################## 15 | target/ 16 | pom.xml.tag 17 | pom.xml.releaseBackup 18 | pom.xml.versionsBackup 19 | pom.xml.next 20 | pom.xml.bak 21 | release.properties 22 | dependency-reduced-pom.xml 23 | buildNumber.properties 24 | .mvn/timing.properties 25 | .mvn/wrapper/maven-wrapper.jar 26 | 27 | ############################## 28 | ## Gradle 29 | ############################## 30 | bin/ 31 | build/ 32 | .gradle 33 | .gradletasknamecache 34 | gradle-app.setting 35 | !gradle-wrapper.jar 36 | 37 | ############################## 38 | ## IntelliJ 39 | ############################## 40 | out/ 41 | .idea/ 42 | .idea_modules/ 43 | *.iml 44 | *.ipr 45 | *.iws 46 | 47 | ############################## 48 | ## Eclipse 49 | ############################## 50 | .settings/ 51 | bin/ 52 | tmp/ 53 | .metadata 54 | .classpath 55 | .project 56 | *.tmp 57 | *.bak 58 | *.swp 59 | *~.nib 60 | local.properties 61 | .loadpath 62 | .factorypath 63 | 64 | ############################## 65 | ## NetBeans 66 | ############################## 67 | nbproject/private/ 68 | build/ 69 | nbbuild/ 70 | dist/ 71 | nbdist/ 72 | nbactions.xml 73 | nb-configuration.xml 74 | 75 | ############################## 76 | ## Visual Studio Code 77 | ############################## 78 | .vscode/ 79 | .code-workspace 80 | 81 | ############################## 82 | ## OS X 83 | ############################## 84 | .DS_Store -------------------------------------------------------------------------------- /src/test/java/io/xtea/videoclean/DouyinTest.java: -------------------------------------------------------------------------------- 1 | package io.xtea.videoclean; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | import static org.junit.Assert.assertNotNull; 5 | 6 | import io.xtea.videoclean.bean.ApiResult; 7 | 8 | import org.junit.Test; 9 | 10 | import java.io.IOException; 11 | 12 | /** 13 | * TODO: doc this. 14 | * 15 | * @author xtea 16 | * @date 2020-06-29 14:17 17 | */ 18 | public class DouyinTest { 19 | 20 | @Test 21 | public void testParseItemIdFromUrl() { 22 | String url = "https://www.iesdouyin.com/share/video/6519691519585160455/?region=CN&mid=6519692104368098051&u_code=36fi3lehcdfb&titleType=title\n"; 23 | String itemId = Douyin.parseItemIdFromUrl(url); 24 | assertEquals("6519691519585160455", itemId); 25 | } 26 | 27 | @Test 28 | public void testParseItemIdFromUrl2() { 29 | String url = "https://www.iesdouyin.com/share/video/sss/?region=CN&mid=6519692104368098051&u_code=36fi3lehcdfb&titleType=title\n"; 30 | String itemId = Douyin.parseItemIdFromUrl(url); 31 | assertEquals("", itemId); 32 | } 33 | 34 | @Test 35 | public void testShortUrl() throws IOException { 36 | String url = "https://v.douyin.com/JLeDJMo/"; 37 | String ans = Douyin.convertUrl(url); 38 | assertNotNull(ans); 39 | } 40 | 41 | @Test 42 | public void testGet() throws Exception { 43 | ApiResult ans = Douyin.fetchVideoScheme("6519691519585160455"); 44 | System.out.println(ans); 45 | assertNotNull(ans); 46 | } 47 | 48 | @Test 49 | public void testExtract() { 50 | String msg = "#比尔拉塞尔 我现在都可以打爆你们 https://v.douyin.com/JLeEkWY/ 复制此链接,打开【抖音短视频】,直接观看视频!"; 51 | String url = Douyin.extractUrl(msg); 52 | assertEquals("https://v.douyin.com/JLeEkWY/", url); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | io.xtea 8 | videocleaner 9 | 1.0-SNAPSHOT 10 | 11 | 1.8 12 | 1.8 13 | 14 | 15 | 16 | 17 | org.jsoup 18 | jsoup 19 | 1.15.3 20 | 21 | 22 | 23 | com.google.code.gson 24 | gson 25 | 2.8.6 26 | 27 | 28 | junit 29 | junit 30 | 4.12 31 | 32 | 33 | org.apache.commons 34 | commons-lang3 35 | 3.10 36 | 37 | 38 | 39 | commons-io 40 | commons-io 41 | 2.6 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/ChaList.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import com.google.gson.annotations.Expose; 5 | import com.google.gson.annotations.SerializedName; 6 | 7 | public class ChaList { 8 | 9 | @SerializedName("user_count") 10 | @Expose 11 | private Long userCount; 12 | @SerializedName("is_commerce") 13 | @Expose 14 | private Boolean isCommerce; 15 | @SerializedName("desc") 16 | @Expose 17 | private String desc; 18 | @SerializedName("cha_name") 19 | @Expose 20 | private String chaName; 21 | @SerializedName("connect_music") 22 | @Expose 23 | private Object connectMusic; 24 | @SerializedName("type") 25 | @Expose 26 | private Long type; 27 | @SerializedName("cover_item") 28 | @Expose 29 | private CoverItem coverItem; 30 | @SerializedName("view_count") 31 | @Expose 32 | private Long viewCount; 33 | @SerializedName("hash_tag_profile") 34 | @Expose 35 | private String hashTagProfile; 36 | @SerializedName("cid") 37 | @Expose 38 | private String cid; 39 | 40 | public Long getUserCount() { 41 | return userCount; 42 | } 43 | 44 | public void setUserCount(Long userCount) { 45 | this.userCount = userCount; 46 | } 47 | 48 | public Boolean getIsCommerce() { 49 | return isCommerce; 50 | } 51 | 52 | public void setIsCommerce(Boolean isCommerce) { 53 | this.isCommerce = isCommerce; 54 | } 55 | 56 | public String getDesc() { 57 | return desc; 58 | } 59 | 60 | public void setDesc(String desc) { 61 | this.desc = desc; 62 | } 63 | 64 | public String getChaName() { 65 | return chaName; 66 | } 67 | 68 | public void setChaName(String chaName) { 69 | this.chaName = chaName; 70 | } 71 | 72 | public Object getConnectMusic() { 73 | return connectMusic; 74 | } 75 | 76 | public void setConnectMusic(Object connectMusic) { 77 | this.connectMusic = connectMusic; 78 | } 79 | 80 | public Long getType() { 81 | return type; 82 | } 83 | 84 | public void setType(Long type) { 85 | this.type = type; 86 | } 87 | 88 | public CoverItem getCoverItem() { 89 | return coverItem; 90 | } 91 | 92 | public void setCoverItem(CoverItem coverItem) { 93 | this.coverItem = coverItem; 94 | } 95 | 96 | public Long getViewCount() { 97 | return viewCount; 98 | } 99 | 100 | public void setViewCount(Long viewCount) { 101 | this.viewCount = viewCount; 102 | } 103 | 104 | public String getHashTagProfile() { 105 | return hashTagProfile; 106 | } 107 | 108 | public void setHashTagProfile(String hashTagProfile) { 109 | this.hashTagProfile = hashTagProfile; 110 | } 111 | 112 | public String getCid() { 113 | return cid; 114 | } 115 | 116 | public void setCid(String cid) { 117 | this.cid = cid; 118 | } 119 | 120 | } 121 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/Music.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import com.google.gson.annotations.Expose; 5 | import com.google.gson.annotations.SerializedName; 6 | 7 | public class Music { 8 | 9 | @SerializedName("cover_large") 10 | @Expose 11 | private CoverLarge coverLarge; 12 | @SerializedName("duration") 13 | @Expose 14 | private Long duration; 15 | @SerializedName("status") 16 | @Expose 17 | private Long status; 18 | @SerializedName("id") 19 | @Expose 20 | private Long id; 21 | @SerializedName("mid") 22 | @Expose 23 | private String mid; 24 | @SerializedName("title") 25 | @Expose 26 | private String title; 27 | @SerializedName("cover_hd") 28 | @Expose 29 | private CoverHd coverHd; 30 | @SerializedName("position") 31 | @Expose 32 | private Object position; 33 | @SerializedName("author") 34 | @Expose 35 | private String author; 36 | @SerializedName("cover_medium") 37 | @Expose 38 | private CoverMedium coverMedium; 39 | @SerializedName("cover_thumb") 40 | @Expose 41 | private CoverThumb coverThumb; 42 | @SerializedName("play_url") 43 | @Expose 44 | private PlayUrl playUrl; 45 | 46 | public CoverLarge getCoverLarge() { 47 | return coverLarge; 48 | } 49 | 50 | public void setCoverLarge(CoverLarge coverLarge) { 51 | this.coverLarge = coverLarge; 52 | } 53 | 54 | public Long getDuration() { 55 | return duration; 56 | } 57 | 58 | public void setDuration(Long duration) { 59 | this.duration = duration; 60 | } 61 | 62 | public Long getStatus() { 63 | return status; 64 | } 65 | 66 | public void setStatus(Long status) { 67 | this.status = status; 68 | } 69 | 70 | public Long getId() { 71 | return id; 72 | } 73 | 74 | public void setId(Long id) { 75 | this.id = id; 76 | } 77 | 78 | public String getMid() { 79 | return mid; 80 | } 81 | 82 | public void setMid(String mid) { 83 | this.mid = mid; 84 | } 85 | 86 | public String getTitle() { 87 | return title; 88 | } 89 | 90 | public void setTitle(String title) { 91 | this.title = title; 92 | } 93 | 94 | public CoverHd getCoverHd() { 95 | return coverHd; 96 | } 97 | 98 | public void setCoverHd(CoverHd coverHd) { 99 | this.coverHd = coverHd; 100 | } 101 | 102 | public Object getPosition() { 103 | return position; 104 | } 105 | 106 | public void setPosition(Object position) { 107 | this.position = position; 108 | } 109 | 110 | public String getAuthor() { 111 | return author; 112 | } 113 | 114 | public void setAuthor(String author) { 115 | this.author = author; 116 | } 117 | 118 | public CoverMedium getCoverMedium() { 119 | return coverMedium; 120 | } 121 | 122 | public void setCoverMedium(CoverMedium coverMedium) { 123 | this.coverMedium = coverMedium; 124 | } 125 | 126 | public CoverThumb getCoverThumb() { 127 | return coverThumb; 128 | } 129 | 130 | public void setCoverThumb(CoverThumb coverThumb) { 131 | this.coverThumb = coverThumb; 132 | } 133 | 134 | public PlayUrl getPlayUrl() { 135 | return playUrl; 136 | } 137 | 138 | public void setPlayUrl(PlayUrl playUrl) { 139 | this.playUrl = playUrl; 140 | } 141 | 142 | } 143 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/Video.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import com.google.gson.annotations.Expose; 5 | import com.google.gson.annotations.SerializedName; 6 | 7 | public class Video { 8 | 9 | @SerializedName("vid") 10 | @Expose 11 | private String vid; 12 | @SerializedName("is_long_video") 13 | @Expose 14 | private Long isLongVideo; 15 | @SerializedName("cover") 16 | @Expose 17 | private Cover cover; 18 | @SerializedName("width") 19 | @Expose 20 | private Long width; 21 | @SerializedName("dynamic_cover") 22 | @Expose 23 | private DynamicCover dynamicCover; 24 | @SerializedName("bit_rate") 25 | @Expose 26 | private Object bitRate; 27 | @SerializedName("duration") 28 | @Expose 29 | private Long duration; 30 | @SerializedName("play_addr") 31 | @Expose 32 | private PlayAddr playAddr; 33 | @SerializedName("height") 34 | @Expose 35 | private Long height; 36 | @SerializedName("origin_cover") 37 | @Expose 38 | private OriginCover originCover; 39 | @SerializedName("ratio") 40 | @Expose 41 | private String ratio; 42 | @SerializedName("has_watermark") 43 | @Expose 44 | private Boolean hasWatermark; 45 | 46 | public String getVid() { 47 | return vid; 48 | } 49 | 50 | public void setVid(String vid) { 51 | this.vid = vid; 52 | } 53 | 54 | public Long getIsLongVideo() { 55 | return isLongVideo; 56 | } 57 | 58 | public void setIsLongVideo(Long isLongVideo) { 59 | this.isLongVideo = isLongVideo; 60 | } 61 | 62 | public Cover getCover() { 63 | return cover; 64 | } 65 | 66 | public void setCover(Cover cover) { 67 | this.cover = cover; 68 | } 69 | 70 | public Long getWidth() { 71 | return width; 72 | } 73 | 74 | public void setWidth(Long width) { 75 | this.width = width; 76 | } 77 | 78 | public DynamicCover getDynamicCover() { 79 | return dynamicCover; 80 | } 81 | 82 | public void setDynamicCover(DynamicCover dynamicCover) { 83 | this.dynamicCover = dynamicCover; 84 | } 85 | 86 | public Object getBitRate() { 87 | return bitRate; 88 | } 89 | 90 | public void setBitRate(Object bitRate) { 91 | this.bitRate = bitRate; 92 | } 93 | 94 | public Long getDuration() { 95 | return duration; 96 | } 97 | 98 | public void setDuration(Long duration) { 99 | this.duration = duration; 100 | } 101 | 102 | public PlayAddr getPlayAddr() { 103 | return playAddr; 104 | } 105 | 106 | public void setPlayAddr(PlayAddr playAddr) { 107 | this.playAddr = playAddr; 108 | } 109 | 110 | public Long getHeight() { 111 | return height; 112 | } 113 | 114 | public void setHeight(Long height) { 115 | this.height = height; 116 | } 117 | 118 | public OriginCover getOriginCover() { 119 | return originCover; 120 | } 121 | 122 | public void setOriginCover(OriginCover originCover) { 123 | this.originCover = originCover; 124 | } 125 | 126 | public String getRatio() { 127 | return ratio; 128 | } 129 | 130 | public void setRatio(String ratio) { 131 | this.ratio = ratio; 132 | } 133 | 134 | public Boolean getHasWatermark() { 135 | return hasWatermark; 136 | } 137 | 138 | public void setHasWatermark(Boolean hasWatermark) { 139 | this.hasWatermark = hasWatermark; 140 | } 141 | 142 | } 143 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/Author.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import com.google.gson.annotations.Expose; 5 | import com.google.gson.annotations.SerializedName; 6 | 7 | public class Author { 8 | 9 | @SerializedName("avatar_medium") 10 | @Expose 11 | private AvatarMedium avatarMedium; 12 | @SerializedName("unique_id") 13 | @Expose 14 | private String uniqueId; 15 | @SerializedName("followers_detail") 16 | @Expose 17 | private Object followersDetail; 18 | @SerializedName("nickname") 19 | @Expose 20 | private String nickname; 21 | @SerializedName("short_id") 22 | @Expose 23 | private String shortId; 24 | @SerializedName("signature") 25 | @Expose 26 | private String signature; 27 | @SerializedName("avatar_larger") 28 | @Expose 29 | private AvatarLarger avatarLarger; 30 | @SerializedName("avatar_thumb") 31 | @Expose 32 | private AvatarThumb avatarThumb; 33 | @SerializedName("platform_sync_info") 34 | @Expose 35 | private Object platformSyncInfo; 36 | @SerializedName("geofencing") 37 | @Expose 38 | private Object geofencing; 39 | @SerializedName("policy_version") 40 | @Expose 41 | private Object policyVersion; 42 | @SerializedName("uid") 43 | @Expose 44 | private String uid; 45 | @SerializedName("type_label") 46 | @Expose 47 | private Object typeLabel; 48 | 49 | public AvatarMedium getAvatarMedium() { 50 | return avatarMedium; 51 | } 52 | 53 | public void setAvatarMedium(AvatarMedium avatarMedium) { 54 | this.avatarMedium = avatarMedium; 55 | } 56 | 57 | public String getUniqueId() { 58 | return uniqueId; 59 | } 60 | 61 | public void setUniqueId(String uniqueId) { 62 | this.uniqueId = uniqueId; 63 | } 64 | 65 | public Object getFollowersDetail() { 66 | return followersDetail; 67 | } 68 | 69 | public void setFollowersDetail(Object followersDetail) { 70 | this.followersDetail = followersDetail; 71 | } 72 | 73 | public String getNickname() { 74 | return nickname; 75 | } 76 | 77 | public void setNickname(String nickname) { 78 | this.nickname = nickname; 79 | } 80 | 81 | public String getShortId() { 82 | return shortId; 83 | } 84 | 85 | public void setShortId(String shortId) { 86 | this.shortId = shortId; 87 | } 88 | 89 | public String getSignature() { 90 | return signature; 91 | } 92 | 93 | public void setSignature(String signature) { 94 | this.signature = signature; 95 | } 96 | 97 | public AvatarLarger getAvatarLarger() { 98 | return avatarLarger; 99 | } 100 | 101 | public void setAvatarLarger(AvatarLarger avatarLarger) { 102 | this.avatarLarger = avatarLarger; 103 | } 104 | 105 | public AvatarThumb getAvatarThumb() { 106 | return avatarThumb; 107 | } 108 | 109 | public void setAvatarThumb(AvatarThumb avatarThumb) { 110 | this.avatarThumb = avatarThumb; 111 | } 112 | 113 | public Object getPlatformSyncInfo() { 114 | return platformSyncInfo; 115 | } 116 | 117 | public void setPlatformSyncInfo(Object platformSyncInfo) { 118 | this.platformSyncInfo = platformSyncInfo; 119 | } 120 | 121 | public Object getGeofencing() { 122 | return geofencing; 123 | } 124 | 125 | public void setGeofencing(Object geofencing) { 126 | this.geofencing = geofencing; 127 | } 128 | 129 | public Object getPolicyVersion() { 130 | return policyVersion; 131 | } 132 | 133 | public void setPolicyVersion(Object policyVersion) { 134 | this.policyVersion = policyVersion; 135 | } 136 | 137 | public String getUid() { 138 | return uid; 139 | } 140 | 141 | public void setUid(String uid) { 142 | this.uid = uid; 143 | } 144 | 145 | public Object getTypeLabel() { 146 | return typeLabel; 147 | } 148 | 149 | public void setTypeLabel(Object typeLabel) { 150 | this.typeLabel = typeLabel; 151 | } 152 | 153 | } 154 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/Douyin.java: -------------------------------------------------------------------------------- 1 | package io.xtea.videoclean; 2 | 3 | import com.google.gson.Gson; 4 | import io.xtea.videoclean.bean.ApiResult; 5 | import io.xtea.videoclean.bean.ItemList; 6 | 7 | import org.apache.commons.lang3.StringUtils; 8 | import org.jsoup.Jsoup; 9 | 10 | import java.io.BufferedInputStream; 11 | import java.io.BufferedOutputStream; 12 | import java.io.BufferedReader; 13 | import java.io.File; 14 | import java.io.FileOutputStream; 15 | import java.io.IOException; 16 | import java.io.InputStreamReader; 17 | import java.io.OutputStream; 18 | import java.net.HttpURLConnection; 19 | import java.net.URL; 20 | import java.net.URLConnection; 21 | import java.util.HashMap; 22 | import java.util.Map; 23 | 24 | /** 25 | * 抖音视频去除水印工具. 26 | * 27 | * @author xtea 28 | * @date 2020-06-28 16:33 29 | */ 30 | public class Douyin { 31 | 32 | 33 | public static final String UA = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16D57 Version/12.0 Safari/604.1"; 34 | public static final String API = "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids="; 35 | 36 | 37 | static class Result { 38 | public String videoUrl; 39 | public String musicUrl; 40 | public String name; 41 | 42 | @Override 43 | public String toString() { 44 | final StringBuilder sb = new StringBuilder("Result{"); 45 | sb.append("videoUrl='").append(videoUrl).append('\''); 46 | sb.append(", musicUrl='").append(musicUrl).append('\''); 47 | sb.append(", name='").append(name).append('\''); 48 | sb.append('}'); 49 | return sb.toString(); 50 | } 51 | } 52 | 53 | 54 | public static void main(String[] args) throws IOException { 55 | String msgFromDouyin = "#比尔拉塞尔 我现在都可以打爆你们 https://v.douyin.com/JLeEkWY/ " + 56 | "复制此链接,打开【抖音短视频】,直接观看视频!"; 57 | Douyin.downloadVideo(msgFromDouyin, "/tmp/"); 58 | 59 | ApiResult apiResult = Douyin.fetchVideoScheme(msgFromDouyin); 60 | } 61 | 62 | 63 | /** 64 | * 远程获取无水印视频地址. 65 | * 66 | * @param shareInfo 67 | * @return 68 | */ 69 | public static ApiResult fetchVideoScheme(String shareInfo) { 70 | try { 71 | String shortUrl = extractUrl(shareInfo); 72 | String originUrl = convertUrl(shortUrl); 73 | String itemId = parseItemIdFromUrl(originUrl); 74 | ApiResult apiBean = requestToAPI(itemId); 75 | return apiBean; 76 | } catch (Exception e) { 77 | e.printStackTrace(); 78 | } 79 | return null; 80 | } 81 | 82 | public static Result fetch(String shareInfo) { 83 | try { 84 | String shortUrl = extractUrl(shareInfo); 85 | String originUrl = convertUrl(shortUrl); 86 | String itemId = parseItemIdFromUrl(originUrl); 87 | ApiResult apiBean = requestToAPI(itemId); 88 | Result result = new Result(); 89 | ItemList item = apiBean.getItemList().get(0); 90 | result.name = item.getShareInfo().getShareTitle(); 91 | String originVideoUrl = item.getVideo().getPlayAddr().getUrlList().get(0); 92 | // 去水印视频转换. 93 | result.videoUrl = originVideoUrl.replace("playwm", "play"); 94 | result.musicUrl = item.getMusic().getPlayUrl().getUri(); 95 | return result; 96 | } catch (Exception e) { 97 | e.printStackTrace(); 98 | } 99 | return null; 100 | } 101 | 102 | /** 103 | * 下载抖音无水印视频到某个路径下. 104 | * 105 | * @param shareInfo 106 | * @param saveToFolder 107 | */ 108 | public static void downloadVideo(String shareInfo, String saveToFolder) throws IOException { 109 | Result result = fetch(shareInfo); 110 | if (result != null) { 111 | Map headers = new HashMap<>(); 112 | headers.put("Connection", "keep-alive"); 113 | headers.put("Host", "aweme.snssdk.com"); 114 | headers.put("User-Agent", UA); 115 | BufferedInputStream in = Jsoup.connect(result.videoUrl) 116 | .headers(headers).timeout(10000) 117 | .ignoreContentType(true).execute().bodyStream(); 118 | 119 | File file = new File(saveToFolder + "/" + result.name + ".mp4"); 120 | OutputStream out = new BufferedOutputStream(new FileOutputStream(file)); 121 | int b; 122 | while ((b = in.read()) != -1) { 123 | out.write(b); 124 | } 125 | out.close(); 126 | in.close(); 127 | System.out.println("save file to " + file.getAbsolutePath()); 128 | } 129 | } 130 | 131 | 132 | /** 133 | * 从路径中提取itemId 134 | * 135 | * @param url 136 | * @return 137 | */ 138 | public static String parseItemIdFromUrl(String url) { 139 | // https://www.iesdouyin.com/share/video/6519691519585160455/?region=CN&mid=6519692104368098051&u_code=36fi3lehcdfb&titleType=title 140 | String ans = ""; 141 | String[] strings = url.split("/"); 142 | // after video. 143 | for (String string : strings) { 144 | if (StringUtils.isNumeric(string)) { 145 | return string; 146 | } 147 | } 148 | return ans; 149 | } 150 | 151 | /** 152 | * 短连接转换成长地址 153 | * 154 | * @param shortURL 155 | * @return 156 | * @throws IOException 157 | */ 158 | public static String convertUrl(String shortURL) throws IOException { 159 | URL inputURL = new URL(shortURL); 160 | URLConnection urlConn = inputURL.openConnection(); 161 | System.out.println("Short URL: " + shortURL); 162 | urlConn.getHeaderFields(); 163 | String ans = urlConn.getURL().toString(); 164 | System.out.println("Original URL: " + ans); 165 | return ans; 166 | } 167 | 168 | /** 169 | * 抽取URL 170 | * 171 | * @param rawInfo 172 | * @return 173 | */ 174 | public static String extractUrl(String rawInfo) { 175 | if (StringUtils.isBlank(rawInfo)) { 176 | return StringUtils.EMPTY; 177 | } 178 | for (String string : rawInfo.split(" ")) { 179 | if (string.startsWith("http")) { 180 | return string; 181 | } 182 | } 183 | return StringUtils.EMPTY; 184 | } 185 | 186 | /** 187 | * 解析抖音API获取视频结果. 188 | * 189 | * @param itemId 190 | * @return 191 | * @throws Exception 192 | */ 193 | public static ApiResult requestToAPI(String itemId) throws Exception { 194 | String url = API + itemId; 195 | HttpURLConnection httpClient = 196 | (HttpURLConnection) new URL(url).openConnection(); 197 | // optional default is GET 198 | httpClient.setRequestMethod("GET"); 199 | 200 | //add request header 201 | httpClient.setRequestProperty("User-Agent", UA); 202 | 203 | int responseCode = httpClient.getResponseCode(); 204 | System.out.println("Response Code : " + responseCode); 205 | 206 | try (BufferedReader in = new BufferedReader( 207 | new InputStreamReader(httpClient.getInputStream()))) { 208 | StringBuilder response = new StringBuilder(); 209 | String line; 210 | 211 | while ((line = in.readLine()) != null) { 212 | response.append(line); 213 | } 214 | //print result 215 | ApiResult apiBean = new Gson().fromJson(response.toString(), ApiResult.class); 216 | return apiBean; 217 | } 218 | } 219 | } 220 | -------------------------------------------------------------------------------- /src/main/java/io/xtea/videoclean/bean/ItemList.java: -------------------------------------------------------------------------------- 1 | 2 | package io.xtea.videoclean.bean; 3 | 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | import com.google.gson.annotations.SerializedName; 7 | 8 | public class ItemList { 9 | 10 | @SerializedName("video") 11 | @Expose 12 | private Video video; 13 | @SerializedName("category") 14 | @Expose 15 | private Long category; 16 | @SerializedName("share_url") 17 | @Expose 18 | private String shareUrl; 19 | @SerializedName("is_preview") 20 | @Expose 21 | private Long isPreview; 22 | @SerializedName("is_live_replay") 23 | @Expose 24 | private Boolean isLiveReplay; 25 | @SerializedName("create_time") 26 | @Expose 27 | private Long createTime; 28 | @SerializedName("aweme_type") 29 | @Expose 30 | private Long awemeType; 31 | @SerializedName("author_user_id") 32 | @Expose 33 | private Long authorUserId; 34 | @SerializedName("author") 35 | @Expose 36 | private Author author; 37 | @SerializedName("statistics") 38 | @Expose 39 | private Statistics statistics; 40 | @SerializedName("share_info") 41 | @Expose 42 | private ShareInfo shareInfo; 43 | @SerializedName("position") 44 | @Expose 45 | private Object position; 46 | @SerializedName("video_text") 47 | @Expose 48 | private Object videoText; 49 | @SerializedName("long_video") 50 | @Expose 51 | private Object longVideo; 52 | @SerializedName("aweme_id") 53 | @Expose 54 | private String awemeId; 55 | @SerializedName("music") 56 | @Expose 57 | private Music music; 58 | @SerializedName("text_extra") 59 | @Expose 60 | private List textExtra = null; 61 | @SerializedName("duration") 62 | @Expose 63 | private Long duration; 64 | @SerializedName("uniqid_position") 65 | @Expose 66 | private Object uniqidPosition; 67 | @SerializedName("cha_list") 68 | @Expose 69 | private List chaList = null; 70 | @SerializedName("image_infos") 71 | @Expose 72 | private Object imageInfos; 73 | @SerializedName("promotions") 74 | @Expose 75 | private Object promotions; 76 | @SerializedName("forward_id") 77 | @Expose 78 | private String forwardId; 79 | @SerializedName("desc") 80 | @Expose 81 | private String desc; 82 | @SerializedName("video_labels") 83 | @Expose 84 | private Object videoLabels; 85 | @SerializedName("geofencing") 86 | @Expose 87 | private Object geofencing; 88 | @SerializedName("label_top_text") 89 | @Expose 90 | private Object labelTopText; 91 | @SerializedName("group_id") 92 | @Expose 93 | private Long groupId; 94 | @SerializedName("risk_infos") 95 | @Expose 96 | private RiskInfos riskInfos; 97 | @SerializedName("comment_list") 98 | @Expose 99 | private Object commentList; 100 | 101 | public Video getVideo() { 102 | return video; 103 | } 104 | 105 | public void setVideo(Video video) { 106 | this.video = video; 107 | } 108 | 109 | public Long getCategory() { 110 | return category; 111 | } 112 | 113 | public void setCategory(Long category) { 114 | this.category = category; 115 | } 116 | 117 | public String getShareUrl() { 118 | return shareUrl; 119 | } 120 | 121 | public void setShareUrl(String shareUrl) { 122 | this.shareUrl = shareUrl; 123 | } 124 | 125 | public Long getIsPreview() { 126 | return isPreview; 127 | } 128 | 129 | public void setIsPreview(Long isPreview) { 130 | this.isPreview = isPreview; 131 | } 132 | 133 | public Boolean getIsLiveReplay() { 134 | return isLiveReplay; 135 | } 136 | 137 | public void setIsLiveReplay(Boolean isLiveReplay) { 138 | this.isLiveReplay = isLiveReplay; 139 | } 140 | 141 | public Long getCreateTime() { 142 | return createTime; 143 | } 144 | 145 | public void setCreateTime(Long createTime) { 146 | this.createTime = createTime; 147 | } 148 | 149 | public Long getAwemeType() { 150 | return awemeType; 151 | } 152 | 153 | public void setAwemeType(Long awemeType) { 154 | this.awemeType = awemeType; 155 | } 156 | 157 | public Long getAuthorUserId() { 158 | return authorUserId; 159 | } 160 | 161 | public void setAuthorUserId(Long authorUserId) { 162 | this.authorUserId = authorUserId; 163 | } 164 | 165 | public Author getAuthor() { 166 | return author; 167 | } 168 | 169 | public void setAuthor(Author author) { 170 | this.author = author; 171 | } 172 | 173 | public Statistics getStatistics() { 174 | return statistics; 175 | } 176 | 177 | public void setStatistics(Statistics statistics) { 178 | this.statistics = statistics; 179 | } 180 | 181 | public ShareInfo getShareInfo() { 182 | return shareInfo; 183 | } 184 | 185 | public void setShareInfo(ShareInfo shareInfo) { 186 | this.shareInfo = shareInfo; 187 | } 188 | 189 | public Object getPosition() { 190 | return position; 191 | } 192 | 193 | public void setPosition(Object position) { 194 | this.position = position; 195 | } 196 | 197 | public Object getVideoText() { 198 | return videoText; 199 | } 200 | 201 | public void setVideoText(Object videoText) { 202 | this.videoText = videoText; 203 | } 204 | 205 | public Object getLongVideo() { 206 | return longVideo; 207 | } 208 | 209 | public void setLongVideo(Object longVideo) { 210 | this.longVideo = longVideo; 211 | } 212 | 213 | public String getAwemeId() { 214 | return awemeId; 215 | } 216 | 217 | public void setAwemeId(String awemeId) { 218 | this.awemeId = awemeId; 219 | } 220 | 221 | public Music getMusic() { 222 | return music; 223 | } 224 | 225 | public void setMusic(Music music) { 226 | this.music = music; 227 | } 228 | 229 | public List getTextExtra() { 230 | return textExtra; 231 | } 232 | 233 | public void setTextExtra(List textExtra) { 234 | this.textExtra = textExtra; 235 | } 236 | 237 | public Long getDuration() { 238 | return duration; 239 | } 240 | 241 | public void setDuration(Long duration) { 242 | this.duration = duration; 243 | } 244 | 245 | public Object getUniqidPosition() { 246 | return uniqidPosition; 247 | } 248 | 249 | public void setUniqidPosition(Object uniqidPosition) { 250 | this.uniqidPosition = uniqidPosition; 251 | } 252 | 253 | public List getChaList() { 254 | return chaList; 255 | } 256 | 257 | public void setChaList(List chaList) { 258 | this.chaList = chaList; 259 | } 260 | 261 | public Object getImageInfos() { 262 | return imageInfos; 263 | } 264 | 265 | public void setImageInfos(Object imageInfos) { 266 | this.imageInfos = imageInfos; 267 | } 268 | 269 | public Object getPromotions() { 270 | return promotions; 271 | } 272 | 273 | public void setPromotions(Object promotions) { 274 | this.promotions = promotions; 275 | } 276 | 277 | public String getForwardId() { 278 | return forwardId; 279 | } 280 | 281 | public void setForwardId(String forwardId) { 282 | this.forwardId = forwardId; 283 | } 284 | 285 | public String getDesc() { 286 | return desc; 287 | } 288 | 289 | public void setDesc(String desc) { 290 | this.desc = desc; 291 | } 292 | 293 | public Object getVideoLabels() { 294 | return videoLabels; 295 | } 296 | 297 | public void setVideoLabels(Object videoLabels) { 298 | this.videoLabels = videoLabels; 299 | } 300 | 301 | public Object getGeofencing() { 302 | return geofencing; 303 | } 304 | 305 | public void setGeofencing(Object geofencing) { 306 | this.geofencing = geofencing; 307 | } 308 | 309 | public Object getLabelTopText() { 310 | return labelTopText; 311 | } 312 | 313 | public void setLabelTopText(Object labelTopText) { 314 | this.labelTopText = labelTopText; 315 | } 316 | 317 | public Long getGroupId() { 318 | return groupId; 319 | } 320 | 321 | public void setGroupId(Long groupId) { 322 | this.groupId = groupId; 323 | } 324 | 325 | public RiskInfos getRiskInfos() { 326 | return riskInfos; 327 | } 328 | 329 | public void setRiskInfos(RiskInfos riskInfos) { 330 | this.riskInfos = riskInfos; 331 | } 332 | 333 | public Object getCommentList() { 334 | return commentList; 335 | } 336 | 337 | public void setCommentList(Object commentList) { 338 | this.commentList = commentList; 339 | } 340 | 341 | } 342 | --------------------------------------------------------------------------------