Files
xteink-plugins/plugins/hardcover/__pycache__/patch.cpython-314.pyc
T

167 lines
17 KiB
Plaintext
Raw Normal View History

+
ƒÛi¥Lãó€Rt^RIt^RIt^RIt^RItRtRtRtRtRRlt Rt
Rt R t R
t
R tRR R
llt]R8XdE]!]P$4^8d]P&!R4]!]P$^,4R#R#)aV
Hardcover Progress plugin patch.
Adds a "Hardcover Progress" entry to the Plugins settings tab.
When the user presses Sync, the device:
1. Recursively scans the SD card for .epub files.
2. For each file whose progress.bin shows 1-99% read, parses the
epub OPF metadata to extract the ISBN-13.
3. POSTs a GraphQL mutation to https://api.hardcover.app/v1/graphql,
setting that book's status to "Currently Reading" with the current
page number.
The Hardcover API bearer token is stored in CrossPointSettings as a
char[256] field (hardcoverApiToken) and exposed in the web UI.
NcóŒ€\VRRR7;_uu_4pVP4uuRRR4# +'giR#;i)Úrúutf-8©ÚencodingN)ÚopenÚread)ÚpathÚfs& ÚE/Users/justinoros/Downloads/xteink-plugins/plugins/hardcover/patch.pyÚ read_filer s+€Ü
ˆd�C '× *Õ *¨aØ�v‰v‹x÷
+× *× *Ó *ús —2² A cóŽ€\VRRR7;_uu_4pVPV4RRR4R# +'giR#;i)ÚwrrN)rÚwrite)r Úcontentr
s&& r Ú
write_filer!s.ۆ
ˆd�C '× *Õ *¨aØ �‰�Ô÷
+× *× *Ò *ús —3³ A cóÊ€\P!\PPVRV4RR7pV'g\P
!RV RV 24V^,#)ú**T©Ú recursivezERROR: Could not locate z in )ÚglobÚosr ÚjoinÚsysÚexit)ÚfilenameÚrepo_dirÚresultss&& r Ú
find_firstr%sJ€Ü�iŠiœŸ™Ÿ ™  X¨t°XÓ>È$ÔO€Gß Ü �ŠÐ+¨H¨:°T¸(¸ÐDÔEØ �1�:Ðócóª€\PPVRRR4p\P!VRR7\P!V4F~pVP R4'gK\PPW4p\PPW#4p\ P!WE4\RV 24K€ R#)ÚsrcÚ
activitiesÚsettingsT)Úexist_oku ✓ N)z.hz.cppz.hpp) rr rÚmakedirsÚlistdirÚendswithÚshutilÚcopy2Úprint)Ú
plugin_dirrÚdestÚfnamer!Údsts&& r Úcopy_plugin_sourcesr/0sŠ€Ü
�7‰7�<‰<˜ %¨°zÓ B€D܇K‚K�˜tÕ$Ü—’˜JÖ'ˆØ �>‰>Ð0× 1Ô 1Ü—'‘'—,‘,˜zÓ1ˆCÜ—'‘'—,‘,˜tÓ+ˆCÜ �LŠL˜Ô "Ü �K ˜wÐ'Ö (ó (rcó€\RV4p\V4pRV9d\R4R#VPRR4PRR4pVPRR V R
24p\ W#4\R V'dR MR
R24R#)zCrossPointSettings.hÚhardcoverApiTokenz1 CrossPointSettings.h already patched, skipping.NÚ\z\\Ú"z\"z* uint8_t imageRendering = IMAGES_DISPLAY;zO uint8_t imageRendering = IMAGES_DISPLAY;
char hardcoverApiToken[640] = "z";z CrossPointSettings.h patchedz (token embedded)z (no token)Ú.©rr r*Úreplacer)rÚtokenr rÚ
safe_tokens&& r Úpatch_cross_point_settings_hr9?sŽ€ÜÐ/°Ó:€Dܘ‹o€Gà˜gÔ%Ü
ÐAÔBÙ𗑘t VÓ,×4Ñ4°S¸%Ó@€Jà�o‰oØ4Ø
ZÐ[eÐZfÐfhÐió€Gô
ˆtÔÜ Ð *Ç%Ñ+>È]Ð*[Ð[\Ð
]Ö^rcó¬€\RV4p\V4pRV9d\R4R#VPRR4p\ W4\R4R#)zSettingsList.hr1z+ SettingsList.h already patched, skipping.Nz };
return list;
}
zÑ SettingInfo::String(StrId::STR_NONE_OPT, SETTINGS.hardcoverApiToken,
sizeof(SETTINGS.hardcoverApiToken), "hardcoverApiToken")
.withObfuscated(),
};
return list;
}
z SettingsList.h patched.r5©rr rs& r Úpatch_settings_list_hr<XsU€ÜÐ)¨8Ó4€Dܘ‹o€Gà˜gÔ%Ü
Ð;Ô<Ùà�o‰oØ#ð $ó€GôˆtÔÜ Ð
%Ö&rcó¬€\RV4p\V4pRV9d\R4R#VPRR4p\ W4\R4R#)úSettingsActivity.hÚ
HardcoverSyncz/ SettingAction enum already patched, skipping.Nz Language,
};z Language,
HardcoverSync,
};z% SettingAction::HardcoverSync added.r5r;s& r Úpatch_setting_action_enumr@qsS€ÜÐ-¨xÓ8€Dܘ‹o€Gà˜'Ô!Ü
Ð?Ô@Ùà�o‰oØØ+ó€Gô
ˆtÔÜ Ð
1Ö2rcó€\RV4p\V4pRV9pRV9pV'dV'd\R4R#V'gVPRR4pV'gVPRR4p\ W4\R 4R#)
r>zcategoryCount = 5ÚpluginsSettingsz/ SettingsActivity.h already patched, skipping.Nz'static constexpr int categoryCount = 4;z'static constexpr int categoryCount = 5;z* std::vector<SettingInfo> systemSettings;zV std::vector<SettingInfo> systemSettings;
std::vector<SettingInfo> pluginsSettings;z SettingsActivity.h patched.r5)rr rÚalready_has_tabÚalready_has_vecs& r Úpatch_settings_hrE‡s€€ÜÐ-¨xÓ8€Dܘ‹o€Gà)¨WÑ4€OØ'¨7Ñ2€OçŸ?Ü
Ð?Ô@Ùç Ø—/‘/Ø 5Ø 5ó
ˆ÷
Ø—/‘/Ø 8Ø eó
ˆô
ˆtÔÜ Ð
)Ö*rcóª€\RV4p\V4pRV9d\R4R#VPRR4pRV9dFRVP R4^,P R 4^,9dVPR
R 4pR V9dVPR
R4pRpRV9d..R&OpVF#pWR9gK VPWUV,4pM RV9dVPRR4pRV9dVPRR4pRV9dVPRR4pRpRV9dfRV9d<RpR'F2pW‡,pWR9gKVPWXV,V,4pM& M#Rp RV,R,p
VPWš4pR V9dVPR!R"4pVPR#R$4p\ W4\R%4R#)(úSettingsActivity.cppzHardcoverPlugin::syncProgressz1 SettingsActivity.cpp already patched, skipping.Nz#include "SettingsList.h"zY#include "SettingsList.h"
#include "HardcoverPlugin.h"
#include "HardcoverSyncActivity.h"zStrId::STR_NONE_OPT};Ú STR_NONE_OPTÚ
categoryNamesÚ;zÛconst StrId SettingsActivity::categoryNames[categoryCount] = {StrId::STR_CAT_DISPLAY, StrId::STR_CAT_READER,
StrId::STR_CAT_CONTROLS, StrId::STR_CAT_SYSTEM};a.const StrId SettingsActivity::categoryNames[categoryCount] = {StrId::STR_CAT_DISPLAY, StrId::STR_CAT_READER,
StrId::STR_CAT_CONTROLS, StrId::STR_CAT_SYSTEM,
StrId::STR_NONE_OPT};úpluginsSettings.clear();z systemSettings.clear();z4 systemSettings.clear();
pluginsSettings.clear();zm pluginsSettings.push_back(SettingInfo::Action(
StrId::STR_NONE_OPT, SettingAction::HardcoverSync
));
zSettingAction::HardcoverSyncz3case 4:
currentSettings = &pluginsSettings;zG case 3:
currentSettings = &systemSettings;
break;z� case 3:
currentSettings = &systemSettings;
break;
case 4:
currentSettings = &pluginsSettings;
break;z "Plugins"z¹ std::vector<TabInfo> tabs;
tabs.reserve(categoryCount);
for (int i = 0; i < categoryCount; i++) {
tabs.push_back({I18N.get(categoryNames[i]), selectedCategoryIndex == i});
}zõ std::vector<TabInfo> tabs;
tabs.reserve(categoryCount);
for (int i = 0; i < categoryCount; i++) {
const char* tabLabel = (i == 4) ? "Plugins" : I18N.get(categoryNames[i]);
tabs.push_back({tabLabel, selectedCategoryIndex == i});
}Ú nextCatLabelzÐ const auto confirmLabel = (selectedSettingIndex == 0)
? I18N.get(categoryNames[(selectedCategoryIndex + 1) % categoryCount])
: tr(STR_TOGGLE);a const int nextCatIndex = (selectedCategoryIndex + 1) % categoryCount;
const char* nextCatLabel = (nextCatIndex == 4) ? "Plugins" : I18N.get(categoryNames[nextCatIndex]);
const auto confirmLabel = (selectedSettingIndex == 0) ? nextCatLabel : tr(STR_TOGGLE);z€ if (s.type == SettingType::ACTION &&
s.action == SettingAction::HardcoverSync) return "Hardcover Progress";
úHardcover ProgresszselectedCategoryIndex == 4z\ }
return std::string(I18N.get(settings[index].nameId));
}, nullptr, nullptr,zi [&settings](int index) { return std::string(I18N.get(settings[index].nameId)); }, nullptr, nullptr,z… [&settings, this](int index) -> std::string {
if (selectedCategoryIndex == 4) {
const auto& s = settings[index];
z"Sync"zQ if (setting.type == SettingType::TOGGLE && setting.valuePtr != nullptr) {zç if (setting.type == SettingType::ACTION &&
setting.action == SettingAction::HardcoverSync) {
valueText = "Sync";
} else if (setting.type == SettingType::TOGGLE && setting.valuePtr != nullptr) {z case SettingAction::Language:
startActivityForResult(std::make_unique<LanguageSelectActivity>(renderer, mappedInput), resultHandler);
break;
case SettingAction::None:ai case SettingAction::Language:
startActivityForResult(std::make_unique<LanguageSelectActivity>(renderer, mappedInput), resultHandler);
break;
case SettingAction::HardcoverSync:
startActivityForResult(std::make_unique<HardcoverSyncActivity>(renderer, mappedInput), resultHandler);
break;
case SettingAction::None:z SettingsActivity.cpp patched.)zÍ pluginsSettings.push_back(SettingInfo::Enum(
StrId::STR_NONE_OPT, &CrossPointSettings::smallerFontsMode,
{StrId::STR_NONE_OPT, StrId::STR_NONE_OPT, StrId::STR_NONE_OPT}, "smallerFontsMode"
));
z² pluginsSettings.push_back(SettingInfo::Enum(
StrId::STR_NONE_OPT, &CrossPointSettings::darkModeState,
{StrId::STR_NONE_OPT, StrId::STR_NONE_OPT}, "darkModeState"
));
zu readerSettings.push_back(SettingInfo::Action(StrId::STR_CUSTOMISE_STATUS_BAR, SettingAction::CustomiseStatusBar));
)zW if (s.key && std::string(s.key) == "smallerFontsMode") return "Smaller Fonts";
zP if (s.key && std::string(s.key) == "darkModeState") return "Dark Mode";
)rr r*r6Úsplitr) rr rÚhardcover_pushÚanchorsÚanchorÚhardcover_label_lineÚclosingÚ
last_key_lineÚ
old_lambdaÚ
new_lambdas & r Úpatch_settings_cpprW¦s>€ÜÐ/°Ó:€Dܘ‹o€Gà&¨'Ô1Ü
ÐAÔBÙð�o‰oØ#Øeó€Gð  gÔ-°.ÈÏ
É
ÐVeÓHfÐghÕHi×HoÑHoÐpsÓHtÐuvÕHwÔ2wØ—/‘/ð
}ð
bó
ˆð"¨Ô0Ø—/‘/Ø 'Ø Có
ˆð ðð &¨WÔ4ò

