retold-remote 0.0.23 → 0.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/css/retold-remote.css +343 -20
- package/docs/.nojekyll +0 -0
- package/docs/README.md +64 -12
- package/docs/_cover.md +6 -6
- package/docs/_sidebar.md +2 -0
- package/docs/_topbar.md +1 -1
- package/docs/_version.json +7 -0
- package/docs/collections.md +30 -0
- package/docs/css/docuserve.css +327 -0
- package/docs/ebook-reader.md +75 -1
- package/docs/image-explorer.md +62 -2
- package/docs/index.html +39 -0
- package/docs/retold-catalog.json +254 -0
- package/docs/retold-keyword-index.json +31216 -0
- package/docs/server-setup.md +122 -91
- package/docs/stack-launcher.md +218 -0
- package/docs/synology.md +585 -0
- package/docs/ultravisor-configuration.md +5 -5
- package/docs/ultravisor-integration.md +4 -2
- package/package.json +20 -14
- package/source/Pict-Application-RetoldRemote.js +22 -0
- package/source/RetoldRemote-ExtensionMaps.js +1 -1
- package/source/cli/RetoldRemote-Server-Setup.js +460 -7
- package/source/cli/RetoldRemote-Stack-Launcher.js +563 -0
- package/source/cli/RetoldRemote-Stack-Run.js +41 -0
- package/source/cli/commands/RetoldRemote-Command-Serve.js +129 -54
- package/source/providers/CollectionManager-AddItems.js +166 -0
- package/source/providers/Pict-Provider-GalleryNavigation.js +55 -0
- package/source/providers/Pict-Provider-OperationStatus.js +597 -0
- package/source/providers/keyboard-handlers/KeyHandler-ImageExplorer.js +20 -1
- package/source/providers/keyboard-handlers/KeyHandler-Viewer.js +23 -0
- package/source/server/RetoldRemote-AudioWaveformService.js +49 -3
- package/source/server/RetoldRemote-CollectionExportService.js +763 -0
- package/source/server/RetoldRemote-CollectionService.js +5 -0
- package/source/server/RetoldRemote-EbookService.js +218 -3
- package/source/server/RetoldRemote-ImageService.js +221 -46
- package/source/server/RetoldRemote-MediaService.js +63 -4
- package/source/server/RetoldRemote-MetadataCache.js +25 -5
- package/source/server/RetoldRemote-OperationBroadcaster.js +363 -0
- package/source/server/RetoldRemote-SubimageService.js +680 -0
- package/source/server/RetoldRemote-ToolDetector.js +50 -0
- package/source/server/RetoldRemote-UltravisorBeacon.js +18 -3
- package/source/server/RetoldRemote-UltravisorDispatcher.js +65 -491
- package/source/server/RetoldRemote-UltravisorOperations.js +133 -20
- package/source/server/RetoldRemote-VideoFrameService.js +302 -9
- package/source/views/MediaViewer-EbookViewer.js +419 -1
- package/source/views/MediaViewer-PdfViewer.js +1050 -0
- package/source/views/PictView-Remote-AudioExplorer.js +77 -1
- package/source/views/PictView-Remote-CollectionsPanel.js +213 -0
- package/source/views/PictView-Remote-Gallery.js +365 -64
- package/source/views/PictView-Remote-ImageExplorer.js +1529 -44
- package/source/views/PictView-Remote-ImageViewer.js +2 -2
- package/source/views/PictView-Remote-Layout.js +58 -0
- package/source/views/PictView-Remote-MediaViewer.js +100 -25
- package/source/views/PictView-Remote-RegionsBrowser.js +554 -0
- package/source/views/PictView-Remote-SubimagesPanel.js +353 -0
- package/source/views/PictView-Remote-TopBar.js +1 -0
- package/source/views/PictView-Remote-VideoExplorer.js +77 -1
- package/web-application/css/docuserve.css +277 -23
- package/web-application/css/retold-remote.css +343 -20
- package/web-application/docs/README.md +64 -12
- package/web-application/docs/_cover.md +6 -6
- package/web-application/docs/_sidebar.md +2 -0
- package/web-application/docs/_topbar.md +1 -1
- package/web-application/docs/collections.md +30 -0
- package/web-application/docs/ebook-reader.md +75 -1
- package/web-application/docs/image-explorer.md +62 -2
- package/web-application/docs/server-setup.md +122 -91
- package/web-application/docs/stack-launcher.md +218 -0
- package/web-application/docs/synology.md +585 -0
- package/web-application/docs/ultravisor-configuration.md +5 -5
- package/web-application/docs/ultravisor-integration.md +4 -2
- package/web-application/js/pict-docuserve.min.js +12 -12
- package/web-application/js/pict.min.js +2 -2
- package/web-application/js/pict.min.js.map +1 -1
- package/web-application/retold-remote.js +6596 -1784
- package/web-application/retold-remote.js.map +1 -1
- package/web-application/retold-remote.min.js +75 -23
- package/web-application/retold-remote.min.js.map +1 -1
package/css/retold-remote.css
CHANGED
|
@@ -1011,6 +1011,262 @@ html, body
|
|
|
1011
1011
|
}
|
|
1012
1012
|
}
|
|
1013
1013
|
|
|
1014
|
+
/* ============================================================
|
|
1015
|
+
Gallery — loading & progressive render
|
|
1016
|
+
============================================================ */
|
|
1017
|
+
|
|
1018
|
+
.retold-remote-gallery-loading
|
|
1019
|
+
{
|
|
1020
|
+
display: flex;
|
|
1021
|
+
flex-direction: column;
|
|
1022
|
+
align-items: center;
|
|
1023
|
+
justify-content: center;
|
|
1024
|
+
min-height: 240px;
|
|
1025
|
+
padding: 48px 16px;
|
|
1026
|
+
color: var(--retold-text-secondary, #9cdcfe);
|
|
1027
|
+
gap: 12px;
|
|
1028
|
+
text-align: center;
|
|
1029
|
+
}
|
|
1030
|
+
.retold-remote-gallery-loading-spinner
|
|
1031
|
+
{
|
|
1032
|
+
width: 40px;
|
|
1033
|
+
height: 40px;
|
|
1034
|
+
border-radius: 50%;
|
|
1035
|
+
border: 3px solid var(--retold-border, #3c3c3c);
|
|
1036
|
+
border-top-color: var(--retold-accent, #569cd6);
|
|
1037
|
+
animation: retold-spin 0.9s linear infinite;
|
|
1038
|
+
}
|
|
1039
|
+
.retold-remote-gallery-loading-text
|
|
1040
|
+
{
|
|
1041
|
+
font-size: 0.95rem;
|
|
1042
|
+
color: var(--retold-text-primary, #d4d4d4);
|
|
1043
|
+
}
|
|
1044
|
+
.retold-remote-gallery-loading-path
|
|
1045
|
+
{
|
|
1046
|
+
font-size: 0.78rem;
|
|
1047
|
+
color: var(--retold-text-dim, #808080);
|
|
1048
|
+
max-width: 80%;
|
|
1049
|
+
word-break: break-all;
|
|
1050
|
+
font-family: var(--retold-font-mono, monospace);
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
.retold-remote-gallery-progress
|
|
1054
|
+
{
|
|
1055
|
+
position: sticky;
|
|
1056
|
+
bottom: 0;
|
|
1057
|
+
left: 0;
|
|
1058
|
+
right: 0;
|
|
1059
|
+
display: flex;
|
|
1060
|
+
align-items: center;
|
|
1061
|
+
gap: 10px;
|
|
1062
|
+
padding: 8px 14px;
|
|
1063
|
+
background: var(--retold-bg-secondary, #252526);
|
|
1064
|
+
border-top: 1px solid var(--retold-border, #3c3c3c);
|
|
1065
|
+
color: var(--retold-text-dim, #9cdcfe);
|
|
1066
|
+
font-size: 0.78rem;
|
|
1067
|
+
z-index: 10;
|
|
1068
|
+
}
|
|
1069
|
+
.retold-remote-gallery-progress-spinner
|
|
1070
|
+
{
|
|
1071
|
+
display: inline-block;
|
|
1072
|
+
width: 14px;
|
|
1073
|
+
height: 14px;
|
|
1074
|
+
border-radius: 50%;
|
|
1075
|
+
border: 2px solid var(--retold-border, #3c3c3c);
|
|
1076
|
+
border-top-color: var(--retold-accent, #569cd6);
|
|
1077
|
+
animation: retold-spin 0.8s linear infinite;
|
|
1078
|
+
flex-shrink: 0;
|
|
1079
|
+
}
|
|
1080
|
+
.retold-remote-gallery-progress-text
|
|
1081
|
+
{
|
|
1082
|
+
font-family: var(--retold-font-mono, monospace);
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
@keyframes retold-spin
|
|
1086
|
+
{
|
|
1087
|
+
from { transform: rotate(0deg); }
|
|
1088
|
+
to { transform: rotate(360deg); }
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
/* Sidebar file browser — loading row */
|
|
1092
|
+
.retold-remote-filebrowser-loading-row
|
|
1093
|
+
{
|
|
1094
|
+
display: flex;
|
|
1095
|
+
align-items: center;
|
|
1096
|
+
gap: 8px;
|
|
1097
|
+
padding: 10px 14px;
|
|
1098
|
+
color: var(--retold-text-dim, #808080);
|
|
1099
|
+
font-size: 0.8rem;
|
|
1100
|
+
font-style: italic;
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
/* ============================================================
|
|
1104
|
+
Operation Status — sticky bottom strip for long-running ops
|
|
1105
|
+
(server-side work like DZI generation, video frame extraction,
|
|
1106
|
+
collection export, document conversion, etc.)
|
|
1107
|
+
============================================================ */
|
|
1108
|
+
.retold-remote-operation-status
|
|
1109
|
+
{
|
|
1110
|
+
position: fixed;
|
|
1111
|
+
bottom: 0;
|
|
1112
|
+
left: 0;
|
|
1113
|
+
right: 0;
|
|
1114
|
+
z-index: 100;
|
|
1115
|
+
pointer-events: none;
|
|
1116
|
+
display: none;
|
|
1117
|
+
}
|
|
1118
|
+
.retold-remote-operation-status.has-ops
|
|
1119
|
+
{
|
|
1120
|
+
display: block;
|
|
1121
|
+
pointer-events: auto;
|
|
1122
|
+
}
|
|
1123
|
+
.retold-remote-operation-status-list
|
|
1124
|
+
{
|
|
1125
|
+
display: flex;
|
|
1126
|
+
flex-direction: column;
|
|
1127
|
+
gap: 1px;
|
|
1128
|
+
background: var(--retold-bg-secondary, #252526);
|
|
1129
|
+
border-top: 1px solid var(--retold-border, #3c3c3c);
|
|
1130
|
+
box-shadow: 0 -2px 12px rgba(0, 0, 0, 0.25);
|
|
1131
|
+
max-height: 40vh;
|
|
1132
|
+
overflow-y: auto;
|
|
1133
|
+
}
|
|
1134
|
+
.retold-remote-operation-status-item
|
|
1135
|
+
{
|
|
1136
|
+
display: flex;
|
|
1137
|
+
align-items: center;
|
|
1138
|
+
gap: 12px;
|
|
1139
|
+
padding: 10px 16px;
|
|
1140
|
+
background: var(--retold-bg-secondary, #252526);
|
|
1141
|
+
color: var(--retold-text-primary, #d4d4d4);
|
|
1142
|
+
font-size: 0.82rem;
|
|
1143
|
+
border-bottom: 1px solid var(--retold-bg-primary, #1e1e1e);
|
|
1144
|
+
transition: background 0.2s;
|
|
1145
|
+
}
|
|
1146
|
+
.retold-remote-operation-status-item:last-child
|
|
1147
|
+
{
|
|
1148
|
+
border-bottom: none;
|
|
1149
|
+
}
|
|
1150
|
+
.retold-remote-operation-status-item.is-complete
|
|
1151
|
+
{
|
|
1152
|
+
color: var(--retold-text-secondary, #9cdcfe);
|
|
1153
|
+
background: rgba(88, 166, 255, 0.05);
|
|
1154
|
+
}
|
|
1155
|
+
.retold-remote-operation-status-item.is-error
|
|
1156
|
+
{
|
|
1157
|
+
color: #f48771;
|
|
1158
|
+
background: rgba(244, 135, 113, 0.08);
|
|
1159
|
+
}
|
|
1160
|
+
.retold-remote-operation-status-item.is-cancelled
|
|
1161
|
+
{
|
|
1162
|
+
color: var(--retold-text-dim, #808080);
|
|
1163
|
+
background: rgba(128, 128, 128, 0.05);
|
|
1164
|
+
}
|
|
1165
|
+
.retold-remote-operation-status-spinner
|
|
1166
|
+
{
|
|
1167
|
+
display: inline-block;
|
|
1168
|
+
width: 14px;
|
|
1169
|
+
height: 14px;
|
|
1170
|
+
border-radius: 50%;
|
|
1171
|
+
border: 2px solid var(--retold-border, #3c3c3c);
|
|
1172
|
+
border-top-color: var(--retold-accent, #569cd6);
|
|
1173
|
+
animation: retold-spin 0.8s linear infinite;
|
|
1174
|
+
flex-shrink: 0;
|
|
1175
|
+
}
|
|
1176
|
+
.retold-remote-operation-status-check
|
|
1177
|
+
{
|
|
1178
|
+
color: var(--retold-accent, #569cd6);
|
|
1179
|
+
font-size: 1.05rem;
|
|
1180
|
+
flex-shrink: 0;
|
|
1181
|
+
width: 14px;
|
|
1182
|
+
text-align: center;
|
|
1183
|
+
}
|
|
1184
|
+
.retold-remote-operation-status-error-icon
|
|
1185
|
+
{
|
|
1186
|
+
font-size: 1.05rem;
|
|
1187
|
+
flex-shrink: 0;
|
|
1188
|
+
width: 14px;
|
|
1189
|
+
text-align: center;
|
|
1190
|
+
}
|
|
1191
|
+
.retold-remote-operation-status-text
|
|
1192
|
+
{
|
|
1193
|
+
flex: 1;
|
|
1194
|
+
min-width: 0;
|
|
1195
|
+
overflow: hidden;
|
|
1196
|
+
}
|
|
1197
|
+
.retold-remote-operation-status-label
|
|
1198
|
+
{
|
|
1199
|
+
font-weight: 500;
|
|
1200
|
+
white-space: nowrap;
|
|
1201
|
+
overflow: hidden;
|
|
1202
|
+
text-overflow: ellipsis;
|
|
1203
|
+
}
|
|
1204
|
+
.retold-remote-operation-status-phase
|
|
1205
|
+
{
|
|
1206
|
+
font-size: 0.74rem;
|
|
1207
|
+
color: var(--retold-text-dim, #9cdcfe);
|
|
1208
|
+
white-space: nowrap;
|
|
1209
|
+
overflow: hidden;
|
|
1210
|
+
text-overflow: ellipsis;
|
|
1211
|
+
margin-top: 1px;
|
|
1212
|
+
}
|
|
1213
|
+
.retold-remote-operation-status-bar
|
|
1214
|
+
{
|
|
1215
|
+
height: 3px;
|
|
1216
|
+
background: var(--retold-border, #3c3c3c);
|
|
1217
|
+
border-radius: 2px;
|
|
1218
|
+
margin-top: 4px;
|
|
1219
|
+
overflow: hidden;
|
|
1220
|
+
}
|
|
1221
|
+
.retold-remote-operation-status-bar-fill
|
|
1222
|
+
{
|
|
1223
|
+
height: 100%;
|
|
1224
|
+
background: var(--retold-accent, #569cd6);
|
|
1225
|
+
transition: width 0.2s ease-out;
|
|
1226
|
+
}
|
|
1227
|
+
.retold-remote-operation-status-count
|
|
1228
|
+
{
|
|
1229
|
+
font-family: var(--retold-font-mono, monospace);
|
|
1230
|
+
font-size: 0.72rem;
|
|
1231
|
+
color: var(--retold-text-dim, #9cdcfe);
|
|
1232
|
+
white-space: nowrap;
|
|
1233
|
+
flex-shrink: 0;
|
|
1234
|
+
}
|
|
1235
|
+
.retold-remote-operation-status-cancel
|
|
1236
|
+
{
|
|
1237
|
+
background: transparent;
|
|
1238
|
+
border: 1px solid var(--retold-border, #3c3c3c);
|
|
1239
|
+
color: var(--retold-text-dim, #9cdcfe);
|
|
1240
|
+
width: 22px;
|
|
1241
|
+
height: 22px;
|
|
1242
|
+
border-radius: 4px;
|
|
1243
|
+
font-size: 1rem;
|
|
1244
|
+
line-height: 1;
|
|
1245
|
+
cursor: pointer;
|
|
1246
|
+
flex-shrink: 0;
|
|
1247
|
+
padding: 0;
|
|
1248
|
+
display: flex;
|
|
1249
|
+
align-items: center;
|
|
1250
|
+
justify-content: center;
|
|
1251
|
+
transition: background 0.15s, color 0.15s, border-color 0.15s;
|
|
1252
|
+
}
|
|
1253
|
+
.retold-remote-operation-status-cancel:hover
|
|
1254
|
+
{
|
|
1255
|
+
background: rgba(244, 135, 113, 0.12);
|
|
1256
|
+
color: #f48771;
|
|
1257
|
+
border-color: #f48771;
|
|
1258
|
+
}
|
|
1259
|
+
.retold-remote-operation-status-more
|
|
1260
|
+
{
|
|
1261
|
+
padding: 6px 16px;
|
|
1262
|
+
font-size: 0.72rem;
|
|
1263
|
+
color: var(--retold-text-dim, #808080);
|
|
1264
|
+
text-align: center;
|
|
1265
|
+
font-style: italic;
|
|
1266
|
+
background: var(--retold-bg-secondary, #252526);
|
|
1267
|
+
border-top: 1px dashed var(--retold-border, #3c3c3c);
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1014
1270
|
/* ============================================================
|
|
1015
1271
|
Gallery
|
|
1016
1272
|
============================================================ */
|
|
@@ -2263,26 +2519,7 @@ html, body
|
|
|
2263
2519
|
{
|
|
2264
2520
|
opacity: 1;
|
|
2265
2521
|
}
|
|
2266
|
-
|
|
2267
|
-
{
|
|
2268
|
-
position: absolute;
|
|
2269
|
-
bottom: 16px;
|
|
2270
|
-
right: 16px;
|
|
2271
|
-
background: rgba(40, 44, 52, 0.85);
|
|
2272
|
-
color: #abb2bf;
|
|
2273
|
-
border: 1px solid rgba(255, 255, 255, 0.15);
|
|
2274
|
-
padding: 6px 14px;
|
|
2275
|
-
border-radius: 6px;
|
|
2276
|
-
font-size: 0.82rem;
|
|
2277
|
-
cursor: pointer;
|
|
2278
|
-
z-index: 20;
|
|
2279
|
-
transition: background 0.2s, color 0.2s;
|
|
2280
|
-
}
|
|
2281
|
-
.retold-remote-image-explore-btn:hover
|
|
2282
|
-
{
|
|
2283
|
-
background: rgba(97, 175, 239, 0.3);
|
|
2284
|
-
color: #fff;
|
|
2285
|
-
}
|
|
2522
|
+
/* Explore button overlay styles removed — button moved to nav bar */
|
|
2286
2523
|
.retold-remote-image-large-badge
|
|
2287
2524
|
{
|
|
2288
2525
|
position: absolute;
|
|
@@ -2480,6 +2717,75 @@ html, body
|
|
|
2480
2717
|
text-align: center;
|
|
2481
2718
|
color: var(--retold-text-secondary);
|
|
2482
2719
|
}
|
|
2720
|
+
/* Subimage region overlays */
|
|
2721
|
+
.retold-remote-iex-region-overlay
|
|
2722
|
+
{
|
|
2723
|
+
border: 2px solid rgba(229, 192, 123, 0.85);
|
|
2724
|
+
background: rgba(229, 192, 123, 0.08);
|
|
2725
|
+
pointer-events: none;
|
|
2726
|
+
position: relative;
|
|
2727
|
+
}
|
|
2728
|
+
/* Subimages sidebar panel */
|
|
2729
|
+
.retold-remote-subimages-panel
|
|
2730
|
+
{
|
|
2731
|
+
overflow-y: auto;
|
|
2732
|
+
height: 100%;
|
|
2733
|
+
}
|
|
2734
|
+
.retold-remote-subimages-item
|
|
2735
|
+
{
|
|
2736
|
+
display: flex;
|
|
2737
|
+
align-items: center;
|
|
2738
|
+
justify-content: space-between;
|
|
2739
|
+
padding: 6px 10px;
|
|
2740
|
+
border-bottom: 1px solid var(--retold-border);
|
|
2741
|
+
cursor: default;
|
|
2742
|
+
transition: background 0.15s;
|
|
2743
|
+
}
|
|
2744
|
+
.retold-remote-subimages-item:hover
|
|
2745
|
+
{
|
|
2746
|
+
background: rgba(255, 255, 255, 0.04);
|
|
2747
|
+
}
|
|
2748
|
+
.retold-remote-subimages-item-info
|
|
2749
|
+
{
|
|
2750
|
+
flex: 1;
|
|
2751
|
+
min-width: 0;
|
|
2752
|
+
overflow: hidden;
|
|
2753
|
+
}
|
|
2754
|
+
.retold-remote-subimages-item-label
|
|
2755
|
+
{
|
|
2756
|
+
font-size: 0.82rem;
|
|
2757
|
+
color: var(--retold-text);
|
|
2758
|
+
white-space: nowrap;
|
|
2759
|
+
overflow: hidden;
|
|
2760
|
+
text-overflow: ellipsis;
|
|
2761
|
+
}
|
|
2762
|
+
.retold-remote-subimages-item-dims
|
|
2763
|
+
{
|
|
2764
|
+
font-size: 0.7rem;
|
|
2765
|
+
color: var(--retold-text-dim);
|
|
2766
|
+
margin-top: 1px;
|
|
2767
|
+
}
|
|
2768
|
+
.retold-remote-subimages-item-actions
|
|
2769
|
+
{
|
|
2770
|
+
display: flex;
|
|
2771
|
+
gap: 2px;
|
|
2772
|
+
margin-left: 6px;
|
|
2773
|
+
flex-shrink: 0;
|
|
2774
|
+
}
|
|
2775
|
+
.retold-remote-subimages-item-actions button
|
|
2776
|
+
{
|
|
2777
|
+
background: transparent;
|
|
2778
|
+
border: 1px solid var(--retold-border);
|
|
2779
|
+
border-radius: 3px;
|
|
2780
|
+
color: var(--retold-text-dim);
|
|
2781
|
+
cursor: pointer;
|
|
2782
|
+
transition: color 0.15s, border-color 0.15s;
|
|
2783
|
+
}
|
|
2784
|
+
.retold-remote-subimages-item-actions button:hover
|
|
2785
|
+
{
|
|
2786
|
+
color: var(--retold-text);
|
|
2787
|
+
border-color: var(--retold-accent);
|
|
2788
|
+
}
|
|
2483
2789
|
|
|
2484
2790
|
/* ============================================================
|
|
2485
2791
|
AudioExplorer
|
|
@@ -3515,6 +3821,23 @@ html, body
|
|
|
3515
3821
|
border-color: var(--retold-accent);
|
|
3516
3822
|
color: var(--retold-text-primary);
|
|
3517
3823
|
}
|
|
3824
|
+
.retold-remote-collections-export-btn
|
|
3825
|
+
{
|
|
3826
|
+
padding: 3px 8px;
|
|
3827
|
+
border: 1px solid var(--retold-border);
|
|
3828
|
+
border-radius: 3px;
|
|
3829
|
+
background: transparent;
|
|
3830
|
+
color: var(--retold-text-muted);
|
|
3831
|
+
font-size: 0.72rem;
|
|
3832
|
+
cursor: pointer;
|
|
3833
|
+
font-family: inherit;
|
|
3834
|
+
margin-left: auto;
|
|
3835
|
+
}
|
|
3836
|
+
.retold-remote-collections-export-btn:hover
|
|
3837
|
+
{
|
|
3838
|
+
border-color: var(--retold-accent);
|
|
3839
|
+
color: var(--retold-text-primary);
|
|
3840
|
+
}
|
|
3518
3841
|
/* ---- Item rows ---- */
|
|
3519
3842
|
.retold-remote-collection-item
|
|
3520
3843
|
{
|
package/docs/.nojekyll
ADDED
|
File without changes
|
package/docs/README.md
CHANGED
|
@@ -4,10 +4,18 @@ A browser-based media server and NAS file explorer. Point it at a folder and bro
|
|
|
4
4
|
|
|
5
5
|
## Quick Start
|
|
6
6
|
|
|
7
|
+
Just the media browser:
|
|
8
|
+
|
|
7
9
|
```bash
|
|
8
10
|
npx retold-remote serve /path/to/media
|
|
9
11
|
```
|
|
10
12
|
|
|
13
|
+
The full stack (Retold Remote + embedded Orator-Conversion + child Ultravisor):
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
retold-stack /path/to/media
|
|
17
|
+
```
|
|
18
|
+
|
|
11
19
|
Or with Docker:
|
|
12
20
|
|
|
13
21
|
```bash
|
|
@@ -17,17 +25,25 @@ docker run -p 8086:8086 -v /path/to/media:/media retold-remote
|
|
|
17
25
|
|
|
18
26
|
Then open `http://localhost:8086` in a browser.
|
|
19
27
|
|
|
28
|
+
See [Stack Launcher](stack-launcher.md) for what `retold-stack` does and how the XDG-style data paths work.
|
|
29
|
+
|
|
20
30
|
## Features
|
|
21
31
|
|
|
22
32
|
- **Gallery browser** with grid and list views, thumbnail generation, and lazy loading
|
|
23
33
|
- **Image viewer** with three fit modes, 0.25x-8x zoom, and EXIF orientation support
|
|
24
34
|
- **Video viewer** with action menu, in-browser playback, VLC streaming, and frame explorer
|
|
25
35
|
- **Audio viewer** with waveform visualization, selection-based playback, and segment extraction
|
|
26
|
-
- **eBook reader** for EPUB and MOBI with table of contents and
|
|
36
|
+
- **eBook reader** for EPUB and MOBI with table of contents, page navigation, text selection capture, and visual region selection
|
|
37
|
+
- **PDF viewer** with full pdf.js rendering, page navigation, text layer selection, and visual region selection
|
|
38
|
+
- **Document conversion** for DOC, DOCX, RTF, ODT, WPD, ODP, PPT(X), ODS, XLS(X) -- converted to PDF on the fly via Orator-Conversion + LibreOffice
|
|
27
39
|
- **Code/text viewer** with syntax highlighting for 30+ languages
|
|
28
|
-
- **PDF viewer** via native browser rendering
|
|
29
40
|
- **Archive browsing** into zip, 7z, rar, tar.gz, cbz, and cbr files as virtual folders
|
|
30
41
|
- **Filtering and sorting** by media type, extension, file size, date, and text search (with regex)
|
|
42
|
+
- **Subimage regions** -- draw labeled rectangles on images, ebook pages, and PDF pages; persisted per file. Double-click an existing region to resize, move, or rename it in place.
|
|
43
|
+
- **Regions Browser** -- topbar button opens a folder-scoped view of every saved region across every file; drill down by folder tree, click any region to jump to it.
|
|
44
|
+
- **Collections & Export** -- bookmark files, image crops, video clips, audio clips, and document regions; export the whole collection to a folder with proper file cutting
|
|
45
|
+
- **Stack mode** -- single command launches Ultravisor coordinator + Retold Remote + embedded Orator-Conversion with sane XDG data paths
|
|
46
|
+
- **Ultravisor offload** -- heavy work (frame extraction, waveforms, conversions) dispatched to a beacon worker on a faster machine
|
|
31
47
|
- **15 themes** from greyscale to retro and cyberpunk
|
|
32
48
|
- **Full keyboard navigation** across every mode
|
|
33
49
|
- **Media type override** to force any file open as image, video, audio, or text (keys 1-4)
|
|
@@ -40,14 +56,17 @@ Then open `http://localhost:8086` in a browser.
|
|
|
40
56
|
| Document | Contents |
|
|
41
57
|
|----------|----------|
|
|
42
58
|
| [Server Setup and Docker](server-setup.md) | Installation, CLI options, environment variables, configuration, Docker |
|
|
59
|
+
| [Stack Launcher](stack-launcher.md) | `retold-stack` and `--stack` flag, XDG paths, child process orchestration |
|
|
60
|
+
| [Synology Container Manager](synology.md) | Run the full stack on a Synology NAS via Container Manager |
|
|
61
|
+
| [Ultravisor Integration](ultravisor-integration.md) | Offloading heavy media processing to a beacon worker |
|
|
43
62
|
| [Image Viewer](image-viewer.md) | Fit modes, zoom, keyboard shortcuts, mouse interactions |
|
|
44
63
|
| [Video Viewer](video-viewer.md) | Action menu, in-browser playback, VLC streaming |
|
|
45
64
|
| [Audio Viewer](audio-viewer.md) | HTML5 playback, autoplay, VLC streaming |
|
|
46
|
-
| [eBook Reader](ebook-reader.md) | EPUB/MOBI support,
|
|
47
|
-
| [Image Explorer](image-explorer.md) | Deep-zoom with OpenSeadragon, DZI tiling,
|
|
65
|
+
| [eBook Reader](ebook-reader.md) | EPUB/MOBI support, TOC, page nav, text/region selection |
|
|
66
|
+
| [Image Explorer](image-explorer.md) | Deep-zoom with OpenSeadragon, DZI tiling, region selection |
|
|
48
67
|
| [Video Explorer](video-explorer.md) | Frame grid, timeline, range selection, clip extraction |
|
|
49
68
|
| [Audio Explorer](audio-explorer.md) | Waveform visualization, selection, zoom, segment playback |
|
|
50
|
-
| [Collections](collections.md) | Bookmarks, favorites, quick-add, item types, operation plans |
|
|
69
|
+
| [Collections](collections.md) | Bookmarks, favorites, quick-add, item types, operation plans, export |
|
|
51
70
|
| [File Metadata](metadata.md) | Info overlay, sidebar metadata, EXIF/GPS, ffprobe, explorer info bars |
|
|
52
71
|
|
|
53
72
|
## Keyboard Shortcuts (All Modes)
|
|
@@ -158,10 +177,24 @@ In the frame preview overlay:
|
|
|
158
177
|
| `+` / `=` | Zoom in |
|
|
159
178
|
| `-` | Zoom out |
|
|
160
179
|
| `0` | Reset zoom |
|
|
161
|
-
| `
|
|
180
|
+
| `s` | Toggle region selection mode (draw rectangles) |
|
|
181
|
+
| Double-click a region | Enter edit mode (resize, move, rename) |
|
|
182
|
+
| `a` | Quick-add to collection (current region if selected) |
|
|
162
183
|
| `b` | Toggle collection panel |
|
|
163
184
|
| `h` | Toggle favorite |
|
|
164
|
-
| `Esc` |
|
|
185
|
+
| `Esc` | Unwind one layer (edit mode -> selection mode -> back to viewer) |
|
|
186
|
+
|
|
187
|
+
### Document Viewer (PDF / EPUB)
|
|
188
|
+
|
|
189
|
+
| Key | Action |
|
|
190
|
+
|-----|--------|
|
|
191
|
+
| `s` | Toggle visual region selection mode |
|
|
192
|
+
| `a` | Quick-add document region to collection |
|
|
193
|
+
| `Esc` | Back to gallery |
|
|
194
|
+
|
|
195
|
+
In the PDF viewer, page navigation buttons and a page input are in the controls bar. The text layer supports native browser text selection -- use the **Save Selection** button to capture selected text as a labeled region.
|
|
196
|
+
|
|
197
|
+
In the EPUB reader, the controls bar exposes **Save Selection** (captures the selected text + CFI) and **Select Region** (draws a rectangle over the rendered page).
|
|
165
198
|
|
|
166
199
|
### Sidebar (F9)
|
|
167
200
|
|
|
@@ -184,7 +217,9 @@ mp4, webm, mov, mkv, avi, wmv, flv, m4v, ogv, mpg, mpeg, mpe, mpv, m2v, ts, mts,
|
|
|
184
217
|
mp3, wav, ogg, flac, aac, m4a, wma, oga
|
|
185
218
|
|
|
186
219
|
### Documents
|
|
187
|
-
pdf, epub, mobi
|
|
220
|
+
pdf, epub, mobi, doc, docx, rtf, odt, wpd, wps, pages, odp, ppt, pptx, ods, xls, xlsx
|
|
221
|
+
|
|
222
|
+
Documents beyond pdf/epub/mobi are converted to PDF on the fly via the embedded Orator-Conversion service (requires LibreOffice or Calibre on the server).
|
|
188
223
|
|
|
189
224
|
### Archives
|
|
190
225
|
zip, 7z, rar, tar, tar.gz, tar.bz2, tar.xz, tgz, cbz, cbr
|
|
@@ -204,13 +239,16 @@ These external tools enhance functionality when available on the server:
|
|
|
204
239
|
|
|
205
240
|
| Tool | Feature |
|
|
206
241
|
|------|---------|
|
|
207
|
-
| **sharp** (npm) | Fast image thumbnail generation |
|
|
242
|
+
| **sharp** (npm) | Fast image thumbnail generation, region cropping |
|
|
208
243
|
| **ImageMagick** | Fallback image thumbnails |
|
|
209
|
-
| **ffmpeg** | Video thumbnails, frame extraction, audio waveforms |
|
|
244
|
+
| **ffmpeg** | Video thumbnails, frame extraction, audio waveforms, clip cutting |
|
|
210
245
|
| **ffprobe** | Media metadata (duration, resolution, codec) |
|
|
211
246
|
| **7-Zip** (7z) | Archive browsing for rar, 7z, tar.* formats |
|
|
212
247
|
| **VLC** | External video streaming |
|
|
213
|
-
| **
|
|
248
|
+
| **audiowaveform** (BBC) | Faster audio waveform peak generation |
|
|
249
|
+
| **ebook-convert** (Calibre) | MOBI/AZW to EPUB conversion (and PDF fallback for documents) |
|
|
250
|
+
| **LibreOffice** (`soffice`) | DOC/DOCX/RTF/ODT/WPD/PPT(X)/XLS(X) to PDF conversion |
|
|
251
|
+
| **pdftk** + **pdftoppm** (poppler) | PDF page extraction and rendering (used by Orator-Conversion) |
|
|
214
252
|
|
|
215
253
|
Without these tools the application still works -- images serve directly, videos play in-browser, and zip/cbz archives use native extraction.
|
|
216
254
|
|
|
@@ -231,7 +269,21 @@ Without these tools the application still works -- images serve directly, videos
|
|
|
231
269
|
| GET | `/api/media/audio-waveform?path=&peaks=` | Audio waveform peak data |
|
|
232
270
|
| GET | `/api/media/audio-segment?path=&start=&end=` | Extract audio segment |
|
|
233
271
|
| GET | `/api/media/ebook-convert?path=` | Convert MOBI to EPUB |
|
|
234
|
-
| GET | `/api/media/
|
|
272
|
+
| GET | `/api/media/doc-convert?path=` | Convert DOC/DOCX/RTF/ODT/WPD/etc. to PDF |
|
|
273
|
+
| GET | `/api/media/ebook/:cacheKey/:filename` | Serve converted ebook or PDF |
|
|
274
|
+
| GET | `/api/media/pdf-text?path=&page=` | Extract text from a PDF page |
|
|
275
|
+
| GET | `/api/media/subimage-regions?path=` | List labeled regions for a single file |
|
|
276
|
+
| GET | `/api/media/subimage-regions?folder=<prefix>` | List labeled regions for every file under a folder prefix (empty prefix = everything). Backed by an in-memory cache invalidated on mutations. |
|
|
277
|
+
| POST | `/api/media/subimage-regions` | Add a labeled region (visual or text-selection) |
|
|
278
|
+
| PUT | `/api/media/subimage-regions/:id` | Update a region's label or coordinates |
|
|
279
|
+
| DELETE | `/api/media/subimage-regions/:id?path=` | Remove a labeled region |
|
|
280
|
+
| GET | `/api/collections` | List all collections |
|
|
281
|
+
| POST | `/api/collections/:guid/items` | Add items to a collection |
|
|
282
|
+
| POST | `/api/collections/:guid/export` | Export collection to a folder (cuts clips, crops images) |
|
|
283
|
+
| POST | `/api/conversion/1.0/doc-to-pdf` | Convert any document buffer to PDF (via Orator-Conversion) |
|
|
284
|
+
| POST | `/api/conversion/1.0/pdf-to-page-png/:Page` | Render a PDF page as PNG |
|
|
285
|
+
| POST | `/api/conversion/1.0/pdf-to-page-jpg/:Page/:LongSidePixels` | Render and resize a PDF page as JPEG |
|
|
286
|
+
| POST | `/api/conversion/1.0/image/resize` | Resize an image |
|
|
235
287
|
| POST | `/api/media/open` | Open file in external player (VLC) |
|
|
236
288
|
|
|
237
289
|
## License
|
package/docs/_cover.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
# Retold Remote
|
|
1
|
+
# Retold Remote
|
|
2
2
|
|
|
3
3
|
> A browser-based media server and NAS file explorer
|
|
4
4
|
|
|
5
5
|
Browse images, videos, audio, ebooks, code, and documents through a keyboard-driven gallery interface with 15 built-in themes. Point it at a folder and start exploring.
|
|
6
6
|
|
|
7
|
-
- **Gallery Browser**
|
|
8
|
-
- **Media Viewers**
|
|
9
|
-
- **Video Explorer**
|
|
10
|
-
- **Audio Explorer**
|
|
11
|
-
- **Full Keyboard Navigation**
|
|
7
|
+
- **Gallery Browser** -- Grid and list views with thumbnails, filtering, sorting, and text search
|
|
8
|
+
- **Media Viewers** -- Dedicated viewers for images, video, audio, ebooks, code, and PDFs
|
|
9
|
+
- **Video Explorer** -- Extract and browse frames from any video with a visual timeline
|
|
10
|
+
- **Audio Explorer** -- Waveform visualization with selection, zoom, and segment playback
|
|
11
|
+
- **Full Keyboard Navigation** -- Every feature accessible from the keyboard
|
|
12
12
|
|
|
13
13
|
[Get Started](server-setup.md)
|
|
14
14
|
[View on GitHub](https://github.com/stevenvelozo/retold-remote)
|
package/docs/_sidebar.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
- Getting Started
|
|
4
4
|
- [Server Setup & Docker](server-setup.md)
|
|
5
|
+
- [Stack Launcher](stack-launcher.md)
|
|
6
|
+
- [Synology Container Manager](synology.md)
|
|
5
7
|
- [Ultravisor Integration](ultravisor-integration.md)
|
|
6
8
|
- [Ultravisor Beacon Tool Setup](ultravisor-configuration.md)
|
|
7
9
|
|
package/docs/_topbar.md
CHANGED
package/docs/collections.md
CHANGED
|
@@ -16,6 +16,11 @@ Press `a` in any mode to add the current item to a collection. If a collection i
|
|
|
16
16
|
| Video explorer | Video frame | Path, timestamp, cached frame image |
|
|
17
17
|
| Video explorer (with selection) | Video clip | Path, start time, end time |
|
|
18
18
|
| Audio explorer (with selection) | Audio clip | Path, start time, end time |
|
|
19
|
+
| Image explorer (with active region) | Image crop | Path, X, Y, Width, Height in original pixels |
|
|
20
|
+
| PDF viewer (with text selection) | Document region (text) | Path, page number, selected text |
|
|
21
|
+
| PDF viewer (with visual region) | Document region (visual) | Path, page number, X/Y/Width/Height in PDF units |
|
|
22
|
+
| EPUB reader (with text selection) | Document region (text) | Path, CFI, spine index, chapter title, selected text |
|
|
23
|
+
| EPUB reader (with visual region) | Document region (visual) | Path, X/Y/Width/Height in container coordinates |
|
|
19
24
|
|
|
20
25
|
### Folder Choice
|
|
21
26
|
|
|
@@ -136,11 +141,35 @@ Pending item destinations can be edited inline by clicking the destination path.
|
|
|
136
141
|
| `a` | Gallery, viewer, all explorers | Quick-add current item to collection |
|
|
137
142
|
| `s` | Video explorer | Add selected range as video clip |
|
|
138
143
|
| `s` | Audio explorer | Save audio snippet to collection |
|
|
144
|
+
| `s` | Image explorer | Toggle region selection mode |
|
|
145
|
+
| `s` | Document viewer (PDF/EPUB) | Toggle visual region selection mode |
|
|
139
146
|
| `[` | Video explorer | Set selection start at current frame |
|
|
140
147
|
| `]` | Video explorer | Set selection end at current frame |
|
|
141
148
|
| `b` | All modes | Toggle collection panel |
|
|
142
149
|
| `h` | All modes | Toggle favorite |
|
|
143
150
|
|
|
151
|
+
## Export
|
|
152
|
+
|
|
153
|
+
Collections can be exported to a folder within the content root. Each item is processed according to its type:
|
|
154
|
+
|
|
155
|
+
| Item Type | Export Behavior |
|
|
156
|
+
|-----------|----------------|
|
|
157
|
+
| `file` / `subfile` | Copied directly to the destination |
|
|
158
|
+
| `image-crop` | Cropped via sharp at the original resolution |
|
|
159
|
+
| `video-clip` | Extracted via `ffmpeg -ss -t -c copy` |
|
|
160
|
+
| `video-frame` | Extracted via `ffmpeg -ss -vframes 1` |
|
|
161
|
+
| `audio-clip` | Extracted via `ffmpeg -ss -t -vn` |
|
|
162
|
+
| `document-region` (text) | Written as a `.txt` file with the captured text and source metadata |
|
|
163
|
+
| `document-region` (visual) | Metadata file describing the page and region |
|
|
164
|
+
| `folder` | Copied recursively |
|
|
165
|
+
| `folder-contents` | Files copied flat into the destination |
|
|
166
|
+
|
|
167
|
+
Exported files are named `{sortOrder}_{label}.{ext}` so the order is preserved on disk.
|
|
168
|
+
|
|
169
|
+
To export, click the **⇩ Export** button in the collection detail header. You will be prompted for a destination path (relative to the content root).
|
|
170
|
+
|
|
171
|
+
The export endpoint is restricted to paths within the content root for safety -- paths containing `..` or absolute paths are rejected.
|
|
172
|
+
|
|
144
173
|
## Data Storage
|
|
145
174
|
|
|
146
175
|
Collections are stored server-side as Bibliograph records. Each collection is a JSON document containing the collection metadata and its items array. The favorites collection uses a well-known GUID and is created automatically.
|
|
@@ -160,3 +189,4 @@ Client-side state (which collection is open, panel width, last-used collection)
|
|
|
160
189
|
| PUT | `/api/collections/:guid/reorder` | Reorder items (manual sort) |
|
|
161
190
|
| POST | `/api/collections/copy-items` | Copy items between collections |
|
|
162
191
|
| POST | `/api/collections/:guid/execute` | Execute pending operations (operation plans) |
|
|
192
|
+
| POST | `/api/collections/:guid/export` | Export the collection to a folder within the content root |
|