Merge pull request #52 from KeksPirates/feat/docs

Feat/docs
This commit is contained in:
shayaa
2026-04-06 23:15:04 +02:00
committed by GitHub
9 changed files with 715 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
/* /index.html 200
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

+238
View File
@@ -0,0 +1,238 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="main.css"/>
<title>SoftwareManager - Main</title>
<!-- <link rel="icon" type="image/x-icon" href="/assets/icons/favicon.ico"> -->
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;700&display=swap" rel="stylesheet">
</head>
<body>
<header>
<div class="logo-text">
<h1>KeksPirates</h1>
</div>
<nav class="tab">
<a class="tablinks" onclick="openTab(event, 'start')" id="defaultOpen">Home</a>
<a class="tablinks" onclick="openTab(event, 'api')">API</a>
<a class="tablinks" onclick="openTab(event, 'docs')">Docs</a>
<!-- <a class="tablinks" onclick="openTab(event, 'notfound')">404</a> -->
</nav>
</header>
<main>
<div id="start" class="tabcontent">
<div class="introduction-frame">
<div class="introduction-text inline-block">
<h1 class="hometitle"><br><span style="color: #db65d5">SoftwareManager</span></h1>
<p class="title_subtext">Simply search and download software from various sources</p>
<a href="https://github.com/KeksPirates/SoftwareManager" class="btn_big github"><img class="github-button" src="assets/icons/GitHub_Invertocat_White.png">GitHub</a>
<a href="https://github.com/KeksPirates/SoftwareManager/releases/latest" class="btn_big download"><img class="download-button" src="assets/icons/download_icon_black.png">Download</a>
</div>
<div class="introduction-image inline-block">
<div class="softwaremanager-scene">
<img class="softwaremanager-image" src="assets/softwaremanager/search_tab_rounded.png">
</div>
<img class="softwaremanager-image-2" src="assets/softwaremanager/search_tab_rounded.png">
</div>
</div>
</div>
<div id="api" class="tabcontent">
<h1 class="title"><span class="json-string">API Documentation</span> </h1>
<p>This API allows you to search for posts on rutracker.</p>
<div class="base-information-frame">
<h3>API URL</h3>
<p class="api-url">https://api.michijackson.xyz/</p>
<br>
<h3>Endpoint</h3>
<p class="endpoint-url"><span class="request-type">GET</span><span class="endpoint-type-container">/search?q=<span class="endpoint-parameter">{query}</span></span></p>
<div class="endpoint-parameters-container">
<div class="endpoint-parameters-header">
<p>Parameter</p>
<p>Type</p>
<p>Required</p>
<p>Description</p>
</div>
<div class="endpoint-parameters-content">
<p class="endpoint-parameter">q</p>
<p class="endpoint-type">String</p>
<p class="endpoint-required">True</p>
<p class="endpoint-description">Search query</p>
</div>
</div>
</div>
<div class="request-frame">
<h2>Example Request</h2>
<div class="request-type-container">
<p><span class="request-type">GET</span> <span class="request-type-subcontainer">api.michijackson.xyz/search?q=keks</span></p>
</div>
</div>
<div class="api-response-frame">
<h3>Response</h3>
<pre class="api-response"><span class="json-punctuation">{</span>
"cached"<span class="json-punctuation">:</span> <span class="json-boolean">false</span><span class="json-punctuation">,</span>
"count"<span class="json-punctuation">:</span> <span class="json-integer">1</span><span class="json-punctuation">,</span>
"data"<span class="json-punctuation">:</span> <span class="json-punctuation">[</span>
<span class="json-punctuation">{</span>
"author"<span class="json-punctuation">:</span> <span class="json-string">"Viterrson"</span><span class="json-punctuation">,</span>
"id"<span class="json-punctuation">:</span> <span class="json-integer">1</span><span class="json-punctuation">,</span>
"leechers"<span class="json-punctuation">:</span> <span class="json-integer">0</span><span class="json-punctuation">,</span>
"seeders"<span class="json-punctuation">:</span> <span class="json-integer">3</span><span class="json-punctuation">,</span>
"title"<span class="json-punctuation">:</span> <span class="json-string">"(Hard - Rock) Keks - Keks - 1983, MP3, 320 kbps"</span><span class="json-punctuation">,</span>
"url"<span class="json-punctuation">:</span> <span class="json-string">"https://rutracker.org/forum/viewtopic.php?t=3835559"</span>
<span class="json-punctuation">}</span>
<span class="json-punctuation">],</span>
"query"<span class="json-punctuation">:</span> <span class="json-string">"keks"</span><span class="json-punctuation">,</span>
"success"<span class="json-punctuation">:</span> <span class="json-boolean">true</span>
<span class="json-punctuation">}</span></pre>
</div>
</div>
<div id="docs" class="tabcontent">
<h1 class="title"><span style="color: #db65d5">Docs</span></h1>
<p>SoftwareManager is a desktop app to search, browse, and download software & games from multiple sources in one place.</p>
<div class="base-information-frame">
<h2>Features</h2>
<div class="endpoint-parameters-container docs-tips">
<p class="sources-text">• Searching & Downloading Software from various pages</p>
<p class="sources-text">• Network Interface Binding</p>
<p class="sources-text">• Simple UI, Speed Limiting etc.</p>
<p class="sources-text">• No Logins required</p>
</div>
</div>
<div class="base-information-frame">
<h2>General Information</h2>
<div class="endpoint-parameters-container docs-tips">
<p class="sources-text">• Rutracker is the default source since it is the largest index overall.</p>
<p class="sources-text">• Use m0nkrus if you want Adobe software, it directly gets the posts from his Telegram channel.</p>
<p class="sources-text">• Torrents start seeding after completion and start seeding on application start.</p>
<p class="sources-text">• MacOS Builds haven't been properly tested - We're thankful to receive feedback.</p>
<p class="sources-text">• If you want to host your own server, clone our <a href="https://github.com/KeksPirates/SoftwareManager-Server" style="color: #db65d5;">server repository</a>, enter your cookie for rutracker.org and run server.py. Detailed Instructions on how to get your rutracker cookie are in the README of the server repo.</p>
<p class="sources-text">• SoftwareManager is still in development and most likely contains issues. Please report any bugs you find via GitHub. Contributions are also greatly appreciated.</p>
</div>
</div>
<div class="base-information-frame">
<h2>Sources</h2>
<br>
<p>Use the dropdown menu in the top right to select your source.</p>
<div class="endpoint-parameters-container docs-grid">
<div class="endpoint-parameters-header">
<p>Source</p>
<p>Category</p>
<p>Notes</p>
</div>
<div class="endpoint-parameters-content">
<p class="sources-text">RuTracker</p>
<p class="sources-text">Software & games</p>
<p class="sources-text">Has an extremely large amount of Software. Relies on an API for searching.</p>
</div>
<div class="endpoint-parameters-content">
<p class="sources-text">UzTracker</p>
<p class="sources-text">Software & games</p>
<p class="sources-text">Similar to RuTracker, smaller. Use this as fallback if RuTracker is down or there's API issues.</p>
</div>
<div class="endpoint-parameters-content">
<p class="sources-text">m0nkrus</p>
<p class="sources-text">Adobe Software</p>
<p class="sources-text">Lots of curated releases. Focused on mainly professional Software.</p>
</div>
<div class="endpoint-parameters-content">
<p class="sources-text">SteamRip</p>
<p class="sources-text">Games</p>
<p class="sources-text">Currently very experimental due to download link retrieveal. May not always work as expected.</p>
</div>
</div>
</div>
</div>
<div id="notfound" class="tabcontent">
<div class="notfound-frame">
<h1 class="notfound-title">404</h1>
<br>
<h1 class="notfound-subtext">(╯°□°)╯︵ ┻━┻</h1>
<a class="btn_big download" onclick="openTab(event, 'start')" style="cursor: pointer;">Go Home</a>
</div>
</div>
</main>
<footer>
<small>KeksPirates - SoftwareManager</small>
</footer>
<script>
function openTab(evt, tabName, pushToHistory = true) {
var i, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tabcontent");
for (i = 0; i < tabcontent.length; i++) {
tabcontent[i].style.display = "none";
}
tablinks = document.getElementsByClassName("tablinks");
for (i = 0; i < tablinks.length; i++) {
tablinks[i].className = tablinks[i].className.replace(" active", "");
}
document.getElementById(tabName).style.display = "block";
let activeButton = document.querySelector(`.tablinks[onclick*="${tabName}"]`);
if (activeButton) {
activeButton.className += " active";
}
if (pushToHistory) {
let path = "/";
if (tabName === 'api') path = "/api";
if (tabName === 'docs') path = "/docs";
history.pushState({ tab: tabName }, "", path);
}
}
window.addEventListener('popstate', function(event) {
if (event.state && event.state.tab) {
openTab(null, event.state.tab, false);
} else {
openTab(null, 'start', false);
}
});
window.onload = function() {
let currentPath = window.location.pathname;
if (currentPath === '/api') {
openTab(null, 'api', false);
} else if (currentPath === '/docs') {
openTab(null, 'docs', false);
} else {
history.replaceState({ tab: 'start' }, "", "/");
openTab(null, 'start', false);
}
};
</script>
</body>
</html>
+476
View File
@@ -0,0 +1,476 @@
* { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--main-font: "Manrope", sans-serif;
}
body {
font-family: system-ui, sans-serif;
line-height: 1.5;
display: flex;
flex-direction: column;
min-height: 100vh;
background: #0f1011;
}
header {
height: 65px;
background: #1a1c1d;
color: #fff;
padding: 1rem 2rem;
display: flex;
justify-content: space-between;
align-items: center;
user-select: none;
}
.tab a {
display: inline-block;
padding: 0.4rem 0.8rem;
margin-left: 0.5rem;
text-decoration: none;
color: #fafafa;
border-radius: 8px;
box-shadow: 0 0 6px 1px #dd06cb00;
font-family: var(--main-font);
transition: background 0.5s, color 0.5s;
cursor: pointer;
}
nav a:hover {
background: #db65d517;
color: #ffd1fd;
}
nav a.active {
background: #db65d55d;
color: #fdd2fc;
}
.logo-text h1 {
font-family: var(--main-font);
font-size: 1.2rem;
font-weight: 700;
letter-spacing: -0.02em;
background-image: linear-gradient(147deg, #da84d5, #db65d5);
background-clip: text;
-webkit-background-clip: text;
color: transparent;
}
main {
font-family: var(--main-font);
color: #fafafa;
padding: 3rem;
}
main h1.hometitle {
font-size: 4.0rem;
line-height: 4rem;
margin-top: 1.8rem;
}
main p.title_subtext {
margin-top: 0.5rem;
font-size: 1.2rem;
}
.softwaremanager-scene {
perspective: 700px;
width: fit-content;
}
main img.softwaremanager-image {
margin-top: 0rem;
user-select: none;
transform: rotateX(8deg) rotateY(-12deg) rotateZ(2deg) scale(0.85) translateX(-1rem);
box-shadow: 15px 20px 15px #0f0f0f;
/* transition: transform 0.4s ease-out; */
}
/* main img.softwaremanager-image:hover {
transform: rotateX(8deg) rotateY(-13deg) rotateZ(2deg) scale(0.86) translateX(-1rem);
} */
/* transform: rotateX(8443deg) rotateY(-14234233deg) rotateZ(2deg) scale(4.863) translateX(-133rem); lmao */
main .introduction-text {
position: relative;
text-align: right;
margin-right: -3rem;
margin-top: 3rem;
z-index: 2;
user-select: none;
}
.introduction-image {
position: relative;
z-index: 1;
}
.inline-block {
display: inline-block;
vertical-align: top;
}
main .introduction-frame {
text-align: center;
position: relative;
font-size: 0
}
main .introduction-frame > * {
font-size: 1rem;
}
main .btn_big {
font-family: var(--main-font);
background: #1a1c1d;
padding: 0.7rem 1.4rem;
margin-top: 1.5rem;
border: none;
border-radius: 10px;
align-items: center;
display: inline-flex;
color: #fafafa;
text-decoration: none;
font-weight: bold;
user-select: none;
}
main .btn_big img {
height: 20px;
width: auto;
margin-right: 0.5rem;
}
main .btn_big.github {
margin-right: 1rem;
transition: background 0.5s;
}
main .btn_big.github:hover {
background: #18191a;
}
main .btn_big.download {
background: #ca62c5;
color: #0f1011;
transition: background 0.5s;
}
main .btn_big.download:hover {
background: #b551b0;
}
main .introduction-text h1,
main .introduction-text p {
user-select: text;
}
.softwaremanager-image-2 {
display: none;
}
footer {
color: #585858;
font-family: var(--main-font);
align-self: center;
padding: 1rem;
position: fixed;
bottom: 0;
user-select: none;
}
::selection {
background: #db65d528;
}
.base-information-frame {
background: #1a1c1d;
padding: 1rem;
border-radius: 10px;
margin-top: 1rem;
}
.program-preview {
box-sizing: inherit;
background: #1a1c1d;
width: auto;
height: 20rem;
border-radius: 10px;
}
pre.api-response {
font-family: monospace;
background: #151718;
padding: 1rem;
border-radius: 10px;
margin-top: 1rem;
}
.api-response-frame {
background: #1a1c1d;
padding: 1rem;
border-radius: 10px;
margin-top: 1rem;
}
.request-type {
color: #fdd2fc;
padding: 1px 6px;
background: #db65d55d;
border-radius: 6px;
}
.request-type-container {
background: #1a1c1d;
padding: 1rem;
border-radius: 10px;
margin-top: 1rem;
}
.endpoint-type-container {
background: #151718;
padding: 1rem;
border-radius: 10px;
margin-top: 1rem;
}
.request-type-subcontainer {
background: #1a1c1d;
padding: 0.5rem;
border-radius: 10px;
margin-top: 1rem;
}
.api-url {
background: #151718;
padding: 1rem;
border-radius: 10px;
margin-top: 1rem;
}
.endpoint-url {
background: #151718;
padding: 1rem;
border-radius: 10px;
margin-top: 1rem;
color: #8f8d8d
}
.endpoint-parameters-container {
background: #151718;
padding: 1rem;
border-radius: 10px;
margin-top: 1rem;
color: #8f8d8d;
}
.endpoint-parameters-header {
margin-top: -0.3rem;
margin-bottom: 0.9rem;
font-size: 0.9rem;
grid-template-columns: 9rem 9rem 9rem 9rem;
display: grid;
}
.endpoint-parameters-content {
font-size: 1rem;
grid-template-columns: 9rem 9rem 9rem 9rem;
display: grid;
}
.request-frame {
margin-top: 1rem;
}
.endpoint-parameter { color: #ffab4a; }
.endpoint-type { color: #db65d5 }
.endpoint-required { color: #66ff80}
.endpoint-description { color: #b1b0b0 }
.json-punctuation { color: #5c5c5c; }
.json-string { color: #db65d5; }
.json-boolean { color: #ffab4a; }
.json-integer { color: #66ff80; }
.sources-text {
color: #ffffff;
font-size: 1rem;
}
.docs-grid .endpoint-parameters-header,
.docs-grid .endpoint-parameters-content {
grid-template-columns: 10rem 14rem 1fr;
}
.docs-grid .endpoint-parameters-header p {
color: #8f8d8d;
}
.docs-grid .endpoint-parameters-content {
padding: 0.5rem 0;
border-top: 1px solid #ffffff0a;
}
.docs-grid .endpoint-parameters-content:first-of-type {
border-top: none;
}
.docs-tips .sources-text {
padding: 0.25rem 0;
}
.base-information-frame h2 {
color: #db65d5;
}
.notfound-frame {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
min-height: 75vh;
text-align: center;
gap: 10px;
}
.notfound-title {
font-size: 4.0rem;
line-height: 4rem;
margin-top: 1.8rem;
background-image: linear-gradient(135deg, #c574c1, #b851b2);
background-clip: text;
-webkit-background-clip: text;
color: transparent;
}
.notfound-subtext {
font-size: 2rem;
}
@media(max-width: 560px) {
header {
padding: 1rem;
}
main {
margin: 0rem;
padding: 1rem;
}
main .introduction {
display: block;
margin-top: -1rem;
padding: 1rem;
}
main .introduction-text {
position: relative;
text-align: center;
margin-top: 0rem;
z-index: 2;
user-select: none;
margin-right: 0rem;
padding-bottom: 2rem;
}
main h1.hometitle {
font-size: 2rem;
line-height: 2.2rem;
text-align: left;
}
main p.title_subtext {
text-align: left;
}
.introduction-image {
display: none;
}
main .btn_big {
display: block;
margin: 1rem auto;
}
main .btn_big.github{
margin-right: 0rem;
}
}
@media (min-width: 561px) and (max-width: 1393px) {
header {
padding: 1rem;
}
main {
margin: 0rem;
padding: 1rem;
}
main .introduction {
display: flex;
margin-top: -1rem;
padding: 1rem;
flex-direction: column;
align-items: center;
}
main .introduction-text {
position: relative;
text-align: center;
margin-top: 0rem;
z-index: 2;
user-select: none;
margin-left: 2rem;
margin-right: 2rem;
padding-bottom: 2rem;
}
main h1.hometitle {
font-size: 2rem;
line-height: 2.2rem;
text-align: center;
}
main p.title_subtext {
text-align: center;
}
.softwaremanager-image {
display: none;
}
.softwaremanager-image-2 {
display: block;
width: 100%;
height: auto;
margin-left: auto;
margin-right: auto;
}
.introduction-image {
width: 100%;
max-width: 50rem;
user-select: none;
}
main .introduction .inline-block {
display: block;
}
}