···49495050# API Keys
5151# Weasyl API Key for accessing their API
5252-WEASYL_API_KEY=your_weasyl_api_key_here5252+WEASYL_API_KEY=your_weasyl_api_key_here
5353+# SoFurry Access Token for accessing their API
5454+SOFURRY_ACCESS_TOKEN=your_sofurry_access_token_here
···1818 }
19192020 // Call SoFurry API to get submission details
2121- const apiUrl = `https://api2.sofurry.com/std/getSubmissionDetails?id=${submissionId}&format=json`;
2121+ const apiUrl = `https://api.sofurry.com/v1/submission/${submissionId}`;
2222+ const headers = {
2323+ "Authorization": `Bearer ${config.soFurryAccessToken}`,
2424+ "Content-Type": "application/json",
2525+ "Accept": "application/json"
2626+ };
2227 const response = await axios.get(apiUrl);
23282429 if (!response.data) {
···2631 }
27322833 // Get the content URL (full-sized image)
2929- const sourceImageUrl = response.data.contentSourceUrl;
3434+ const sourceImageUrl = response.data.displayUrl;
3035 if (!sourceImageUrl) {
3131- throw new Error('No content URL found in SoFurry API response');
3636+ throw new Error('No display URL found in SoFurry API response');
3237 }
33383439 // Check if this is a video
···7277 }
73787479 extractSubmissionId(url) {
7575- // Extract submission ID from various SoFurry URL formats
7676- // Example: https://www.sofurry.com/view/1234567 or https://sofurry.com/art/1234567
7777- const idMatches = url.match(/(?:view|art|submission)\/(\d+)/i);
8080+ // Extract submission ID from SoFurry URL format
8181+ // Format: https://sofurry.com/s/{SubmissionID}
8282+ const idMatches = url.match(/\/s\/(\d+)/i);
78837984 // If we found a match, return the first capture group (the ID)
8085 return idMatches ? idMatches[1] : null;