source: Klonkt/src/views/pages/admin-migrate.ejs@ eb071a7

main
Last change on this file since eb071a7 was eb071a7, checked in by Robin <roboburr@…>, 4 weeks ago

Een tweede ronde vult aan in plaats van over te slaan

Robin vroeg of hij eerst moest opschonen. Bij het uitzoeken bleek dat het
antwoord "ja" had moeten zijn, en dat dat een val in mijn eigen ontwerp was.

De ingest onthield per bron-URI dat hij hem gehad had, en passeerde hem daarna
altijd. Dat is prima zolang er niets verandert, maar er kwam juist iets bij:
hoezen, duur en playlists. Wie al opgehaald had zat vast. Opnieuw drukken sloeg
alles over, en opruimen hielp niet, want die blokkade zat in ap_migration en
niet in de tracks. Je zou drie dingen tegelijk moeten wissen om er los te komen,
en dat is geen opdracht die je een gebruiker geeft.

Nu kijkt hij op waar een bron-URI hier terechtkwam, en vult LEGE velden aan op
de rij die er al staat. Wat je zelf hebt aangepast blijft staan: een migratie
hoort je correcties niet terug te draaien. Het geluidsbestand wordt niet opnieuw
gedownload. Playlists werken hetzelfde: dezelfde rij, en de volgorde opnieuw
gezet, want een half bijgewerkte volgorde is erger dan een verse.

Gemeten op de gemeten stand van soundfabrics.nl (139 nummers met bestand, geen
hoes, geen duur, geen playlist), nagebouwd met 3 nummers:

ronde 1 3 nummers binnen, geen hoes, duur 212s uit PT212S
ronde 2 0 erbij, 3 aangevuld, 1 playlist, geen dubbele, mp3 niet opnieuw
ronde 3 0 aangevuld, alles compleet, niets verandert

Changed files:
src/services/MigrationService.js

  • migrationTarget(): waar kwam deze bron-URI terecht
  • tracks worden aangevuld in plaats van gepasseerd; alleen lege velden
  • de trackkaart wordt OOK in die tak gevuld, anders vinden de playlists hun nummers niet en komt er geen plaat
  • playlists werken dezelfde kant op, met hun eigen mapping

src/views/pages/admin-migrate.ejs

  • "nummers aangevuld" en playlists in het ophaalverslag; anders meldt een ronde die drie nummers compleet maakte "0 erbij gekomen"

src/services/i18n.js

  • mig.r_tracks_updated in nl/en/de

remarks: het verslag zegt ook "1 playlists" als er niets aan die plaat
veranderde, want de volgorde wordt elke ronde opnieuw gezet. Klopt wel, leest
iets te groot. Robin hoeft nu niets op te schonen: een keer ophalen na de uitrol
volstaat.

-robo
Co-Authored-By: Claude Opus 4.8 <noreply@…>

  • Property mode set to 100644
