6.8 KiB
6.8 KiB
name, overview, todos, isProject
| name | overview | todos | isProject | |||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Zipline upload | Een Zipline 4-uploadbestemming toevoegen die je configureert door het ShareX-bestand (.sxcu) of het Shell Script-bestand (.sh) uit Zipline te importeren. Kniip uploadt daarna zelf via HttpClient, met een aparte knop Uploaden in de editor en in het screencastvenster. De link komt op het klembord. |
|
false |
Upload naar Zipline 4
Hoe het werkt
flowchart LR
sxcu["ShareX .sxcu"] --> importer[UploaderImporter]
sh["Shell script .sh"] --> importer
importer --> config["UploaderConfig in AppSettings"]
editorBtn["Editor: Uploaden"] --> client[ZiplineUploader]
castBtn["Screencast: Uploaden"] --> client
config --> client
client -->|"POST multipart"| server["Zipline /api/upload"]
server -->|"JSON files[0].url"| client
client --> clip["URL naar klembord + melding"]
Zipline 4 gebruikt een vast patroon: POST https://host/api/upload met de header authorization: <token>, extra headers zoals x-zipline-format, een multipart-veld file, en als antwoord {"files":[{"url": ...}]}. Beide exportbestanden bevatten precies die gegevens. Kniip leest ze daarom alleen in en voert niets uit.
Nieuwe bestanden in src/Kniip/Upload/
UploaderConfig.csbevat de veldenName,RequestUrl,Headers(een dictionary),FileFormName(standaard"file") enUrlPath(standaard"files[0].url"). Daarnaast staat er een eigenschapIsConfigured.UploaderImporter.cs:FromSxcu(string json): leest metSystem.Text.Jsonde veldenRequestURL,Headers,FileFormNameenURLuit. VanURLwordt{json:files[0].url}omgezet naar het padfiles[0].url. Een.sxcumetBodyanders danMultipartFormDatawordt geweigerd.FromShellScript(string text): zoekt decurl-regel. Daaruit haalt hij dehttp(s)://-URL, elke-H "naam: waarde"als header (behalvecontent-type), en de veldnaam uit-F naam=@.... Het antwoordpad komt uitjq -r <pad>als dat er staat, anders de standaardwaarde. Regelvervolgingen (\aan het einde van een regel) en aanhalingstekens worden gewoon afgehandeld.- Kan het bestand niet worden gelezen, dan geeft de importer een duidelijke Nederlandse foutmelding.
ZiplineUploader.cs: één statischeHttpClienten de methodeTask<string> UploadAsync(UploaderConfig, Stream, string fileName, string contentType, IProgress<double>?, CancellationToken). Die bouwt deMultipartFormDataContent, voegt de headers toe en geeft bij een HTTP-fout de statuscode en deerror-tekst van Zipline terug. Daarna leest hij de URL via een eenvoudige padlezer (a.b[0].c) uit het JSON-antwoord.
Instellingen
- In
src/Kniip/Settings/AppSettings.cskomtpublic UploaderConfig? Uploader { get; set; }bij. - De
authorization-header is een geheime token. Die wordt in de settings-JSON met DPAPI versleuteld voor de huidige gebruiker, viaProtectedData.Protecten het NuGet-pakketSystem.Security.Cryptography.ProtectedData. Dat gebeurt insrc/Kniip/Settings/SettingsStore.csbij het opslaan en laden. - In
src/Kniip/Settings/SettingsWindow.xamlkomt een nieuw tabblad Uploaden met:- Een knop "Importeren..." met een
OpenFileDialogen het filterShareX-uploader (*.sxcu)|*.sxcu|Shell script (*.sh)|*.sh. - Een regel die de huidige bestemming toont: de servernaam uit de URL, zonder token.
- De knoppen "Testen" (uploadt een klein PNG'tje en toont de link) en "Verwijderen".
- Een hinttekst: "Maak het bestand in Zipline via Instellingen > Generate Uploaders (ShareX of Shell Script)."
- Een knop "Importeren..." met een
- De afhandeling komt in
src/Kniip/Settings/SettingsWindow.xaml.cs. De nieuwe configuratie wordt pas bij Opslaan vastgelegd, net als bij de andere instellingen.
Editor
- In
src/Kniip/Editor/EditorWindow.xamlkomt een nieuwe toolbarknopItemId="Upload"(icoon, titel "Uploaden"), tussen Opslaan en Kopiëren. - In
src/Kniip/Editor/EditorWindow.xaml.cskomtUpload_Clickplus de sneltoets Ctrl+U:CommitTextEdit(), daarnaDocumentRenderer.Export(_doc)en vervolgensImageExporter.EncodePng.UploadAsyncmet de bestandsnaamKnipsel yyyy-MM-dd HHmmss.png.- Het resultaat gaat naar
ClipboardWriter.SetText(url)enShowTemporaryHint("Geüpload, link gekopieerd: ..."). - Tijdens het uploaden is de knop uitgeschakeld.
- De knop is ingeklapt zolang
Uploaderniet is ingesteld. Dat wordt opnieuw gecontroleerd inOnActivated, net zoalsApplySaveButtondat doet. - Ik controleer in
ToolbarPaneldat een nieuwItemIdook verschijnt als er al eenToolbarOrderis opgeslagen. Zo niet, dan komen onbekende items achteraan.
Screencast
- In
src/Kniip/Recording/ScreencastWindow.xamlkomt een knopUploadButtonnaast Kopiëren. - In
src/Kniip/Recording/ScreencastWindow.xaml.cskomtUpload_Click. Dat volgt hetzelfde patroon alsCopy_Click:- Eerst
ExportAsyncnaar een tijdelijke map. - Daarna
UploadAsyncmetvideo/mp4ofimage/gif. De voortgang loopt via dezelfdeProgress-balk en annuleren gaat via_export. - Daarna gaat de URL naar het klembord en toont
SavedTextde link. SetBusyschakelt ookUploadButtonuit.
- Eerst
Hulpfunctie
- In
src/Kniip/Editor/ImageExporter.cskrijgtClipboardWriterde methodeSetText(string), met dezelfde aanpak voor een bezet klembord alsSetFile.
Buiten de scope
- Automatisch uploaden bij een nieuw knipsel.
- Een "opslaan en uploaden"-keuze voor de knop Opslaan.
- Het echt uitvoeren van het shellscript.
- Andere uploaders dan Zipline. De importer werkt in principe ook voor andere ShareX-configuraties met multipart, maar dat wordt niet getest.