From 53b8a91843d2c3c71f999ee67bfce1dda0d6a60b Mon Sep 17 00:00:00 2001 From: Meghdad Date: Tue, 10 Feb 2026 19:36:11 +0330 Subject: [PATCH] Initial assets --- autoindex.css | 192 ++++++++++++++++++++++++++++++++++++++++++++++++++ autoindex.js | 141 ++++++++++++++++++++++++++++++++++++ favicon.ico | Bin 0 -> 51478 bytes favicon.png | Bin 0 -> 1840 bytes nais.conf | 41 +++++++++++ 5 files changed, 374 insertions(+) create mode 100644 autoindex.css create mode 100644 autoindex.js create mode 100644 favicon.ico create mode 100644 favicon.png create mode 100644 nais.conf diff --git a/autoindex.css b/autoindex.css new file mode 100644 index 0000000..c008eee --- /dev/null +++ b/autoindex.css @@ -0,0 +1,192 @@ +/* ========================= + Nginx AutoIndex Theme + ========================= */ + +:root { + --bg: #0f111a; + --bg-soft: #151926; + --row-hover: #1f2440; + --text: #e6e6eb; + --muted: #8b93a7; + --accent: #7aa2f7; + --folder: #9ece6a; + --parent: #f7768e; + --border: #2a2f4a; +} + +* { + box-sizing: border-box; +} + +html, body { + margin: 0; + padding: 0; + background: linear-gradient(135deg, #0f111a, #121626); + color: var(--text); + font-family: system-ui, -apple-system, BlinkMacSystemFont, + "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", + Arial, sans-serif; + font-size: 14px; +} + +/* Title */ +h1 { + margin: 0; + padding: 18px 24px; + font-size: 18px; + font-weight: 600; + background: var(--bg-soft); + border-bottom: 1px solid var(--border); +} + +/* Listing container */ +pre { + margin: 0; + padding: 12px 0 24px; + white-space: pre; + overflow-x: auto; + line-height: 1.6; +} + +/* Make links feel like rows */ +pre a { + display: inline-block; + padding: 8px 24px 8px 44px; + position: relative; + + color: var(--accent); + text-decoration: none; + + transition: background 0.15s ease, color 0.15s ease; +} + +/* Hover & focus = full-row highlight */ +pre a:hover, +pre a:focus-visible { + background: var(--row-hover); + color: #ffffff; + outline: none; +} + +/* Parent directory */ +pre a[href="../"] { + color: var(--parent); + font-weight: 600; +} + +/* Folders */ +pre a[href$="/"] { + color: var(--folder); + font-weight: 600; +} + +/* === Icons (pure CSS, no emoji) === */ +pre a::before { + content: ""; + position: absolute; + left: 20px; + top: 50%; + width: 10px; + height: 10px; + transform: translateY(-50%); + border-radius: 2px; + background: var(--accent); + opacity: 0.85; +} + +/* Folder icon */ +pre a[href$="/"]::before { + background: var(--folder); +} + +/* Parent directory icon */ +pre a[href="../"]::before { + background: var(--parent); +} + +/* Footer note */ +pre::after { + content: "— nginx autoindex —"; + display: block; + margin: 24px 24px 0; + color: var(--muted); + font-size: 12px; +} + +/* Scrollbar (WebKit only, safe) */ +pre::-webkit-scrollbar { + height: 8px; +} + +pre::-webkit-scrollbar-thumb { + background: var(--border); + border-radius: 4px; +} + +/* Mobile improvements */ +@media (max-width: 600px) { + h1 { + font-size: 16px; + padding: 14px 16px; + } + + pre a { + padding: 10px 16px 10px 40px; + font-size: 13px; + } + + pre a::before { + left: 16px; + } +} + +/* ===== Header actions ===== */ + +h1 { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; +} + +/* Button container */ +.autoindex-actions { + display: flex; + gap: 8px; +} + +/* Buttons */ +.ai-btn { + appearance: none; + border: 1px solid var(--border); + background: transparent; + color: var(--text); + font-size: 12px; + padding: 6px 10px; + border-radius: 6px; + cursor: pointer; + text-decoration: none; + line-height: 1; + + transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease; +} + +/* Hover */ +.ai-btn:hover { + background: var(--row-hover); + border-color: var(--accent); + color: #fff; +} + +/* Active */ +.ai-btn:active { + transform: translateY(1px); +} + +/* Mobile */ +@media (max-width: 600px) { + .ai-btn { + padding: 6px 8px; + font-size: 11px; + } +} diff --git a/autoindex.js b/autoindex.js new file mode 100644 index 0000000..b708f23 --- /dev/null +++ b/autoindex.js @@ -0,0 +1,141 @@ + +/** + * Check if a URL points to a file by extension + */ +function isFileLink(url) { + const fileExtensions = [ + 'pdf','zip','rar','7z', + 'mp3','mp4','mkv','avi', + 'jpg','jpeg','png','gif','webp', + 'doc','docx','xls','xlsx','ppt','pptx', + 'csv','txt','json' + ]; + + const cleanUrl = url.split('?')[0].toLowerCase(); + return fileExtensions.some(ext => cleanUrl.endsWith('.' + ext)); +} + +/** + * Get all file links from the page + */ +function getFileLinks() { + const links = document.querySelectorAll('a'); + const result = []; + + links.forEach(a => { + if (!a.href) return; + if (!isFileLink(a.href)) return; + + result.push({ + text: a.innerText.trim(), + href: a.href + }); + }); + + return result; +} + +/** + * Converts a string to kebab-case. + */ +function toKebabCase(str) { + return str + .toLowerCase() + .trim() + .replace(/['’]/g, '') + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-+|-+$/g, ''); +} + +/** + * Extracts the last directory or file name from the current page URL + */ +function getDirectoryName() { + const url = new URL(window.location.href); + const lastPart = url.pathname + .split('/') + .filter(Boolean) + .pop() || 'file-links'; + + return decodeURIComponent(lastPart); +} + +/** + * Download file links as Playlist + */ +function downloadPlaylist() { + const files = getFileLinks(); + let content = 'DAUMPLAYLIST\n'; + + files.forEach((item, index) => { + const text = item.text.replace(/"/g, '""'); + const href = item.href.replace(/"/g, '""'); + content += `${index+1}*file*${href}\n`; + }); + + const blob = new Blob([content], { type: 'application/octet-stream;charset=utf-8;' }); + const url = URL.createObjectURL(blob); + + const a = document.createElement('a'); + a.href = url; + a.download = toKebabCase(getDirectoryName()) + '.dpl'; + a.style.display = 'none'; + + document.body.appendChild(a); + a.click(); + + document.body.removeChild(a); + URL.revokeObjectURL(url); +} + +/** + * Copy file links (one per line) + */ +function copyAllLinks() { + const files = getFileLinks(); + const textToCopy = files.map(f => f.href).join('\n'); + + // Modern browsers + if (navigator.clipboard && window.isSecureContext) { + navigator.clipboard.writeText(textToCopy); + return; + } + + // Fallback (older browsers, some mobiles) + const textarea = document.createElement('textarea'); + textarea.value = textToCopy; + textarea.style.position = 'fixed'; + textarea.style.opacity = '0'; + + document.body.appendChild(textarea); + textarea.focus(); + textarea.select(); + + document.execCommand('copy'); + document.body.removeChild(textarea); +} + +(function () { + const header = document.querySelector('h1'); + if (!header) return; + + // Wrapper for buttons + const actions = document.createElement('div'); + actions.className = 'autoindex-actions'; + + // Playlist button + const plb = document.createElement('button'); + plb.className = 'ai-btn'; + plb.textContent = 'Download Playlist'; + plb.onclick = downloadPlaylist; + + // Copy Links button + const clb = document.createElement('button'); + clb.className = 'ai-btn'; + clb.textContent = 'Copy Links'; + clb.onclick = copyAllLinks; + + actions.appendChild(clb); + actions.appendChild(plb); + header.appendChild(actions); +})(); diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4f60535231ead90586ba91428ff11a921f8fe99e GIT binary patch literal 51478 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 e?b0sLnEVTTXVvaI%Il8+0000>; + + # SSL certificates + ssl_certificate <>/fullchain.pem; + ssl_certificate_key <>/privkey.pem; + + # Default root + root <>; + + # Autoindex for the main folder + location / { + autoindex on; + autoindex_exact_size off; # optional: show human-readable sizes + autoindex_localtime on; # optional: show local time + + # Add custom CSS & JS to autoindex pages + sub_filter '' ''; + sub_filter '' ''; + sub_filter_once on; + } + + # Serve the assets from a separate folder + location = /autoindex.css { + root <>; + } + location = /autoindex.js { + root <>; + } + location = /favicon.ico { + root <>; + } +} +server { + listen 80; + server_name <>; + + return 301 https://<>$request_uri; +} +