From 06900ca594d33d39cc905c5316c13a7cb9cf460e Mon Sep 17 00:00:00 2001 From: nleva Date: Mon, 19 Jan 2026 19:17:44 +0100 Subject: [PATCH 1/3] Add support for Markdown file type and MIME type --- src/common/drive_file.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/common/drive_file.rs b/src/common/drive_file.rs index 6278b63..65d80ae 100644 --- a/src/common/drive_file.rs +++ b/src/common/drive_file.rs @@ -28,6 +28,7 @@ pub const EXTENSION_PPTX: &str = "pptx"; pub const EXTENSION_ODP: &str = "odp"; pub const EXTENSION_EPUB: &str = "epub"; pub const EXTENSION_TXT: &str = "txt"; +pub const EXTENSION_MD: &str = "md"; pub const MIME_TYPE_DOC: &str = "application/msword"; pub const MIME_TYPE_DOCX: &str = @@ -52,6 +53,7 @@ pub const MIME_TYPE_PPTX: &str = pub const MIME_TYPE_ODP: &str = "application/vnd.oasis.opendocument.presentation"; pub const MIME_TYPE_EPUB: &str = "application/epub+zip"; pub const MIME_TYPE_TXT: &str = "text/plain"; +pub const MIME_TYPE_MD: &str = "text/markdown"; #[derive(Debug, Clone, PartialEq, Eq)] pub enum DocType { @@ -134,6 +136,7 @@ impl DocType { FileExtension::Rtf, FileExtension::Txt, FileExtension::Html, + FileExtension::Md, ], DocType::Spreadsheet => vec![ @@ -194,6 +197,7 @@ pub enum FileExtension { Odp, Epub, Txt, + Md, } impl fmt::Display for FileExtension { @@ -219,6 +223,7 @@ impl fmt::Display for FileExtension { FileExtension::Odp => write!(f, "{}", EXTENSION_ODP), FileExtension::Epub => write!(f, "{}", EXTENSION_EPUB), FileExtension::Txt => write!(f, "{}", EXTENSION_TXT), + FileExtension::Md => write!(f, "{}", EXTENSION_MD), } } } @@ -248,6 +253,7 @@ impl FileExtension { EXTENSION_ODP => Some(FileExtension::Odp), EXTENSION_EPUB => Some(FileExtension::Epub), EXTENSION_TXT => Some(FileExtension::Txt), + EXTENSION_MD => Some(FileExtension::Md), _ => None, } } @@ -274,6 +280,7 @@ impl FileExtension { FileExtension::Odp => MIME_TYPE_ODP.parse().ok(), FileExtension::Epub => MIME_TYPE_EPUB.parse().ok(), FileExtension::Txt => MIME_TYPE_TXT.parse().ok(), + FileExtension::Md => MIME_TYPE_MD.parse().ok(), } } } From ee8f366dc6385eb79f0a401ffc4f8fc98c86b848 Mon Sep 17 00:00:00 2001 From: nleva Date: Tue, 10 Feb 2026 16:35:52 +0100 Subject: [PATCH 2/3] Add support for import of Markdown files --- src/common/drive_file.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/drive_file.rs b/src/common/drive_file.rs index 65d80ae..97a1758 100644 --- a/src/common/drive_file.rs +++ b/src/common/drive_file.rs @@ -74,6 +74,7 @@ impl DocType { (FileExtension::Rtf, DocType::Document), (FileExtension::Pdf, DocType::Document), (FileExtension::Html, DocType::Document), + (FileExtension::Md, DocType::Document), (FileExtension::Xls, DocType::Spreadsheet), (FileExtension::Xlsx, DocType::Spreadsheet), (FileExtension::Csv, DocType::Spreadsheet), From b0a2f63401c1bcd9691c5b164c536272eb73ead3 Mon Sep 17 00:00:00 2001 From: nleva Date: Tue, 10 Feb 2026 17:34:00 +0100 Subject: [PATCH 3/3] Add source MIME type to FileInfo for improved import handling --- src/common/file_info.rs | 2 ++ src/common/file_tree.rs | 1 + src/files/import.rs | 13 ++++++++++--- src/files/upload.rs | 7 +++++-- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/common/file_info.rs b/src/common/file_info.rs index 16fe4ee..e421a40 100644 --- a/src/common/file_info.rs +++ b/src/common/file_info.rs @@ -7,6 +7,7 @@ use std::path::PathBuf; pub struct FileInfo { pub name: String, pub mime_type: mime::Mime, + pub source_mime_type: Option, pub parents: Option>, pub size: u64, } @@ -36,6 +37,7 @@ impl FileInfo { Ok(FileInfo { name: file_name, mime_type, + source_mime_type: None, parents: config.parents.clone(), size: file_size, }) diff --git a/src/common/file_tree.rs b/src/common/file_tree.rs index 7ddc57f..04d31b6 100644 --- a/src/common/file_tree.rs +++ b/src/common/file_tree.rs @@ -240,6 +240,7 @@ impl File { name: self.name.clone(), size: self.size, mime_type: self.mime_type.clone(), + source_mime_type: None, parents, } } diff --git a/src/files/import.rs b/src/files/import.rs index ea8819b..60d9e4e 100644 --- a/src/files/import.rs +++ b/src/files/import.rs @@ -26,21 +26,28 @@ pub async fn import(config: Config) -> Result<(), Error> { let doc_type = drive_file::DocType::from_file_path(&config.file_path).ok_or(Error::UnsupportedFileType)?; - let mime_type = doc_type.mime().ok_or(Error::GetMime(doc_type.clone()))?; + let target_mime_type = doc_type.mime().ok_or(Error::GetMime(doc_type.clone()))?; + + // Get source file's MIME type based on extension + let source_mime_type = drive_file::FileExtension::from_path(&config.file_path) + .and_then(|ext| ext.get_export_mime()); let file = fs::File::open(&config.file_path) .map_err(|err| Error::OpenFile(config.file_path.clone(), err))?; - let file_info = FileInfo::from_file( + let mut file_info = FileInfo::from_file( &file, &file_info::Config { file_path: config.file_path.clone(), - mime_type: Some(mime_type), + mime_type: Some(target_mime_type), parents: config.parents.clone(), }, ) .map_err(Error::FileInfo)?; + // Set the source MIME type for proper import conversion + file_info.source_mime_type = source_mime_type; + let reader = std::io::BufReader::new(file); if !config.print_only_id { diff --git a/src/files/upload.rs b/src/files/upload.rs index 1b5b149..5d79671 100644 --- a/src/files/upload.rs +++ b/src/files/upload.rs @@ -228,6 +228,9 @@ where ..google_drive3::api::File::default() }; + // For import operations, use source_mime_type for the upload content type + let upload_mime_type = file_info.source_mime_type.unwrap_or(file_info.mime_type); + let chunk_size_bytes = delegate_config.chunk_size.in_bytes(); let mut delegate = UploadDelegate::new(delegate_config); @@ -240,9 +243,9 @@ where .supports_all_drives(true); let (_, file) = if file_info.size > chunk_size_bytes { - req.upload_resumable(src_file, file_info.mime_type).await? + req.upload_resumable(src_file, upload_mime_type).await? } else { - req.upload(src_file, file_info.mime_type).await? + req.upload(src_file, upload_mime_type).await? }; Ok(file)