package com.replaymod.extras.youtube; import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonError; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.googleapis.media.MediaHttpUploader; import com.google.api.client.http.InputStreamContent; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.util.store.DataStoreFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.youtube.YouTube; import com.google.api.services.youtube.YouTubeScopes; import com.google.api.services.youtube.model.Video; import com.google.api.services.youtube.model.VideoSnippet; import com.google.api.services.youtube.model.VideoStatus; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; import com.replaymod.render.RenderSettings; import com.replaymod.render.metadata.MetadataInjector; import lombok.Getter; import lombok.NonNull; import net.minecraft.client.Minecraft; import org.apache.commons.exec.CommandLine; import org.apache.commons.io.FileUtils; import java.io.*; import java.security.GeneralSecurityException; import java.util.Collections; import java.util.concurrent.atomic.AtomicBoolean; public class YoutubeUploader { private static final String CLIENT_ID = "743126594724-mfe7pj1k7e47uu5pk4503c8st9vj9ibu.apps.googleusercontent.com"; private static final String CLIENT_SECRET = "gMwcy3mRYCRamCIjJIYP7rqc"; private static final String FFMPEG_ODS = "-i %s -vf scale=iw:iw*9/16,setdar=16:9 -c:v libx264 -preset slow -crf 16 %s"; private static final JsonFactory JSON_FACTORY = new GsonFactory(); private final NetHttpTransport httpTransport; private final DataStoreFactory dataStoreFactory; private final File videoFile; private final int videoFrames; private final String thumbnailFormat; private final byte[] thumbnailImage; private final RenderSettings settings; private final VideoSnippet videoSnippet; private final VideoVisibility videoVisibility; private Thread thread; @NonNull private Supplier progress = Suppliers.ofInstance(0d); @Getter private State state; @Getter private volatile boolean cancelled; public YoutubeUploader(Minecraft minecraft, File videoFile, int videoFrames, String thumbnailFormat, byte[] thumbnailImage, RenderSettings settings, VideoVisibility videoVisibility, VideoSnippet videoSnippet) throws GeneralSecurityException, IOException { this.videoFile = videoFile; this.videoFrames = videoFrames; this.thumbnailImage = thumbnailImage; this.thumbnailFormat = thumbnailFormat; this.settings = settings; this.videoVisibility = videoVisibility; this.videoSnippet = videoSnippet; this.httpTransport = GoogleNetHttpTransport.newTrustedTransport(); this.dataStoreFactory = new FileDataStoreFactory(minecraft.mcDataDir); } public ListenableFuture