Skip to content

Commit aad40d2

Browse files
authored
Merge pull request #26 from shermp/shell-script
Updated shell script & metadata update handling
2 parents 0721f02 + e3ae446 commit aad40d2

File tree

5 files changed

+67
-57
lines changed

5 files changed

+67
-57
lines changed

kobo-uncaged/device/device.go

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ func New(dbRootDir, sdRootDir string, updatingMD bool, opts *KuOptions, vers str
6161
k.BKRootDir = sdRootDir
6262
k.ContentIDprefix = sdPrefix
6363
}
64-
6564
k.Passwords = newUncagedPassword(k.KuConfig.PasswordList)
65+
k.UpdatedMetadata = make(map[string]struct{}, 0)
6666
headerStr := "Kobo-UNCaGED " + vers
6767
if k.useSDCard {
6868
headerStr += "\nUsing SD Card"
@@ -106,6 +106,7 @@ func New(dbRootDir, sdRootDir string, updatingMD bool, opts *KuOptions, vers str
106106
if err = k.readUpdateMDfile(); err != nil {
107107
return nil, fmt.Errorf("New: failed to read updated metadata file: %w", err)
108108
}
109+
os.Remove(filepath.Join(k.BKRootDir, kuUpdatedMDfile))
109110

110111
return k, err
111112
}
@@ -569,15 +570,12 @@ func (k *Kobo) SaveCoverImage(contentID string, size image.Point, imgB64 string)
569570

570571
// UpdateNickelDB updates the Nickel database with updated metadata obtained from a previous run,
571572
// or this run if updating via triggers
572-
func (k *Kobo) UpdateNickelDB() error {
573-
if !k.KuConfig.AddMetadataByTrigger {
574-
// No matter what happens, we remove the 'metadata_update.kobouc' file when we're done
575-
defer os.Remove(filepath.Join(k.BKRootDir, kuUpdatedMDfile))
576-
}
573+
func (k *Kobo) UpdateNickelDB() (bool, error) {
574+
rerun := false
577575
var err error
578576
tx, err := k.nickelDB.Begin()
579577
if err != nil {
580-
return fmt.Errorf("UpdateNickelDB: Error beginning transaction: %w", err)
578+
return rerun, fmt.Errorf("UpdateNickelDB: Error beginning transaction: %w", err)
581579
}
582580
// Insert prepared statement if using triggers
583581
var insertStmt *sql.Stmt
@@ -588,7 +586,7 @@ func (k *Kobo) UpdateNickelDB() error {
588586
insertStmt, err = tx.Prepare(insertQuery)
589587
if err != nil {
590588
tx.Rollback()
591-
return fmt.Errorf("UpdateNickelDB: prepared insert statement failed: %w", err)
589+
return rerun, fmt.Errorf("UpdateNickelDB: prepared insert statement failed: %w", err)
592590
}
593591
}
594592
// Update statment for books already in the content table
@@ -602,12 +600,12 @@ func (k *Kobo) UpdateNickelDB() error {
602600
updateStmt, err := tx.Prepare(updateQuery)
603601
if err != nil {
604602
tx.Rollback()
605-
return fmt.Errorf("UpdateNickelDB: prepared statement failed: %w", err)
603+
return rerun, fmt.Errorf("UpdateNickelDB: prepared statement failed: %w", err)
606604
}
607605
var updateErr error
608606
var desc, series, seriesNum *string
609607
var seriesNumFloat *float64
610-
for _, cid := range k.UpdatedMetadata {
608+
for cid := range k.UpdatedMetadata {
611609
desc, series, seriesNum, seriesNumFloat = nil, nil, nil, nil
612610
if k.MetadataMap[cid].Comments != nil && *k.MetadataMap[cid].Comments != "" {
613611
desc = k.MetadataMap[cid].Comments
@@ -627,17 +625,26 @@ func (k *Kobo) UpdateNickelDB() error {
627625
if err != nil {
628626
updateErr = fmt.Errorf("UpdateNickelDB: %w", err)
629627
}
630-
} else if k.KuConfig.AddMetadataByTrigger {
631-
_, err = insertStmt.Exec(cid, desc, series, seriesNum)
632-
if err != nil {
633-
updateErr = fmt.Errorf("UpdateNickelDB: %w", err)
628+
delete(k.UpdatedMetadata, cid)
629+
} else {
630+
rerun = true
631+
if k.KuConfig.AddMetadataByTrigger {
632+
_, err = insertStmt.Exec(cid, desc, series, seriesNum)
633+
if err != nil {
634+
updateErr = fmt.Errorf("UpdateNickelDB: %w", err)
635+
}
636+
delete(k.UpdatedMetadata, cid)
634637
}
635638
}
636639
}
637640
if err = tx.Commit(); err != nil {
638-
return fmt.Errorf("UpdateNickelDB: Error committing transaction: %w", err)
641+
return rerun, fmt.Errorf("UpdateNickelDB: Error committing transaction: %w", err)
642+
}
643+
// Note, this should only write to the file if new books are added, and AddMetadataByTrigger is false
644+
if err = k.WriteUpdateMDfile(); err != nil {
645+
return false, fmt.Errorf("UpdateNickelDB: %w", err)
639646
}
640-
return updateErr
647+
return rerun, updateErr
641648
}
642649

643650
// Close the kobo object when we're finished with it

kobo-uncaged/device/types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ type Kobo struct {
5757
ContentIDprefix cidPrefix
5858
useSDCard bool
5959
MetadataMap map[string]uc.CalibreBookMeta
60-
UpdatedMetadata []string
60+
UpdatedMetadata map[string]struct{}
6161
BooksInDB map[string]struct{}
6262
Passwords *uncagedPassword
6363
DriveInfo uc.DeviceInfo

kobo-uncaged/kunc/kunc.go

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,9 @@ func (ku *koboUncaged) UpdateMetadata(mdList []uc.CalibreBookMeta) error {
115115
md.Thumbnail = nil
116116
cid := util.LpathToContentID(md.Lpath, string(ku.k.ContentIDprefix))
117117
ku.k.MetadataMap[cid] = md
118-
ku.k.UpdatedMetadata = append(ku.k.UpdatedMetadata, cid)
118+
ku.k.UpdatedMetadata[cid] = struct{}{}
119119
}
120120
ku.k.WriteMDfile()
121-
ku.k.WriteUpdateMDfile()
122121
return nil
123122
}
124123

@@ -171,7 +170,7 @@ func (ku *koboUncaged) SaveBook(md uc.CalibreBookMeta, book io.Reader, len int,
171170
return fmt.Errorf("SaveBook: error opening ebook file: %w", err)
172171
}
173172
defer destBook.Close()
174-
ku.k.UpdatedMetadata = append(ku.k.UpdatedMetadata, cID)
173+
ku.k.UpdatedMetadata[cID] = struct{}{}
175174
// Note, the JSON format for covers should be in the form 'thumbnail: [w, h, "base64string"]'
176175
if md.Thumbnail.Exists() {
177176
w, h := md.Thumbnail.Dimensions()
@@ -185,7 +184,6 @@ func (ku *koboUncaged) SaveBook(md uc.CalibreBookMeta, book io.Reader, len int,
185184
ku.k.MetadataMap[cID] = md
186185
if lastBook {
187186
ku.k.WriteMDfile()
188-
ku.k.WriteUpdateMDfile()
189187
}
190188
return err
191189
}
@@ -237,21 +235,11 @@ func (ku *koboUncaged) DeleteBook(book uc.BookID) error {
237235
// Now we remove the book from the metadata map
238236
delete(ku.k.MetadataMap, cid)
239237
// As well as the updated metadata list, if it was added to the list this session
240-
l := len(ku.k.UpdatedMetadata)
241-
for n := 0; n < l; n++ {
242-
if ku.k.UpdatedMetadata[n] == cid {
243-
ku.k.UpdatedMetadata[n] = ku.k.UpdatedMetadata[len(ku.k.UpdatedMetadata)-1]
244-
ku.k.UpdatedMetadata = ku.k.UpdatedMetadata[:len(ku.k.UpdatedMetadata)-1]
245-
break
246-
}
247-
}
238+
delete(ku.k.UpdatedMetadata, cid)
248239
// Finally, write the new metadata files
249240
if err = ku.k.WriteMDfile(); err != nil {
250241
return fmt.Errorf("DeleteBook: error writing metadata file: %w", err)
251242
}
252-
if err = ku.k.WriteUpdateMDfile(); err != nil {
253-
return fmt.Errorf("DeleteBook: error writing updated metadata file: %w", err)
254-
}
255243
return nil
256244
}
257245

kobo-uncaged/main.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ func mainWithErrCode() returnCode {
119119
if *mdPtr {
120120
log.Println("Updating Metadata")
121121
kuprint.Println(kuprint.Body, "Updating Metadata!")
122-
err = k.UpdateNickelDB()
122+
_, err = k.UpdateNickelDB()
123123
if err != nil {
124124
log.Print(err)
125125
return returncodeFromError(err)
@@ -141,17 +141,20 @@ func mainWithErrCode() returnCode {
141141
}
142142

143143
if len(k.UpdatedMetadata) > 0 {
144-
if k.KuConfig.AddMetadataByTrigger {
145-
if err = k.UpdateNickelDB(); err != nil {
146-
kuprint.Println(kuprint.Body, "Updating metadata by DB trigger failed")
147-
log.Print(err)
148-
return genericError
144+
rerun, err := k.UpdateNickelDB()
145+
if err != nil {
146+
kuprint.Println(kuprint.Body, "Updating metadata failed")
147+
log.Print(err)
148+
return returncodeFromError(err)
149+
}
150+
if rerun {
151+
if k.KuConfig.AddMetadataByTrigger {
152+
kuprint.Println(kuprint.Body, "Books added!\n\nYour Kobo will perform another USB connect after content import")
153+
return successUSBMS
149154
}
150-
kuprint.Println(kuprint.Body, "Metadata added to DB\n\nYour Kobo will perform another USB connect after content import")
151-
return successUSBMS
155+
kuprint.Println(kuprint.Body, "Books added!\n\nKobo-UNCaGED will restart automatically to update metadata")
156+
return successRerun
152157
}
153-
kuprint.Println(kuprint.Body, "Kobo-UNCaGED will restart automatically to update metadata")
154-
return successRerun
155158
}
156159
kuprint.Println(kuprint.Body, "Nothing more to do!\n\nReturning to Home screen")
157160
}

scripts/run-ku.sh

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ KU_DIR="$1"
1111
KU_TMP_DIR="$2"
1212
. ./nickel-usbms.sh
1313

14+
# Set expected KU return codes as variables
15+
KURC_ERR=250
16+
KURC_SUCC=0
17+
KURC_RERUN=1
18+
KURC_USBMS=10
19+
KURC_PWERR=100
20+
KURC_NFERR=101
21+
1422
# Abort if the device is currently plugged in, as that's liable to confuse Nickel into actually starting a real USBMS session!
1523
# Which'd probably ultimately cause a crash with our shenanigans...
1624
# Except if we've specified 'allowUSBPower = true' in our ku.toml file
@@ -99,12 +107,25 @@ logmsg "I" "Unmounting SD card"
99107
unmount_sd
100108
ret=$?
101109
logmsg "N" "SD card unmounted (${ret}) . . ."
102-
103-
logmsg "I" "Waiting for content processing"
104-
./button_scan -w -u -q
105-
BS_RES=$?
110+
if [ $KU_RES -ne $KURC_RERUN ] && [ $KU_RES -ne $KURC_USBMS ]; then
111+
if [ $KU_RES -eq $KURC_PWERR ]; then
112+
logmsg "I" "Password issue. Check your ku.toml config file"
113+
elif [ $KU_RES -eq $KURC_ERR ] || [ $KU_RES -eq $KURC_NFERR ]; then
114+
logmsg "E" "Kobo UNCaGED exited with an error. Check syslog for error message"
115+
elif [ $KU_RES -ne $KURC_SUCC ]; then
116+
logmsg "C" "Kobo UNCaGED appears to have crashed, check\n${KU_LOG}"
117+
else
118+
logmsg "I" "Success! Returning to home"
119+
fi
120+
remove_usb
106121
# Note, KU may have updated metadata, even if no new books are added
107-
if [ $KU_RES -eq 1 ] || [ $KU_RES -eq 10 ] || [ $BS_RES -eq 0 ]; then
122+
else
123+
logmsg "I" "Waiting for content processing"
124+
./button_scan -w -u -q
125+
BS_RES=$?
126+
if [ $BS_RES -ne 0 ]; then
127+
logmsg "I" "Something strange happened... (BS: -$(( 256 - BS_RES )))"
128+
fi
108129
logmsg "N" "Updating metadata . . ."
109130
logmsg "I" "Entering USBMS mode . . ."
110131
insert_usb
@@ -125,7 +146,7 @@ if [ $KU_RES -eq 1 ] || [ $KU_RES -eq 10 ] || [ $BS_RES -eq 0 ]; then
125146
BS_TIMEOUT=$(( BS_TIMEOUT + 1 ))
126147
done
127148

128-
if [ $KU_RES -ne 10 ]; then
149+
if [ $KU_RES -ne $KURC_USBMS ]; then
129150
logmsg "I" "(Re)mounting onboard"
130151
mount_onboard
131152
ret=$?
@@ -166,13 +187,4 @@ if [ $KU_RES -eq 1 ] || [ $KU_RES -eq 10 ] || [ $BS_RES -eq 0 ]; then
166187
fi
167188
logmsg "I" "Going back to Nickel"
168189
remove_usb
169-
elif [ $KU_RES -eq 100 ]; then
170-
logmsg "I" "Password issue. Check your ku.toml config file"
171-
elif [ $KU_RES -eq 250 ] || [ $KU_RES -eq 101 ]; then
172-
logmsg "E" "Kobo UNCaGED exited with an error. Check syslog for error message"
173-
elif [ $KU_RES -ne 0 ]; then
174-
logmsg "C" "Kobo UNCaGED appears to have crashed, check ${KU_LOG}"
175-
elif [ $KU_RES -ne 0 ] && [ $BS_RES -ne 0 ]; then
176-
# FBInk returns negative error codes, fudge that back to the <errno.h> value...
177-
logmsg "I" "Something strange happened... (KU: ${KU_RES}; BS: -$(( 256 - BS_RES )))"
178190
fi

0 commit comments

Comments
 (0)