@@ -53,21 +53,19 @@ const getAuthTokenFromStorage = async () => {
5353 try {
5454 payload = JSON . parse ( atob ( token . split ( "." ) [ 1 ] ) ) ;
5555 } catch {
56- chrome . identity . getAuthToken ( { interactive : true } , ( newToken ) => {
57- if ( chrome . runtime . lastError )
58- reject ( new Error ( chrome . runtime . lastError ) ) ;
59- else resolve ( newToken ) ;
60- } ) ;
56+ // Token is invalid, sign in again
57+ const newToken = await signIn ( ) ;
58+ if ( ! newToken ) reject ( new Error ( "Sign-in failed" ) ) ;
59+ else resolve ( newToken ) ;
6160 return ;
6261 }
6362
6463 const exp = payload . exp * 1000 ;
6564 if ( Date . now ( ) >= exp ) {
66- chrome . identity . getAuthToken ( { interactive : true } , ( newToken ) => {
67- if ( chrome . runtime . lastError )
68- reject ( new Error ( chrome . runtime . lastError ) ) ;
69- else resolve ( newToken ) ;
70- } ) ;
65+ // Token is expired, sign in again
66+ const newToken = await signIn ( ) ;
67+ if ( ! newToken ) reject ( new Error ( "Sign-in failed" ) ) ;
68+ else resolve ( newToken ) ;
7169 } else {
7270 resolve ( token ) ;
7371 }
@@ -80,46 +78,53 @@ const saveToDrive = async (videoBlob, fileName) => {
8078 const token = await getAuthTokenFromStorage ( ) ;
8179 if ( ! token ) throw new Error ( "Sign-in failed" ) ;
8280
83- // Upload the raw media
81+ const folderId = await findOrCreateScreenityFolder ( token ) ;
82+
83+ const metadata = {
84+ name : fileName ,
85+ parents : [ folderId ] ,
86+ } ;
87+
88+ const boundary = "-------314159265358979323846" ;
89+ const delimiter = `\r\n--${ boundary } \r\n` ;
90+ const close_delim = `\r\n--${ boundary } --` ;
91+
92+ const reader = new FileReader ( ) ;
93+
94+ const base64Data = await new Promise ( ( resolve ) => {
95+ reader . onload = ( e ) => resolve ( e . target . result . split ( "," ) [ 1 ] ) ;
96+ reader . readAsDataURL ( videoBlob ) ;
97+ } ) ;
98+
99+ const multipartBody =
100+ delimiter +
101+ `Content-Type: application/json; charset=UTF-8\r\n\r\n` +
102+ JSON . stringify ( metadata ) +
103+ delimiter +
104+ `Content-Type: ${ videoBlob . type } \r\n` +
105+ `Content-Transfer-Encoding: base64\r\n\r\n` +
106+ base64Data +
107+ close_delim ;
108+
84109 const uploadResponse = await fetch (
85- "https://www.googleapis.com/upload/drive/v3/files?uploadType=media " ,
110+ "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart " ,
86111 {
87112 method : "POST" ,
88113 headers : {
89114 Authorization : `Bearer ${ token } ` ,
90- "Content-Type" : videoBlob . type ,
115+ "Content-Type" : `multipart/related; boundary= ${ boundary } ` ,
91116 } ,
92- body : videoBlob ,
117+ body : multipartBody ,
93118 }
94119 ) ;
95120
96- if ( ! uploadResponse . ok )
121+ if ( ! uploadResponse . ok ) {
97122 throw new Error ( `Upload failed: ${ uploadResponse . status } ` ) ;
123+ }
98124
99125 const { id : fileId } = await uploadResponse . json ( ) ;
100- if ( ! fileId ) throw new Error ( "File ID is undefined" ) ;
101-
102- // Add metadata and move to folder
103- const folderId = await findOrCreateScreenityFolder ( token ) ;
104- const metadataResponse = await fetch (
105- `https://www.googleapis.com/drive/v3/files/${ fileId } ` ,
106- {
107- method : "PATCH" ,
108- headers : {
109- Authorization : `Bearer ${ token } ` ,
110- "Content-Type" : "application/json; charset=UTF-8" ,
111- } ,
112- body : JSON . stringify ( {
113- name : fileName ,
114- parents : [ folderId ] ,
115- } ) ,
116- }
117- ) ;
118-
119- if ( ! metadataResponse . ok )
120- throw new Error ( `Metadata update failed: ${ metadataResponse . status } ` ) ;
126+ if ( ! fileId ) throw new Error ( "File ID missing after upload" ) ;
121127
122- // Open the file in Drive
123128 chrome . tabs . create ( {
124129 url : `https://drive.google.com/file/d/${ fileId } /view` ,
125130 } ) ;
0 commit comments