mirror of
https://github.com/lifegpc/pixiv_downloader.git
synced 2026-07-08 01:32:41 +08:00
Update fanbox download
Now will read exif data before write exif data.
This commit is contained in:
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)?;
|
||||
|
||||
Reference in New Issue
Block a user