ˆóˆFØÖ Ø!Ÿ/™/¨&¸>Õ2IÓJ�Ùñð >ÀWÔLØ—/‘/Ø Wð
Yó
ˆð˜'Ô!Ø—/‘/ð
ð

ó

ˆð˜WÔ$Ø—/‘/ð
@ð
gó 
ˆð _ðð
 7Ô*Ø '¨7Ô 2ð+ð
ó
"�
ð'Õ0�ØÖ$Ø%Ÿo™o¨fÐFZÕ6ZÐ]dÕ6dÓe�GÙò"ð|ð
ð=ð'õ'ð+õ +ð
ð—o‘o jÓ=ˆGð�wÔØ—/‘/Ø _ð
gó
ˆð�o‰oð *ð *ó €GôˆtÔÜ Ð
+Ö,rcó*€\RV4p\V4pRV9gRV9d\R4R#RpRV9d"RV9dVPRVR,4pM VPR R
V,R ,4p\ W4\R 4R#)
zCrossPointWebServer.cppz"hardcoverApiToken"z"Hardcover API Token"z4 CrossPointWebServer.cpp already patched, skipping.Nz“ if (strcmp(s.key, "hardcoverApiToken") == 0) {
doc["name"] = "Hardcover API Token";
doc["category"] = "Plugins";
}
z if (s.key) {Ú