Update fanbox download

Now will read exif data before write exif data.
This commit is contained in:
2022-07-15 05:09:42 +00:00
committed by GitHub
parent 061aa56bde
commit 70b87e055d
12 changed files with 343 additions and 35 deletions

View File

@@ -1,3 +1,5 @@
#[cfg(feature = "exif")]
use super::exif::ExifDataSource;
use crate::gettext;
use crate::opt::author_name_filter::AuthorFiler;
use crate::opthelper::get_helper;
@@ -84,3 +86,22 @@ impl PixivData {
}
}
}
#[cfg(feature = "exif")]
impl ExifDataSource for PixivData {
fn image_author(&self) -> Option<String> {
self.author.clone()
}
fn image_comment(&self) -> Option<String> {
self.description.clone()
}
fn image_id(&self) -> Option<String> {
Some(self.id.to_link())
}
fn image_title(&self) -> Option<String> {
self.title.clone()
}
}

View File

@@ -1,18 +1,39 @@
use crate::data::data::PixivData;
use crate::exif::ExifByteOrder;
use crate::exif::ExifData;
use crate::exif::ExifImage;
use crate::exif::ExifKey;
use crate::exif::ExifTypeID;
use crate::exif::ExifValue;
use crate::ext::try_err::TryErr;
use crate::parser::description::parse_description;
use std::convert::TryFrom;
use std::ffi::OsStr;
use utf16string::LittleEndian;
use utf16string::WString;
fn add_image_id(data: &mut ExifData, d: &PixivData) -> Result<(), ()> {
let link = d.id.to_link();
pub trait ExifDataSource {
fn image_author(&self) -> Option<String> {
None
}
fn image_comment(&self) -> Option<String> {
None
}
fn image_id(&self) -> Option<String> {
None
}
fn image_title(&self) -> Option<String> {
None
}
}
fn add_image_id<D: ExifDataSource>(data: &mut ExifData, d: &D) -> Result<(), ()> {
let link = match d.image_id() {
Some(link) => link,
None => return Ok(()),
};
let key = ExifKey::try_from("Exif.Image.ImageID")?;
let mut value = ExifValue::try_from(ExifTypeID::AsciiString)?;
value.read(link.as_bytes(), None)?;
@@ -20,31 +41,33 @@ fn add_image_id(data: &mut ExifData, d: &PixivData) -> Result<(), ()> {
Ok(())
}
fn add_image_title(data: &mut ExifData, d: &PixivData) -> Result<(), ()> {
if d.title.is_none() {
return Ok(());
}
let title = d.title.as_ref().unwrap();
fn add_image_title<D: ExifDataSource>(data: &mut ExifData, d: &D) -> Result<(), ()> {
let title = match d.image_title() {
Some(title) => title,
None => return Ok(()),
};
let key = ExifKey::try_from("Exif.Image.ImageDescription")?;
let mut value = ExifValue::try_from(ExifTypeID::AsciiString)?;
value.read(title.as_bytes(), None)?;
data.add(&key, &value)?;
let key = ExifKey::try_from("Exif.Image.XPTitle")?;
let mut value = ExifValue::try_from(ExifTypeID::BYTE)?;
let s: WString<LittleEndian> = WString::from(title);
let s: WString<LittleEndian> = WString::from(title.as_str());
value.read(s.as_bytes(), None)?;
data.add(&key, &value)?;
Ok(())
}
fn add_image_author(data: &mut ExifData, d: &PixivData) -> Result<(), ()> {
if d.author.is_none() {
return Ok(());
}
let author = d.author.as_ref().unwrap();
fn add_image_author<D: ExifDataSource>(data: &mut ExifData, d: &D) -> Result<(), ()> {
let author = match d.image_author() {
Some(author) => author,
None => {
return Ok(());
}
};
let key = ExifKey::try_from("Exif.Image.XPAuthor")?;
let mut value = ExifValue::try_from(ExifTypeID::BYTE)?;
let s: WString<LittleEndian> = WString::from(author);
let s: WString<LittleEndian> = WString::from(author.as_str());
value.read(s.as_bytes(), None)?;
data.add(&key, &value)?;
let key = ExifKey::try_from("Exif.Image.Artist")?;
@@ -54,19 +77,20 @@ fn add_image_author(data: &mut ExifData, d: &PixivData) -> Result<(), ()> {
Ok(())
}
fn add_image_comment(data: &mut ExifData, d: &PixivData) -> Result<(), ()> {
if d.description.is_none() {
return Ok(());
}
let desc = parse_description(d.description.as_ref().unwrap());
let desc = if desc.is_some() {
desc.as_ref().unwrap()
} else {
d.description.as_ref().unwrap()
fn add_image_comment<D: ExifDataSource>(data: &mut ExifData, d: &D) -> Result<(), ()> {
let odesc = match d.image_comment() {
Some(desc) => desc,
None => {
return Ok(());
}
};
let desc = match parse_description(odesc.as_str()) {
Some(desc) => desc,
None => odesc,
};
let key = ExifKey::try_from("Exif.Image.XPComment")?;
let mut value = ExifValue::try_from(ExifTypeID::BYTE)?;
let s: WString<LittleEndian> = WString::from(desc);
let s: WString<LittleEndian> = WString::from(desc.as_str());
value.read(s.as_bytes(), None)?;
data.add(&key, &value)?;
Ok(())
@@ -80,13 +104,14 @@ fn add_image_page(data: &mut ExifData, page: u16) -> Result<(), ()> {
Ok(())
}
pub fn add_exifdata_to_image<S: AsRef<OsStr> + ?Sized>(
pub fn add_exifdata_to_image<S: AsRef<OsStr> + ?Sized, D: ExifDataSource>(
file_name: &S,
data: &PixivData,
data: &D,
page: u16,
) -> Result<(), ()> {
let mut f = ExifImage::new(file_name)?;
let mut d = ExifData::new()?;
f.read_metadata()?;
let mut d = f.exif_data().try_err(())?.to_owned();
add_image_id(&mut d, data)?;
add_image_title(&mut d, data)?;
add_image_author(&mut d, data)?;