File size: 11.8 KB
Line 
1<div class="container mig-wrap">
2 <h1><%= t('mig.title') %></h1>
3 <p class="mig-lead"><%= t('mig.lead') %></p>
4
5 <% if (typeof success !== 'undefined' && success) { %><div class="alert alert-success"><%= success %></div><% } %>
6 <% if (typeof error !== 'undefined' && error) { %><div class="alert alert-error"><%= error %></div><% } %>
7
8 <%# ── Exporteren ─────────────────────────────────────────────── %>
9 <section class="mig-card">
10 <h2><%= t('mig.export_title') %></h2>
11 <p class="form-hint"><%= t('mig.export_hint') %></p>
12
13 <% if (telling) { %>
14 <ul class="mig-counts">
15 <li><strong><%= telling.posts %></strong> <%= t('mig.c_posts') %></li>
16 <li><strong><%= telling.replies %></strong> <%= t('mig.c_replies') %></li>
17 <li><strong><%= telling.media %></strong> <%= t('mig.c_media') %></li>
18 <%# Muziek APART tellen, niet onder "media". Dit ontbrak, en juist daardoor
19 kon een export van 140 nummers er als 4,5 MB uitzien zonder dat iemand
20 het merkte: de teller zei "39 mediabestanden" en zweeg over de rest. %>
21 <% if (telling.tracks) { %>
22 <%# Wat er ECHT meegaat, niet hoeveel rijen er in de database staan.
23 "8 nummers" met daaronder "van 3 ontbreekt het bestand" telt niet
24 op; 5 plus die waarschuwing wel. %>
25 <li><strong><%= telling.tracks - (telling.audioMissing || 0) %></strong> <%= t('mig.c_tracks') %></li>
26 <% } %>
27 <% if (telling.playlists) { %>
28 <li><strong><%= telling.playlists %></strong> <%= t('mig.c_playlists') %></li>
29 <% } %>
30 <% if (typeof telling.following === 'number') { %>
31 <li><strong><%= telling.following %></strong> <%= t('mig.c_following') %></li>
32 <% } %>
33 <li><strong><%= mb(telling.bytes) %></strong> <%= t('mig.c_size') %></li>
34 </ul>
35
36 <% if (telling.ontbrekend) { %>
37 <%# Niets stils: media die op schijf ontbreekt wordt geteld en gemeld, want
38 een archief dat stilzwijgend minder bevat is erger dan een waarschuwing. %>
39 <p class="alert alert-error"><%= t('mig.missing', { n: telling.ontbrekend }) %></p>
40 <% } %>
41
42 <% if (telling.audioMissing) { %>
43 <%# Een eigen zin voor muziek. "N mediaverwijzingen" zei niets over de
44 vraag die er toe doet: gaat mijn bibliotheek mee. %>
45 <p class="alert alert-error"><%= t('mig.audio_missing', { n: telling.audioMissing }) %></p>
46 <% } %>
47
48
49 <% if (telling.groot) { %>
50 <p class="alert alert-error"><%= t('mig.too_big') %></p>
51 <% } else { %>
52 <p><a class="btn btn-primary" href="/admin/migrate/export"><%= t('mig.export_btn') %></a></p>
53 <% } %>
54 <% } else { %>
55 <p class="form-hint"><%= t('mig.export_none') %></p>
56 <% } %>
57 </section>
58
59 <%# ── Rechtstreeks ophalen (FEP-1580) ────────────────────────── %>
60 <section class="mig-card">
61 <h2><%= t('mig.pull_title') %></h2>
62 <p class="form-hint"><%= t('mig.pull_hint') %></p>
63
64 <% if (haalVerslag) { %>
65 <div class="mig-report<%= haalVerslag.error ? '' : ' is-done' %>">
66 <% if (haalVerslag.error) { %>
67 <h3><%= t('mig.pull_failed') %></h3>
68 <%# Elke weigering krijgt een eigen zin. "Er ging iets mis" laat je
69 raden welke van de twee kanten van de afspraak ontbreekt, en dat
70 is precies wat je moet weten om het op te lossen. %>
71 <p><%= t('mig.e_' + haalVerslag.error) !== 'mig.e_' + haalVerslag.error
72 ? t('mig.e_' + haalVerslag.error) : (haalVerslag.melding || haalVerslag.error) %></p>
73 <% if (haalVerslag.error === 'not_moved_here' && haalVerslag.movedTo) { %>
74 <p class="form-hint"><%= t('mig.e_points_at') %> <code><%= haalVerslag.movedTo %></code></p>
75 <% } %>
76 <% } else { %>
77 <h3><%= t('mig.pull_done') %></h3>
78 <ul class="mig-counts">
79 <li><strong><%= haalVerslag.posts %></strong> <%= t('mig.r_imported') %></li>
80 <% if (haalVerslag.overgeslagen) { %><li><strong><%= haalVerslag.overgeslagen %></strong> <%= t('mig.r_skipped') %></li><% } %>
81 <% if (haalVerslag.media) { %><li><strong><%= haalVerslag.media %></strong> <%= t('mig.r_media') %></li><% } %>
82 <% if (haalVerslag.blocks) { %><li><strong><%= haalVerslag.blocks %></strong> <%= t('mig.r_blocks') %></li><% } %>
83 <% if (haalVerslag.tracksBinnen) { %><li><strong><%= haalVerslag.tracksBinnen %></strong> <%= t('mig.c_tracks') %></li><% } %>
84 <%# Aangevuld telt apart van nieuw. Een tweede ronde die "0 erbij"
85 meldt terwijl hij drie nummers compleet maakte, leest als niets
86 gedaan. %>
87 <% if (haalVerslag.tracksBijgewerkt) { %><li><strong><%= haalVerslag.tracksBijgewerkt %></strong> <%= t('mig.r_tracks_updated') %></li><% } %>
88 <% if (haalVerslag.playlistsBinnen) { %><li><strong><%= haalVerslag.playlistsBinnen %></strong> <%= t('mig.c_playlists') %></li><% } %>
89 </ul>
90 <% if (haalVerslag.tracksMislukt) { %>
91 <p class="alert alert-error"><%= t('mig.r_tracks_missing', { n: haalVerslag.tracksMislukt }) %></p>
92 <% } %>
93 <% } %>
94 <% if (haalVerslag.waarschuwingen && haalVerslag.waarschuwingen.length) { %>
95 <ul class="mig-warnlist">
96 <% haalVerslag.waarschuwingen.slice(0, 6).forEach(function (w) { %><li><%= w %></li><% }); %>
97 </ul>
98 <% } %>
99 </div>
100 <% } %>
101
102 <form method="post" action="/admin/migrate/pull">
103 <label for="mig-bron"><%= t('mig.pull_source') %></label>
104 <input type="url" id="mig-bron" name="bron" value="<%= bron || '' %>"
105 placeholder="https://oude-klonkt.nl/ap/users/jij" class="mig-input">
106 <p class="form-hint"><%= t('mig.pull_source_hint') %></p>
107 <button type="submit" class="btn"><%= t('mig.pull_btn') %></button>
108 </form>
109
110 <% if (mig && (mig.total || mig.moves)) { %>
111 <p class="form-hint mig-state">
112 <%= t('mig.state', { n: mig.total }) %>
113 <%= mig.complete ? t('mig.state_done') : t('mig.state_busy') %>
114 </p>
115 <% } %>
116 </section>
117
118 <%# ── Importeren ─────────────────────────────────────────────── %>
119 <section class="mig-card">
120 <h2><%= t('mig.import_title') %></h2>
121 <p class="form-hint"><%= t('mig.import_hint') %></p>
122
123 <% if (verslag) { %>
124 <div class="mig-report<%= verslag.echt ? ' is-done' : '' %>">
125 <h3><%= verslag.echt ? t('mig.r_done') : t('mig.r_dry') %></h3>
126 <p class="form-hint"><%= verslag.bestand %> &middot; <%= mb(verslag.bytes) %></p>
127 <ul class="mig-counts">
128 <li><strong><%= verslag.posts %></strong> <%= verslag.echt ? t('mig.r_imported') : t('mig.r_would') %></li>
129 <li><strong><%= verslag.overgeslagen %></strong> <%= t('mig.r_skipped') %></li>
130 <% if (verslag.overschreven) { %><li><strong><%= verslag.overschreven %></strong> <%= t('mig.r_overwritten') %></li><% } %>
131 <% if (verslag.mediaMissing) { %><li><strong><%= verslag.mediaMissing %></strong> <%= t('mig.r_media_missing') %></li><% } %>
132 <% if (verslag.media) { %><li><strong><%= verslag.media %></strong> <%= t('mig.r_media') %></li><% } %>
133 <%# Ook hier: muziek apart. Zonder deze twee regels zie je aan de
134 ontvangende kant net zo min of je bibliotheek is aangekomen. %>
135 <% if (verslag.tracks) { %><li><strong><%= verslag.tracks %></strong> <%= t('mig.c_tracks') %></li><% } %>
136 <% if (verslag.playlists) { %><li><strong><%= verslag.playlists %></strong> <%= t('mig.c_playlists') %></li><% } %>
137 </ul>
138 <% if (verslag.tracksMissing) { %>
139 <p class="alert alert-error"><%= t('mig.r_tracks_missing', { n: verslag.tracksMissing }) %></p>
140 <% } %>
141 <% if (verslag.waarschuwingen && verslag.waarschuwingen.length) { %>
142 <ul class="mig-warnlist">
143 <% verslag.waarschuwingen.slice(0, 6).forEach(function (w) { %><li><%= w %></li><% }); %>
144 </ul>
145 <% } %>
146 <% if (verslag.idsBehouden === false) { %>
147 <%# Dit is de belangrijkste regel van het hele verslag: komt het archief
148 van een ANDER adres, dan krijgen de posts nieuwe id's en zijn het
149 nieuwe objecten voor de fediverse. %>
150 <p class="alert alert-error"><%= t('mig.r_new_ids') %></p>
151 <% } %>
152
153 <% if (!verslag.echt && verslag.posts > 0) { %>
154 <form method="post" action="/admin/migrate/import" enctype="multipart/form-data" class="mig-confirm">
155 <p class="form-hint"><%= t('mig.r_confirm_hint') %></p>
156 <label for="mig-file2"><%= t('mig.file_label') %></label>
157 <input type="file" id="mig-file2" name="archief" accept=".zip,application/zip" required>
158 <input type="hidden" name="echt" value="1">
159 <% if (verslag.overschrijf) { %><input type="hidden" name="overschrijf" value="1"><% } %>
160 <button type="submit" class="btn btn-primary"><%= t('mig.r_confirm_btn') %></button>
161 </form>
162 <% } %>
163 </div>
164 <% } %>
165
166 <form method="post" action="/admin/migrate/import" enctype="multipart/form-data">
167 <label for="mig-file"><%= t('mig.file_label') %></label>
168 <input type="file" id="mig-file" name="archief" accept=".zip,application/zip" required>
169
170 <label class="mig-check">
171 <input type="checkbox" name="overschrijf" value="1">
172 <%= t('mig.overwrite_label') %>
173 </label>
174 <p class="form-hint mig-warn"><%= t('mig.overwrite_hint') %></p>
175
176 <button type="submit" class="btn"><%= t('mig.check_btn') %></button>
177 <p class="form-hint"><%= t('mig.check_hint') %></p>
178 </form>
179 </section>
180
181 <%# ── Wie je volgt ────────────────────────────────────────────── %>
182 <section class="mig-card">
183 <h2><%= t('mig.follows_title') %></h2>
184 <p class="form-hint"><%= t('mig.follows_hint') %></p>
185 <p><a class="btn" href="/connect"><%= t('mig.follows_btn') %></a></p>
186 </section>
187</div>
188
189<style>
190 .mig-wrap { max-width: 46rem; }
191 .mig-lead { color: var(--sub); margin-bottom: 1.5rem; }
192 .mig-card { border: 1px solid var(--rule); border-radius: 12px; padding: 1.25rem 1.4rem; margin-bottom: 1.25rem; }
193 .mig-card h2 { margin: 0 0 .35rem; font-size: 1.1rem; }
194 .mig-counts { list-style: none; padding: 0; margin: .9rem 0; display: flex; flex-wrap: wrap; gap: .4rem 1.4rem; }
195 .mig-counts li { color: var(--sub); font-size: .94rem; }
196 .mig-counts strong { color: var(--ink); font-size: 1.05rem; }
197 .mig-card label { display: block; margin: .9rem 0 .35rem; font-weight: 600; font-size: .92rem; }
198 .mig-card input[type="file"] { display: block; margin-bottom: .6rem; }
199 .mig-check { display: flex; align-items: center; gap: .5rem; font-weight: 400 !important; }
200 .mig-input { width: 100%; max-width: 34rem; padding: .5rem .6rem; border: 1px solid var(--rule);
201 border-radius: 8px; background: transparent; color: var(--ink); font-size: .95rem; }
202 .mig-state { margin-top: .9rem; }
203 .mig-report code { word-break: break-all; font-size: .88rem; }
204 .mig-warn { color: var(--accent); }
205 .mig-report { border-left: 3px solid var(--accent); padding: .8rem 1rem; margin-bottom: 1.2rem;
206 background: color-mix(in srgb, var(--ink, #000) 4%, transparent); border-radius: 0 8px 8px 0; }
207 .mig-report.is-done { border-left-color: #3fa843; }
208 .mig-report h3 { margin: 0 0 .3rem; font-size: 1rem; }
209 .mig-warnlist { margin: .5rem 0; padding-left: 1.2rem; color: var(--accent); font-size: .9rem; }
210 .mig-confirm { margin-top: .9rem; padding-top: .9rem; border-top: 1px solid var(--rule); }
211</style>
Note: See TracBrowser for help on using the repository browser.