mirror of
https://github.com/TautvydasDerzinskas/Thingport.git
synced 2026-10-18 20:59:55 -05:00
fix: rename Thingiverse Access Token to App Token to match what it provides
This commit is contained in:
1 parent
8e2c0ad9ec
commit
cc4107694a
22 files changed
+65
-64
No files matched your search
@@ -310,7 +310,7 @@ Thingport ships two small companion tools, each downloadable from the in-app Dow
|
||||
|
||||
## Provider Setup
|
||||
|
||||
Printables imports work with no setup. MakerWorld and Thingiverse each need a credential from your own account first. Connect them under **Configuration → Providers** (from the user menu): right-click a provider to connect or disconnect it. Admins can turn any provider off for the whole instance under **Administration → Providers**. See **[docs/PROVIDER_SETUP.md](docs/PROVIDER_SETUP.md)** for how to create a Thingiverse Access Token and how to grab a MakerWorld session cookie.
|
||||
Printables imports work with no setup. MakerWorld and Thingiverse each need a credential from your own account first. Connect them under **Configuration → Providers** (from the user menu): right-click a provider to connect or disconnect it. Admins can turn any provider off for the whole instance under **Administration → Providers**. See **[docs/PROVIDER_SETUP.md](docs/PROVIDER_SETUP.md)** for how to create a Thingiverse App Token and how to grab a MakerWorld session cookie.
|
||||
|
||||
## Contributing
|
||||
|
||||
|
||||
@@ -291,7 +291,7 @@ router.post(
|
||||
if (!accessToken) {
|
||||
throw new HttpError(
|
||||
503,
|
||||
"Thingiverse import isn't configured for this instance yet -- ask an admin to add an Access Token in Admin Settings.",
|
||||
"Thingiverse import isn't configured for this instance yet -- ask an admin to add an App Token in Admin Settings.",
|
||||
);
|
||||
}
|
||||
|
||||
@@ -329,7 +329,7 @@ router.post(
|
||||
if (!accessToken) {
|
||||
throw new HttpError(
|
||||
503,
|
||||
"Thingiverse import isn't configured for this instance yet -- ask an admin to add an Access Token in Admin Settings.",
|
||||
"Thingiverse import isn't configured for this instance yet -- ask an admin to add an App Token in Admin Settings.",
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -338,7 +338,7 @@ router.post(
|
||||
if (trimmed && !(await verifyThingiverseAccessToken(trimmed))) {
|
||||
throw new HttpError(
|
||||
422,
|
||||
"Couldn't verify this Thingiverse Access Token -- it may be invalid, revoked, or Thingiverse is rate-limiting this instance right now. Double-check the token at thingiverse.com/apps/create and try again.",
|
||||
"Couldn't verify this Thingiverse App Token -- it may be invalid, revoked, or Thingiverse is rate-limiting this instance right now. Double-check the token at thingiverse.com/apps/create and try again.",
|
||||
);
|
||||
}
|
||||
await setThingiverseAccessToken(body.access_token);
|
||||
|
||||
@@ -54,14 +54,14 @@ export async function fetchSourceMeta(userId: string, print: Print, sourceUrl: s
|
||||
if (!accessToken) {
|
||||
throw new HttpError(
|
||||
503,
|
||||
"Thingiverse import isn't configured for this instance yet -- ask an admin to add an Access Token in Admin Settings.",
|
||||
"Thingiverse import isn't configured for this instance yet -- ask an admin to add an App Token in Admin Settings.",
|
||||
);
|
||||
}
|
||||
const resolved = await resolveThingiverseThing(externalId, accessToken);
|
||||
if (!resolved) {
|
||||
throw new HttpError(
|
||||
404,
|
||||
"This Thingiverse Thing could not be found, or isn't accessible with the configured Access Token.",
|
||||
"This Thingiverse Thing could not be found, or isn't accessible with the configured App Token.",
|
||||
);
|
||||
}
|
||||
return {
|
||||
|
||||
@@ -392,7 +392,7 @@ async function runThingiverseThingsImportJob(
|
||||
if (!accessToken) {
|
||||
throw new HttpError(
|
||||
503,
|
||||
"Thingiverse import isn't configured for this instance yet -- ask an admin to add an Access Token in Admin Settings.",
|
||||
"Thingiverse import isn't configured for this instance yet -- ask an admin to add an App Token in Admin Settings.",
|
||||
);
|
||||
}
|
||||
|
||||
@@ -486,7 +486,7 @@ async function runThingiverseThingsImportJob(
|
||||
`${rateLimited} blocked by Thingiverse's rate-limit protection (too many requests at once) — wait a while, then retry`,
|
||||
);
|
||||
}
|
||||
if (authFailed) bodyParts.push(`${authFailed} failed because the configured Access Token was rejected`);
|
||||
if (authFailed) bodyParts.push(`${authFailed} failed because the configured App Token was rejected`);
|
||||
if (otherFailed) bodyParts.push(`${otherFailed} failed`);
|
||||
const label = sourceLabel(collectionTitle);
|
||||
await createNotification(userId, {
|
||||
|
||||
@@ -778,7 +778,7 @@ async function importThingiverseThing(
|
||||
if (!accessToken) {
|
||||
throw new HttpError(
|
||||
503,
|
||||
"Thingiverse import isn't configured for this instance yet -- ask an admin to add an Access Token in Admin Settings.",
|
||||
"Thingiverse import isn't configured for this instance yet -- ask an admin to add an App Token in Admin Settings.",
|
||||
);
|
||||
}
|
||||
|
||||
@@ -794,7 +794,7 @@ async function importThingiverseThing(
|
||||
if (!resolved) {
|
||||
throw new HttpError(
|
||||
404,
|
||||
"This Thingiverse Thing could not be found, or isn't accessible with the configured Access Token.",
|
||||
"This Thingiverse Thing could not be found, or isn't accessible with the configured App Token.",
|
||||
);
|
||||
}
|
||||
const { meta, plateFiles, galleryImages } = resolved;
|
||||
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
} from "./flaresolverr";
|
||||
import { getFlaresolverrUrl } from "./settingsService";
|
||||
|
||||
// The official API needs an app Access Token (not a session cookie). It's still behind Cloudflare
|
||||
// The official API needs an App Token (not a session cookie). It's still behind Cloudflare
|
||||
// and returns a sticky 429 challenge after a few rapid requests, hence ThingiverseRateLimitError
|
||||
// and the FlareSolverr fallback.
|
||||
const THINGIVERSE_API_BASE = "https://api.thingiverse.com";
|
||||
@@ -25,7 +25,7 @@ function isRecord(value: unknown): value is Record<string, unknown> {
|
||||
export class ThingiverseAuthError extends Error {
|
||||
constructor() {
|
||||
super(
|
||||
"The Thingiverse Access Token configured for this instance was rejected. Ask an admin to " +
|
||||
"The Thingiverse App Token configured for this instance was rejected. Ask an admin to " +
|
||||
"update it in Admin Settings (a new one can be generated at thingiverse.com/apps/create).",
|
||||
);
|
||||
this.name = "ThingiverseAuthError";
|
||||
|
||||
@@ -253,7 +253,7 @@ describe("looking up authors no known author matches", () => {
|
||||
await prisma.user.update({ where: { id: userId }, data: { makerworldCookie: null } });
|
||||
});
|
||||
|
||||
it("skips Thingiverse without an access token, and says so", async () => {
|
||||
it("skips Thingiverse without an App Token, and says so", async () => {
|
||||
await setThingiverseAccessToken(null);
|
||||
const print = await unattributedPrint("lookup-tv", "thingiverse", `TvPerson${stamp}`);
|
||||
mockFetch({});
|
||||
|
||||
@@ -274,7 +274,7 @@ describe("runThingiverseLikesImportJob", () => {
|
||||
await setThingiverseAccessToken(null);
|
||||
});
|
||||
|
||||
it("fails clearly when no Access Token is configured, without touching the job's other bookkeeping", async () => {
|
||||
it("fails clearly when no App Token is configured, without touching the job's other bookkeeping", async () => {
|
||||
const job = await createJob(userId, "COLLECTION", {
|
||||
sourceUrl: "https://www.thingiverse.com/someuser/likes",
|
||||
provider: "thingiverse",
|
||||
@@ -458,7 +458,7 @@ describe("runThingiverseCollectionImportJob", () => {
|
||||
expect(finished?.sourceLabel).toBe("Thingiverse Collection 40781575");
|
||||
});
|
||||
|
||||
it("fails clearly when no Access Token is configured", async () => {
|
||||
it("fails clearly when no App Token is configured", async () => {
|
||||
const job = await createJob(userId, "COLLECTION", {
|
||||
sourceUrl: "https://www.thingiverse.com/someone/collections/1/things",
|
||||
provider: "thingiverse",
|
||||
|
||||
@@ -241,7 +241,7 @@ describe("Thingiverse likes in the Browse tab", () => {
|
||||
await setThingiverseAccessToken("rejected-token");
|
||||
const list = await request(app).get("/api/provider-collections").query({ provider: "thingiverse" }).set(auth());
|
||||
expect(list.status).toBe(400);
|
||||
expect(list.body.detail).toMatch(/Access Token .* was rejected/);
|
||||
expect(list.body.detail).toMatch(/App Token .* was rejected/);
|
||||
await setThingiverseAccessToken("test-token");
|
||||
});
|
||||
|
||||
|
||||
@@ -175,7 +175,7 @@ describe("POST /import/thingiverse-collection/entries", () => {
|
||||
expect(res.status).toBe(400);
|
||||
});
|
||||
|
||||
it("fails with a clear 503 when no Access Token is configured", async () => {
|
||||
it("fails with a clear 503 when no App Token is configured", async () => {
|
||||
const res = await request(app)
|
||||
.post("/api/import/thingiverse-collection/entries")
|
||||
.set("Authorization", `Bearer ${token}`)
|
||||
|
||||
@@ -105,7 +105,7 @@ describe("importPrintFromUrl -- Thingiverse", () => {
|
||||
await setThingiverseAccessToken(null);
|
||||
});
|
||||
|
||||
it("fails clearly when no Access Token is configured", async () => {
|
||||
it("fails clearly when no App Token is configured", async () => {
|
||||
await expect(importPrintFromUrl(userId, THING_URL, { url: THING_URL, tags: [] })).rejects.toThrow(
|
||||
/isn't configured/i,
|
||||
);
|
||||
@@ -115,7 +115,7 @@ describe("importPrintFromUrl -- Thingiverse", () => {
|
||||
await setThingiverseAccessToken(ACCESS_TOKEN);
|
||||
global.fetch = mockThingiverseFetch({ detailStatus: 401, detailBody: { error: "invalid" } });
|
||||
|
||||
await expect(importPrintFromUrl(userId, THING_URL, { url: THING_URL, tags: [] })).rejects.toThrow(/access token/i);
|
||||
await expect(importPrintFromUrl(userId, THING_URL, { url: THING_URL, tags: [] })).rejects.toThrow(/app token/i);
|
||||
});
|
||||
|
||||
it("imports a Thing's model files as plates, matches category, and attaches metadata + images", async () => {
|
||||
|
||||
@@ -114,7 +114,7 @@ describe("POST /import/thingiverse-likes/entries", () => {
|
||||
await setThingiverseAccessToken(null);
|
||||
});
|
||||
|
||||
it("fails with a clear 503 when no Access Token is configured", async () => {
|
||||
it("fails with a clear 503 when no App Token is configured", async () => {
|
||||
const res = await request(app)
|
||||
.post("/api/import/thingiverse-likes/entries")
|
||||
.set("Authorization", `Bearer ${token}`)
|
||||
|
||||
@@ -6,13 +6,13 @@ Connect them under **Configuration → Providers**: open the user menu (your ava
|
||||
|
||||

|
||||
|
||||
## Thingiverse Access Token
|
||||
## Thingiverse App Token
|
||||
|
||||
Instance-wide, admin-configured (Configuration > Providers > Thingiverse, or Administration > Providers > Thingiverse Access Token) -- one token is shared by every user's Thingiverse imports. Other users see Thingiverse as connected once an admin has set it up.
|
||||
Instance-wide, admin-configured (Configuration > Providers > Thingiverse, or Administration > Providers > Thingiverse App Token) -- one token is shared by every user's Thingiverse imports. Other users see Thingiverse as connected once an admin has set it up.
|
||||
|
||||
1. Sign in to your Thingiverse account, then go to [thingiverse.com/apps/create](https://www.thingiverse.com/apps/create).
|
||||
2. Register a new app. The name/description don't matter for this; pick whichever Application Type doesn't require a redirect URL (e.g. "Desktop" or "Mobile") -- a "Web App" asks for OAuth details you don't need here.
|
||||
3. Once created, Thingiverse shows an **Access Token** for it. This is different from your Thingiverse login password -- it's a permanent credential tied to that registered app.
|
||||
3. Once created, Thingiverse shows an **App Token** for it. This is different from your Thingiverse login password -- it's a permanent credential tied to that registered app.
|
||||
4. Copy it, right-click **Thingiverse** in Thingport's **Configuration > Providers**, choose **Connect** and paste it. Thingport verifies the token against Thingiverse before storing it, so a mistyped or revoked token is rejected immediately with a clear error instead of only failing on the next import.
|
||||
|
||||
Treat this token like a password: anyone who has it can use it to act as your Thingiverse app. If it's ever exposed, revoke it from your Thingiverse account's Apps page and generate a new one.
|
||||
@@ -43,4 +43,4 @@ Admins choose which providers this Thingport imports from, under **Administratio
|
||||
default. Turn one off and nothing new comes from it for anyone: links to it, Thingport Grab and the import queue are
|
||||
refused, its synced collections pause, and background jobs skip it. It also disappears from everyone's
|
||||
**Configuration → Providers**. Models already imported from it stay as they are, and turning it back on picks up where
|
||||
it left off. The Thingiverse Access Token is set on the same page.
|
||||
it left off. The Thingiverse App Token is set on the same page.
|
||||
@@ -6,7 +6,7 @@ first account on an instance is its admin, and there's no config file to edit af
|
||||
| Page | What it's for |
|
||||
| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Overview | [System Health](../guides/system-health.md) for everything Thingport relies on, disk space used, and the update check, which says when newer Thingport images are out. |
|
||||
| Providers | Turn MakerWorld, Printables or Thingiverse off for everyone, and set the Thingiverse Access Token. See [turning a provider off](../PROVIDER_SETUP.md#turning-a-provider-off). |
|
||||
| Providers | Turn MakerWorld, Printables or Thingiverse off for everyone, and set the Thingiverse App Token. See [turning a provider off](../PROVIDER_SETUP.md#turning-a-provider-off). |
|
||||
| Storage | The folder layout on disk, reorganizing existing files, browsing the storage folder, and the [consume folder](../guides/consume-folder.md). See [plain files on your disk](storage.md). |
|
||||
| Auth | The public URL, open or invite-only registration, [single sign-on](../guides/single-sign-on.md) providers, and how long a sign-in lasts. |
|
||||
| Rendering | How card thumbnails are made, and simplifying the previews of very detailed models. See [3D previews](3d-previews.md). |
|
||||
|
||||
@@ -36,7 +36,7 @@ from Thingport Grab wait in **Administration → Import queue** until they're st
|
||||
|
||||
## Before you start
|
||||
|
||||
Printables works with no setup. MakerWorld needs your session cookie, and Thingiverse an Access Token set by an admin.
|
||||
Printables works with no setup. MakerWorld needs your session cookie, and Thingiverse an App Token set by an admin.
|
||||
See [provider setup](../PROVIDER_SETUP.md). Admins can also [turn a provider off](../PROVIDER_SETUP.md#turning-a-provider-off)
|
||||
for the whole instance, and then nothing is imported from it.
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ Thingport imports that model into the matching Thingport collection on its own,
|
||||
extension, on the provider collection's page.
|
||||
- Connect the provider under **Configuration → Providers** where it needs it (see
|
||||
[provider setup](../PROVIDER_SETUP.md)). Printables needs nothing. MakerWorld needs your session cookie to import
|
||||
models, and to read a private collection. Thingiverse needs an access token.
|
||||
models, and to read a private collection. Thingiverse needs an App Token.
|
||||
|
||||
## Turn sync on in Thingport
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ for.
|
||||
| File storage | Required | Where model files, pictures and 3D previews are kept. Uploads, imports and downloads fail if it isn't writable or runs out of space. |
|
||||
| Memory | Required | Building 3D previews of large models takes the most. With too little, previews fail or the server restarts. |
|
||||
| FlareSolverr | Recommended | Gets past Cloudflare's checks, mostly on Thingiverse and Printables. Without it, imports and syncs from those sites are blocked whenever Cloudflare challenges the server. |
|
||||
| Thingiverse | Recommended | The instance's Thingiverse Access Token, used for every Thingiverse import, synced collection and author lookup. Not checked while Thingiverse is [turned off](../PROVIDER_SETUP.md#turning-a-provider-off). |
|
||||
| Thingiverse | Recommended | The instance's Thingiverse App Token, used for every Thingiverse import, synced collection and author lookup. Not checked while Thingiverse is [turned off](../PROVIDER_SETUP.md#turning-a-provider-off). |
|
||||
| Thingport Grab | Recommended | The [browser extension](../../extension/README.md) for importing while you browse MakerWorld, Printables and Thingiverse, whole collections included, and for bringing over Printables likes. Shown as seen once any browser uses it with this instance. |
|
||||
| AI provider | Optional | The default AI model behind [AI categorization and improved descriptions](ai.md). Everything else works without it. |
|
||||
| Email (SMTP) | Optional | Sends invitations, email confirmations and password resets. Without it, invitation links are shown to copy instead, and new accounts don't confirm their address. |
|
||||
@@ -53,7 +53,7 @@ pull the AI model on Ollama.
|
||||
- **FlareSolverr not answering**: check that its container is running and that the URL under **Administration →
|
||||
Connections → FlareSolverr** is right, port included (usually `http://flaresolverr:8191`).
|
||||
- **Thingiverse token rejected**: generate a new one at [thingiverse.com/apps/create](https://www.thingiverse.com/apps/create)
|
||||
and save it under **Administration → Providers** (see [provider setup](../PROVIDER_SETUP.md#thingiverse-access-token)).
|
||||
and save it under **Administration → Providers** (see [provider setup](../PROVIDER_SETUP.md#thingiverse-app-token)).
|
||||
- **AI provider not answering or model missing**: see [troubleshooting the AI features](ai.md#troubleshooting).
|
||||
- **Email not connecting**: check the host, port, security setting and login under **Administration → Connections →
|
||||
SMTP**.
|
||||
@@ -83,6 +83,7 @@ export const SEARCH_PAGES: SearchPage[] = [
|
||||
"makerworld",
|
||||
"printables",
|
||||
"thingiverse",
|
||||
"app token",
|
||||
"access token",
|
||||
]),
|
||||
adminPage("adminStorage", "/admin-storage", "app:adminSettings.storageSettings.heading", [
|
||||
|
||||
@@ -517,11 +517,11 @@
|
||||
"descriptions": {
|
||||
"makerworld": "Bambu Lab's model site: imports with print profiles, and collections to sync.",
|
||||
"printables": "Prusa's model site: imports, and public and private collections to sync.",
|
||||
"thingiverse": "Imports, collections and liked models, through this Thingport's Access Token."
|
||||
"thingiverse": "Imports, collections and liked models, through this Thingport's App Token."
|
||||
},
|
||||
"tokenSet": "Access Token set",
|
||||
"tokenMissing": "No Access Token: Thingiverse imports won't work until one is set",
|
||||
"tokenSettings": "Thingiverse Access Token",
|
||||
"tokenSet": "App Token set",
|
||||
"tokenMissing": "No App Token: Thingiverse imports won't work until one is set",
|
||||
"tokenSettings": "Thingiverse App Token",
|
||||
"turnOff": "Turn {{name}} off",
|
||||
"turnOn": "Turn {{name}} on",
|
||||
"disableTitle": "Turn {{name}} off?",
|
||||
@@ -624,11 +624,11 @@
|
||||
},
|
||||
"thingiverse": {
|
||||
"name": "Thingiverse",
|
||||
"description": "The instance's Thingiverse Access Token, used to import models, sync collections and liked models, and link authors from Thingiverse.",
|
||||
"description": "The instance's Thingiverse App Token, used to import models, sync collections and liked models, and link authors from Thingiverse.",
|
||||
"problems": {
|
||||
"disabled": "Turned off under Providers, so nothing is checked. Turn Thingiverse back on there to use it.",
|
||||
"not_configured": "No Access Token set. Thingiverse imports and syncs won't work until one is added in Settings (create one at thingiverse.com/apps/create).",
|
||||
"token_rejected": "Thingiverse rejected the Access Token. Generate a new one at thingiverse.com/apps/create and save it in Settings.",
|
||||
"not_configured": "No App Token set. Thingiverse imports and syncs won't work until one is added in Settings (create one at thingiverse.com/apps/create).",
|
||||
"token_rejected": "Thingiverse rejected the App Token. Generate a new one at thingiverse.com/apps/create and save it in Settings.",
|
||||
"blocked": "Thingiverse answered with a Cloudflare challenge, which says nothing about the token. Set up FlareSolverr, or wait: it usually clears after a while.",
|
||||
"unreachable": "Thingport couldn't reach Thingiverse. Check the server's internet access, or try again later.",
|
||||
"timeout": "Thingiverse didn't answer in time. Try again later."
|
||||
@@ -824,8 +824,8 @@
|
||||
"linkAuthorsDone": "Linked {{linked}} model(s) to their author.",
|
||||
"linkAuthorsNotFound": "The author couldn't be found for {{count}} creator(s) — the model may have been removed from its site, or the site couldn't be reached.",
|
||||
"linkAuthorsProblems": {
|
||||
"thingiverse_no_token": "Thingiverse models were skipped: add a Thingiverse access token in Administration > Settings.",
|
||||
"thingiverse_token_rejected": "Thingiverse models were skipped: Thingiverse rejected the access token in Administration > Settings.",
|
||||
"thingiverse_no_token": "Thingiverse models were skipped: add a Thingiverse App Token in Administration > Settings.",
|
||||
"thingiverse_token_rejected": "Thingiverse models were skipped: Thingiverse rejected the App Token in Administration > Settings.",
|
||||
"thingiverse_rate_limited": "Thingiverse models were skipped: Thingiverse started blocking requests with a rate limit. It usually clears after a while — try again later.",
|
||||
"makerworld_captcha": "MakerWorld models were skipped: MakerWorld asked for a CAPTCHA, and blocks further requests for about 2 hours. Try again later.",
|
||||
"makerworld_login_rejected": "MakerWorld models were skipped: MakerWorld rejected the saved MakerWorld login. Update it in Settings > Imports."
|
||||
@@ -842,18 +842,18 @@
|
||||
"refetchFailedCount": "{{count}} couldn't be read from their source and were left as they were."
|
||||
},
|
||||
"thingiverse": {
|
||||
"heading": "Thingiverse Access Token",
|
||||
"helpText": "Create an app at thingiverse.com/apps/create (any type, e.g. \"Desktop\") and paste the Access Token it shows you.",
|
||||
"statusConfigured": "An Access Token is currently configured.",
|
||||
"statusNotConfigured": "No Access Token is configured yet -- Thingiverse imports will fail until one is set.",
|
||||
"tokenLabel": "Access Token",
|
||||
"heading": "Thingiverse App Token",
|
||||
"helpText": "Create an app at thingiverse.com/apps/create (any type, e.g. \"Desktop\") and paste the App Token it shows you.",
|
||||
"statusConfigured": "An App Token is currently configured.",
|
||||
"statusNotConfigured": "No App Token is configured yet -- Thingiverse imports will fail until one is set.",
|
||||
"tokenLabel": "App Token",
|
||||
"tokenPlaceholder": "Paste a new token to replace the current one",
|
||||
"tokenHelperConfigured": "For security, the current token is never shown again -- leave this blank to keep it, or paste a new one to replace it.",
|
||||
"save": "Save",
|
||||
"saving": "Saving…",
|
||||
"clear": "Remove token",
|
||||
"saved": "Saved.",
|
||||
"cleared": "Access Token removed.",
|
||||
"cleared": "App Token removed.",
|
||||
"failed": "Failed to save Thingiverse settings."
|
||||
},
|
||||
"ai": {
|
||||
@@ -1528,11 +1528,11 @@
|
||||
]
|
||||
},
|
||||
"thingiverse": {
|
||||
"placeholder": "Paste the App Access Token",
|
||||
"placeholder": "Paste the App Token",
|
||||
"steps": [
|
||||
"Sign in at thingiverse.com and open thingiverse.com/apps/create.",
|
||||
"Create an app of any type, such as \"Desktop app\".",
|
||||
"Copy the App Access Token it shows and paste it below."
|
||||
"Copy the App Token it shows and paste it below."
|
||||
],
|
||||
"shared": "This token is shared by everyone on this Thingport.",
|
||||
"adminOnly": "Only an admin of this Thingport can set this up."
|
||||
|
||||
@@ -517,11 +517,11 @@
|
||||
"descriptions": {
|
||||
"makerworld": "Bambu Lab modelių svetainė: importai su spausdinimo profiliais ir kolekcijų sinchronizavimas.",
|
||||
"printables": "Prusa modelių svetainė: importai bei viešų ir privačių kolekcijų sinchronizavimas.",
|
||||
"thingiverse": "Importai, kolekcijos ir patikę modeliai, naudojant šio Thingport prieigos raktą."
|
||||
"thingiverse": "Importai, kolekcijos ir patikę modeliai, naudojant šio Thingport programėlės raktą."
|
||||
},
|
||||
"tokenSet": "Prieigos raktas nustatytas",
|
||||
"tokenMissing": "Nėra prieigos rakto: Thingiverse importai neveiks, kol jo nenustatysite",
|
||||
"tokenSettings": "Thingiverse prieigos raktas",
|
||||
"tokenSet": "Programėlės raktas nustatytas",
|
||||
"tokenMissing": "Nėra programėlės rakto: Thingiverse importai neveiks, kol jo nenustatysite",
|
||||
"tokenSettings": "Thingiverse programėlės raktas",
|
||||
"turnOff": "Išjungti {{name}}",
|
||||
"turnOn": "Įjungti {{name}}",
|
||||
"disableTitle": "Išjungti {{name}}?",
|
||||
@@ -625,11 +625,11 @@
|
||||
},
|
||||
"thingiverse": {
|
||||
"name": "Thingiverse",
|
||||
"description": "Sistemos Thingiverse prieigos raktas – modeliams importuoti, kolekcijoms ir patiktiems modeliams sinchronizuoti bei autoriams susieti.",
|
||||
"description": "Sistemos Thingiverse programėlės raktas – modeliams importuoti, kolekcijoms ir patiktiems modeliams sinchronizuoti bei autoriams susieti.",
|
||||
"problems": {
|
||||
"disabled": "Išjungta skiltyje „Tiekėjai“, todėl netikrinama. Įjunkite Thingiverse ten, kad galėtumėte naudoti.",
|
||||
"not_configured": "Prieigos raktas nenurodytas. Thingiverse importai ir sinchronizacijos neveiks, kol jo nepridėsite nustatymuose (sukurkite thingiverse.com/apps/create).",
|
||||
"token_rejected": "Thingiverse atmetė prieigos raktą. Sukurkite naują thingiverse.com/apps/create ir išsaugokite nustatymuose.",
|
||||
"not_configured": "Programėlės raktas nenurodytas. Thingiverse importai ir sinchronizacijos neveiks, kol jo nepridėsite nustatymuose (sukurkite thingiverse.com/apps/create).",
|
||||
"token_rejected": "Thingiverse atmetė programėlės raktą. Sukurkite naują thingiverse.com/apps/create ir išsaugokite nustatymuose.",
|
||||
"blocked": "Thingiverse atsakė Cloudflare patikra – tai nieko nesako apie raktą. Įdiekite FlareSolverr arba palaukite: dažniausiai praeina po kurio laiko.",
|
||||
"unreachable": "Thingport nepasiekė Thingiverse. Patikrinkite serverio interneto ryšį arba bandykite vėliau.",
|
||||
"timeout": "Thingiverse laiku neatsakė. Bandykite vėliau."
|
||||
@@ -832,8 +832,8 @@
|
||||
"linkAuthorsDone": "Su autoriumi susieta modelių: {{linked}}.",
|
||||
"linkAuthorsNotFound": "Nepavyko rasti autoriaus kūrėjams: {{count}} – modelis galėjo būti pašalintas iš svetainės arba svetainė nepasiekiama.",
|
||||
"linkAuthorsProblems": {
|
||||
"thingiverse_no_token": "Thingiverse modeliai praleisti: pridėkite Thingiverse prieigos raktą skiltyje Administravimas > Nustatymai.",
|
||||
"thingiverse_token_rejected": "Thingiverse modeliai praleisti: Thingiverse atmetė prieigos raktą, nurodytą skiltyje Administravimas > Nustatymai.",
|
||||
"thingiverse_no_token": "Thingiverse modeliai praleisti: pridėkite Thingiverse programėlės raktą skiltyje Administravimas > Nustatymai.",
|
||||
"thingiverse_token_rejected": "Thingiverse modeliai praleisti: Thingiverse atmetė programėlės raktą, nurodytą skiltyje Administravimas > Nustatymai.",
|
||||
"thingiverse_rate_limited": "Thingiverse modeliai praleisti: Thingiverse pradėjo riboti užklausas. Paprastai tai praeina po kurio laiko — bandykite vėliau.",
|
||||
"makerworld_captcha": "MakerWorld modeliai praleisti: MakerWorld paprašė CAPTCHA ir maždaug 2 valandoms blokuoja tolesnes užklausas. Bandykite vėliau.",
|
||||
"makerworld_login_rejected": "MakerWorld modeliai praleisti: MakerWorld atmetė išsaugotą MakerWorld prisijungimą. Atnaujinkite jį skiltyje Nustatymai > Importavimas."
|
||||
@@ -850,18 +850,18 @@
|
||||
"refetchFailedCount": "Nepavyko nuskaityti iš šaltinio: {{count}}; jie palikti nepakeisti."
|
||||
},
|
||||
"thingiverse": {
|
||||
"heading": "Thingiverse prieigos raktas",
|
||||
"helpText": "Sukurkite programėlę adresu thingiverse.com/apps/create (bet kokio tipo, pvz. „Desktop“) ir įklijuokite ten parodytą prieigos raktą. Tai skiriasi nuo jūsų Thingiverse prisijungimo -- tai nuolatinis raktas, susietas su registruota programėle.",
|
||||
"statusConfigured": "Šiuo metu sukonfigūruotas prieigos raktas.",
|
||||
"statusNotConfigured": "Prieigos raktas dar nesukonfigūruotas -- Thingiverse importas neveiks, kol jis nebus nustatytas.",
|
||||
"tokenLabel": "Prieigos raktas",
|
||||
"heading": "Thingiverse programėlės raktas (App Token)",
|
||||
"helpText": "Sukurkite programėlę adresu thingiverse.com/apps/create (bet kokio tipo, pvz. „Desktop“) ir įklijuokite ten parodytą programėlės raktą (App Token). Tai skiriasi nuo jūsų Thingiverse prisijungimo -- tai nuolatinis raktas, susietas su registruota programėle.",
|
||||
"statusConfigured": "Šiuo metu sukonfigūruotas programėlės raktas.",
|
||||
"statusNotConfigured": "Programėlės raktas dar nesukonfigūruotas -- Thingiverse importas neveiks, kol jis nebus nustatytas.",
|
||||
"tokenLabel": "Programėlės raktas",
|
||||
"tokenPlaceholder": "Įklijuokite naują raktą, kad pakeistumėte dabartinį",
|
||||
"tokenHelperConfigured": "Saugumo sumetimais dabartinis raktas daugiau nerodomas -- palikite tuščią, kad jį išsaugotumėte, arba įklijuokite naują, kad jį pakeistumėte.",
|
||||
"save": "Išsaugoti",
|
||||
"saving": "Saugoma…",
|
||||
"clear": "Pašalinti raktą",
|
||||
"saved": "Išsaugota.",
|
||||
"cleared": "Prieigos raktas pašalintas.",
|
||||
"cleared": "Programėlės raktas pašalintas.",
|
||||
"failed": "Nepavyko išsaugoti Thingiverse nustatymų."
|
||||
},
|
||||
"ai": {
|
||||
@@ -1583,11 +1583,11 @@
|
||||
]
|
||||
},
|
||||
"thingiverse": {
|
||||
"placeholder": "Įklijuokite App Access Token",
|
||||
"placeholder": "Įklijuokite App Token",
|
||||
"steps": [
|
||||
"Prisijunkite prie thingiverse.com ir atverkite thingiverse.com/apps/create.",
|
||||
"Sukurkite bet kokio tipo programą, pvz. „Desktop app“.",
|
||||
"Nukopijuokite rodomą App Access Token ir įklijuokite jį žemiau."
|
||||
"Nukopijuokite rodomą App Token ir įklijuokite jį žemiau."
|
||||
],
|
||||
"shared": "Šis raktas bendras visiems šio Thingport naudotojams.",
|
||||
"adminOnly": "Tai nustatyti gali tik šio Thingport administratorius."
|
||||
|
||||
@@ -46,7 +46,7 @@ const SECTIONS: FeatureSection[] = [
|
||||
"A provider that's off is off for everyone: links to it, Thingport Grab and the import queue are refused, and it's hidden from each person's provider settings.",
|
||||
"Its synced collections pause and background jobs skip it. Models already imported from it stay as they are.",
|
||||
"Turn it back on whenever you like, and syncs pick up where they left off.",
|
||||
"Set the Thingiverse Access Token that every user's Thingiverse imports share.",
|
||||
"Set the Thingiverse App Token that every user's Thingiverse imports share.",
|
||||
],
|
||||
link: { label: "Provider setup", href: url("docs/providers/#turning-a-provider-off") },
|
||||
image: providers,
|
||||
|
||||
Reference in new issue
Block a user