drive.html 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <!DOCTYPE html>
  2. <html>
  3. <!-- This file is necessary for the contents of the google drive upload window, as it fully contains google's modal window. -->
  4. <head>
  5. <title>Choose a File</title>
  6. <style>
  7. .picker-dialog {
  8. left: 0px !important;
  9. top: 0px !important;
  10. outline: none !important;
  11. border: none !important;
  12. box-shadow: none !important;
  13. }
  14. .picker-dialog, .picker-dialog-content {
  15. width: 100% !important;
  16. height: 100% !important;
  17. }
  18. .center {
  19. position: absolute;
  20. left: 50%;
  21. top: 50%;
  22. transform: translate(-50%, -50%);
  23. margin: 0px;
  24. }
  25. #authorizebutton {
  26. font-size: 36px;
  27. }
  28. </style>
  29. </head>
  30. <body>
  31. <input type="button" id="authorizebutton" class="center" value="Authorize">
  32. <script src="https://apis.google.com/js/api.js"></script>
  33. <script src="https://accounts.google.com/gsi/client"></script>
  34. <script src="tokens.js"></script>
  35. <script>
  36. var queries = Object.fromEntries(window.location.search.substring(1).split("&").map(i => i.split("=")).map(i => i.map(i => i && decodeURIComponent(i))));
  37. var fileTypes = queries.exts ? queries.exts.split(",") : [];
  38. var scope = ["https://www.googleapis.com/auth/drive.readonly"];
  39. var pickerApiLoaded = false;
  40. var oauthToken;
  41. var authorizeButton = document.getElementById("authorizebutton");
  42. authorizeButton.onclick = loadPicker;
  43. function onPickerApiLoad() {
  44. pickerApiLoaded = true;
  45. tryCreatePicker();
  46. }
  47. function handleTokenResponse(tokenResponse) {
  48. if (tokenResponse && tokenResponse.access_token) {
  49. authorizeButton.style.display = "none";
  50. oauthToken = tokenResponse.access_token;
  51. tryCreatePicker();
  52. }
  53. }
  54. function getAuth() {
  55. google.accounts.oauth2.initTokenClient({"client_id": googleOauthClientId, "scope": scope.join(" "), callback: handleTokenResponse}).requestAccessToken();
  56. }
  57. function loadPicker() {
  58. gapi.load("picker", {"callback": onPickerApiLoad});
  59. getAuth();
  60. }
  61. function tryCreatePicker(config) {
  62. if (pickerApiLoaded && oauthToken) {
  63. var picker = new google.picker.PickerBuilder()
  64. .setAppId(googleProjectId)
  65. .setOAuthToken(oauthToken)
  66. .setDeveloperKey(googleApiKey)
  67. .addView(new google.picker.DocsView()
  68. .setIncludeFolders(true)
  69. .setQuery(fileTypes.join(" || "))
  70. )
  71. .enableFeature(google.picker.Feature.NAV_HIDDEN)
  72. .hideTitleBar()
  73. .setCallback(pickerCallback)
  74. .build();
  75. picker.setVisible(true);
  76. }
  77. }
  78. var isDone;
  79. function finish(message, name, data) {
  80. window.opener.postMessage({webretro: {message: message, name: name, data: data}}, "*");
  81. isDone = true;
  82. window.close();
  83. }
  84. window.addEventListener("unload", function() {
  85. if (!isDone) finish("cancelled");
  86. }, false);
  87. function pickerCallback(data) {
  88. if (data.action == google.picker.Action.PICKED) {
  89. document.body.innerHTML += "<h1 class='center'>Loading... Do not close this window.</h1>";
  90. var file = data.docs[0];
  91. var xhr = new XMLHttpRequest();
  92. xhr.open("GET", "https://www.googleapis.com/drive/v3/files/" + file.id + "?alt=media&source=downloadUrl", true);
  93. xhr.setRequestHeader("Authorization", "Bearer " + oauthToken);
  94. xhr.responseType = "arraybuffer";
  95. xhr.onload = function() {
  96. finish("success", file.name, this.response);
  97. }
  98. xhr.onerror = function() {
  99. finish("error");
  100. }
  101. xhr.send();
  102. } else if (data.action == google.picker.Action.CANCEL) {
  103. finish("cancelled");
  104. }
  105. }
  106. </script>
  107. </body>
  108. </html>