This commit is contained in:
ItzzExcel
2025-02-16 00:03:39 -06:00
parent 07f3714563
commit c62e960fc8
12 changed files with 329 additions and 366 deletions
+12 -2
View File
@@ -1,3 +1,4 @@
### Node ###
# Logs # Logs
logs logs
*.log *.log
@@ -89,7 +90,6 @@ out
# Nuxt.js build / generate output # Nuxt.js build / generate output
.nuxt .nuxt
dist
# Gatsby files # Gatsby files
.cache/ .cache/
@@ -102,7 +102,6 @@ dist
# vuepress v2.x temp and cache directory # vuepress v2.x temp and cache directory
.temp .temp
.cache
# Docusaurus cache and generated files # Docusaurus cache and generated files
.docusaurus .docusaurus
@@ -128,3 +127,14 @@ dist
.yarn/build-state.yml .yarn/build-state.yml
.yarn/install-state.gz .yarn/install-state.gz
.pnp.* .pnp.*
### Node Patch ###
# Serverless Webpack directories
.webpack/
# Optional stylelint cache
# SvelteKit build / generate output
.svelte-kit
# End of https://www.toptal.com/developers/gitignore/api/node
+21
View File
@@ -0,0 +1,21 @@
# Excel's Neptune Projects
This repository a repository containing my Neptune (TIDAL Modded Client) projects.
## Index:
- [Copy Lyrics](#copy-lyrics)
- [ShadowX Theme](#spicetifys-shadowx-port-full-black-theme)
### Copy Lyrics
A plugin that allows the user copy the lyrics only selecting it.
```
https://raw.githubusercontent.com/ItzzExcel/neptune-projects/refs/heads/main/plugins/plugins/copy-lyrics/dist/
```
<hr>
### Spicetify's ShadowX Port (Full-black theme)
```
https://raw.githubusercontent.com/ItzzExcel/neptune-projects/refs/heads/main/themes/black-neptune-theme.css
```
<hr>
-142
View File
@@ -1,142 +0,0 @@
### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
### Node Patch ###
# Serverless Webpack directories
.webpack/
# Optional stylelint cache
# SvelteKit build / generate output
.svelte-kit
# End of https://www.toptal.com/developers/gitignore/api/node
dist/
+7 -8
View File
@@ -3,7 +3,7 @@ const fs = require("fs");
const path = require("path"); const path = require("path");
const crypto = require("crypto"); const crypto = require("crypto");
const nativeExternals = ["@neptune", "@plugin", "electron"] const nativeExternals = ["@plugin", "electron", "@neptune-types", "@neptune"];
const plugins = fs.readdirSync("./plugins"); const plugins = fs.readdirSync("./plugins");
for (const plugin of plugins) { for (const plugin of plugins) {
@@ -20,6 +20,7 @@ for (const plugin of plugins) {
entryPoints: [ entryPoints: [
"./" + path.join(pluginPath, pluginManifest.main ?? "index.js"), "./" + path.join(pluginPath, pluginManifest.main ?? "index.js"),
], ],
logLevel: "debug",
plugins: [ plugins: [
{ {
name: "neptuneNativeImports", name: "neptuneNativeImports",
@@ -59,8 +60,7 @@ for (const plugin of plugins) {
)});${builtExports )});${builtExports
.map( .map(
(e) => (e) =>
`export ${ `export ${e == "default" ? "default " : `const ${e} =`
e == "default" ? "default " : `const ${e} =`
} NeptuneNative.getNativeValue(contextId,${JSON.stringify( } NeptuneNative.getNativeValue(contextId,${JSON.stringify(
e e
)})` )})`
@@ -77,14 +77,12 @@ for (const plugin of plugins) {
bundle: true, bundle: true,
minify: true, minify: true,
format: "esm", format: "esm",
external: [ external: nativeExternals,
"@neptune",
"@plugin",
],
platform: "browser", platform: "browser",
outfile, outfile,
metafile: true, // Add this line to generate a metafile
}) })
.then(() => { .then((result) => {
fs.createReadStream(outfile) fs.createReadStream(outfile)
// It being md5 does not matter, this is for caching and not security // It being md5 does not matter, this is for caching and not security
.pipe(crypto.createHash("md5").setEncoding("hex")) .pipe(crypto.createHash("md5").setEncoding("hex"))
@@ -96,6 +94,7 @@ for (const plugin of plugins) {
description: pluginManifest.description, description: pluginManifest.description,
author: pluginManifest.author, author: pluginManifest.author,
hash: this.read(), hash: this.read(),
metafile: result.metafile, // Add this line to include the metafile in the manifest
}) })
); );
+22 -86
View File
@@ -6,18 +6,17 @@
"": { "": {
"name": "neptune-plugin-template", "name": "neptune-plugin-template",
"dependencies": { "dependencies": {
"react-hot-toast": "^2.5.1" "canvas-confetti": "^1.9.3",
"neptune-types": "^1.0.1"
}, },
"devDependencies": { "devDependencies": {
"esbuild": "^0.18.13", "esbuild": "^0.18.13"
"neptune-types": "^1.0.0"
} }
}, },
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
"version": "7.26.7", "version": "7.26.9",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz",
"integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==", "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"regenerator-runtime": "^0.14.0" "regenerator-runtime": "^0.14.0"
@@ -400,11 +399,15 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/csstype": { "node_modules/canvas-confetti": {
"version": "3.1.3", "version": "1.9.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "resolved": "https://registry.npmjs.org/canvas-confetti/-/canvas-confetti-1.9.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "integrity": "sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g==",
"license": "MIT" "license": "ISC",
"funding": {
"type": "donate",
"url": "https://www.paypal.me/kirilvatev"
}
}, },
"node_modules/esbuild": { "node_modules/esbuild": {
"version": "0.18.20", "version": "0.18.20",
@@ -444,41 +447,28 @@
"@esbuild/win32-x64": "0.18.20" "@esbuild/win32-x64": "0.18.20"
} }
}, },
"node_modules/goober": {
"version": "2.1.16",
"resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz",
"integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==",
"license": "MIT",
"peerDependencies": {
"csstype": "^3.0.10"
}
},
"node_modules/htm": { "node_modules/htm": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz", "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz",
"integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==", "integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==",
"dev": true,
"license": "Apache-2.0" "license": "Apache-2.0"
}, },
"node_modules/idb-keyval": { "node_modules/idb-keyval": {
"version": "6.2.1", "version": "6.2.1",
"resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz",
"integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==", "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==",
"dev": true,
"license": "Apache-2.0" "license": "Apache-2.0"
}, },
"node_modules/immutable": { "node_modules/immutable": {
"version": "5.0.0-beta.4", "version": "5.0.0-beta.4",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.0-beta.4.tgz", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.0-beta.4.tgz",
"integrity": "sha512-sl9RE3lqd2LoQSESc8VV0k8qE9y57iT7dinq3Q+8mR2dqReHDZlgUrudzmFfZhDXBLXlNJMVWv3SG1YpQIokig==", "integrity": "sha512-sl9RE3lqd2LoQSESc8VV0k8qE9y57iT7dinq3Q+8mR2dqReHDZlgUrudzmFfZhDXBLXlNJMVWv3SG1YpQIokig==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/neptune-types": { "node_modules/neptune-types": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/neptune-types/-/neptune-types-1.0.1.tgz", "resolved": "https://registry.npmjs.org/neptune-types/-/neptune-types-1.0.1.tgz",
"integrity": "sha512-XDkESq/jNTH9La//peJQirzJTwJySxkc4pCjHz1RtgcmoFbYIZ72JR0mkFYNsCZ0oyI7gLgaApd405VzU1gqOw==", "integrity": "sha512-XDkESq/jNTH9La//peJQirzJTwJySxkc4pCjHz1RtgcmoFbYIZ72JR0mkFYNsCZ0oyI7gLgaApd405VzU1gqOw==",
"dev": true,
"license": "MS-PL", "license": "MS-PL",
"dependencies": { "dependencies": {
"idb-keyval": "^6.2.1", "idb-keyval": "^6.2.1",
@@ -493,54 +483,12 @@
"node_modules/oby": { "node_modules/oby": {
"version": "14.3.5", "version": "14.3.5",
"resolved": "https://registry.npmjs.org/oby/-/oby-14.3.5.tgz", "resolved": "https://registry.npmjs.org/oby/-/oby-14.3.5.tgz",
"integrity": "sha512-0RgL6n1qmxdkUgvXFnmG/J+Lv8HWjwnWmULtu/omMxRUV9KhD/8x3sL7DmanUvEOi5wX4xTbef1sKe5NzqGm7g==", "integrity": "sha512-0RgL6n1qmxdkUgvXFnmG/J+Lv8HWjwnWmULtu/omMxRUV9KhD/8x3sL7DmanUvEOi5wX4xTbef1sKe5NzqGm7g=="
"dev": true
},
"node_modules/react": {
"version": "19.0.0",
"resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz",
"integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react-dom": {
"version": "19.0.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz",
"integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"scheduler": "^0.25.0"
},
"peerDependencies": {
"react": "^19.0.0"
}
},
"node_modules/react-hot-toast": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.5.1.tgz",
"integrity": "sha512-54Gq1ZD1JbmAb4psp9bvFHjS7lje+8ubboUmvKZkCsQBLH6AOpZ9JemfRvIdHcfb9AZXRaFLrb3qUobGYDJhFQ==",
"license": "MIT",
"dependencies": {
"csstype": "^3.1.3",
"goober": "^2.1.16"
},
"engines": {
"node": ">=10"
},
"peerDependencies": {
"react": ">=16",
"react-dom": ">=16"
}
}, },
"node_modules/redux": { "node_modules/redux": {
"version": "4.2.1", "version": "4.2.1",
"resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
"integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.9.2" "@babel/runtime": "^7.9.2"
@@ -550,28 +498,18 @@
"version": "0.14.1", "version": "0.14.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/scheduler": {
"version": "0.25.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
"integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
"license": "MIT",
"peer": true
},
"node_modules/spitroast": { "node_modules/spitroast": {
"version": "1.4.4", "version": "1.4.4",
"resolved": "https://registry.npmjs.org/spitroast/-/spitroast-1.4.4.tgz", "resolved": "https://registry.npmjs.org/spitroast/-/spitroast-1.4.4.tgz",
"integrity": "sha512-S69rzIFjbGoEW5YCLpm1kEdqMEYqC09lmE1ZMY4gyUXfke0wi9qZjKYa0DDSv5eIy/D+/UGJT8yxgJddU3oqlA==", "integrity": "sha512-S69rzIFjbGoEW5YCLpm1kEdqMEYqC09lmE1ZMY4gyUXfke0wi9qZjKYa0DDSv5eIy/D+/UGJT8yxgJddU3oqlA==",
"dev": true,
"license": "CC0-1.0" "license": "CC0-1.0"
}, },
"node_modules/type-fest": { "node_modules/type-fest": {
"version": "4.34.0", "version": "4.34.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.34.0.tgz", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.34.1.tgz",
"integrity": "sha512-Qcg88ZJsJvRcUijtD6supagRSDf0y1FPZh4NroJpwRkoPYj6gGNidREwTgDuC0Pmq0PVAAzL8C8BZW7xhx5Q4A==", "integrity": "sha512-6kSc32kT0rbwxD6QL1CYe8IqdzN/J/ILMrNK+HMQCKH3insCDRY/3ITb0vcBss0a3t72fzh2YSzj8ko1HgwT3g==",
"dev": true,
"license": "(MIT OR CC0-1.0)", "license": "(MIT OR CC0-1.0)",
"engines": { "engines": {
"node": ">=16" "node": ">=16"
@@ -584,17 +522,15 @@
"version": "0.54.0", "version": "0.54.0",
"resolved": "https://registry.npmjs.org/voby/-/voby-0.54.0.tgz", "resolved": "https://registry.npmjs.org/voby/-/voby-0.54.0.tgz",
"integrity": "sha512-hH8LXcP0QR4J6nnzfSWGD13onq7hqdc/ya1r1Bb+TxibtECYKZRO1m4HdSU4RcE7MdAaQwR5pwgd+hqXCqk2OA==", "integrity": "sha512-hH8LXcP0QR4J6nnzfSWGD13onq7hqdc/ya1r1Bb+TxibtECYKZRO1m4HdSU4RcE7MdAaQwR5pwgd+hqXCqk2OA==",
"dev": true,
"dependencies": { "dependencies": {
"htm": "^3.1.1", "htm": "^3.1.1",
"oby": "^14.3.0" "oby": "^14.3.0"
} }
}, },
"node_modules/zod": { "node_modules/zod": {
"version": "3.24.1", "version": "3.24.2",
"resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz",
"integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"funding": { "funding": {
"url": "https://github.com/sponsors/colinhacks" "url": "https://github.com/sponsors/colinhacks"
+3 -3
View File
@@ -6,10 +6,10 @@
"build": "node ./build.js" "build": "node ./build.js"
}, },
"devDependencies": { "devDependencies": {
"esbuild": "^0.18.13", "esbuild": "^0.18.13"
"neptune-types": "^1.0.0"
}, },
"dependencies": { "dependencies": {
"react-hot-toast": "^2.5.1" "canvas-confetti": "^1.9.3",
"neptune-types": "^1.0.1"
} }
} }
+14
View File
@@ -0,0 +1,14 @@
var p=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var v=(t,e)=>()=>(t&&(e=t(t=0)),e);var T=(t,e)=>{for(var n in e)p(t,n,{get:e[n],enumerable:!0})},R=(t,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of S(e))!b.call(t,r)&&r!==n&&p(t,r,{get:()=>e[r],enumerable:!(a=w(e,r))||a.enumerable});return t};var L=t=>R(p({},"__esModule",{value:!0}),t);var E={};T(E,{Tracer:()=>u,libTrace:()=>N});import{actions as f}from"@neptune";var u,N,y=v(()=>{"use strict";u=t=>{let e=o=>{let c=(...i)=>{o(t,...i)};return c.withContext=i=>(...m)=>{o(t,i,...m)},c},n=e(console.log),a=e(console.warn),r=e(console.error),g=e(console.debug),s=(o,c,i)=>{let m=l=>{o(l),c({message:`${t} - ${l}`,category:"OTHER",severity:i})};return m.withContext=l=>{let C=o.withContext(l);return d=>{C(d),d instanceof Error&&(d=d.message),c({message:`${t}.${l} - ${d}`,category:"OTHER",severity:i})}},m};return{log:n,warn:a,err:r,debug:g,msg:{log:s(n,f.message.messageInfo,"INFO"),warn:s(a,f.message.messageWarn,"WARN"),err:s(r,f.message.messageError,"ERROR")}}},N=u("[lib]")});y();y();var h=u("[Copy Lyrics]"),A=`
[class^="lyricsText"]>div>span {
user-select: text;
cursor: text;
}
::selection {
background:rgb(0, 0, 0);
color:rgb(255, 255, 255);
}
`;function O(t){let e=document.createElement("style");e.type="text/css",e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t)),document.head.appendChild(e)}function $(t){let e=document.createElement("textarea");e.value=t,e.style.position="fixed",document.body.appendChild(e),e.select();try{if(!document.execCommand("copy"))throw new Error("Failed to copy text.")}catch(n){h.msg.err(n)}finally{document.body.removeChild(e)}}O(A);var x=!1;document.addEventListener("mousedown",function(){x=!0});document.addEventListener("mouseup",function(t){if(x){let e=window.getSelection();if(e.toString().length>0){let n=[],g=e.getRangeAt(0).commonAncestorContainer.getElementsByTagName("span");for(let o of g)e.containsNode(o,!0)&&n.push(o);let s="";n.forEach(o=>{s+=o.textContent+`
`,[...o.classList].some(c=>c.startsWith("endOfStanza--"))&&(s+=`
`)}),s=s.trim(),$(s),h.msg.log("Copied to clipboard!"),window.getSelection&&e.removeAllRanges()}x=!1}});function F(){styleElement&&styleElement.parentNode&&styleElement.parentNode.removeChild(styleElement),document.removeEventListener("mousedown",onMouseDown),document.removeEventListener("mouseup",onMouseUp)}export{F as onUnload};
+1
View File
@@ -0,0 +1 @@
{"name":"Copy Lyrics","description":"A working neptune plugin that allows the user to copy the lyrics of a song selecting it.","author":"itzzexcel@github","hash":"aeef96d8ab14451ebe3f42446de81230","metafile":{"inputs":{"plugins/copy-lyrics/src/tracer.js":{"bytes":1596,"imports":[{"path":"@neptune","kind":"import-statement","external":true}],"format":"esm"},"plugins/copy-lyrics/src/index.js":{"bytes":2930,"imports":[{"path":"plugins/copy-lyrics/src/tracer.js","kind":"import-statement","original":"./tracer"},{"path":"plugins/copy-lyrics/src/tracer.js","kind":"require-call","original":"./tracer"}],"format":"esm"}},"outputs":{"plugins/copy-lyrics/dist/index.js":{"imports":[{"path":"@neptune","kind":"import-statement","external":true}],"exports":["onUnload"],"entryPoint":"plugins/copy-lyrics/src/index.js","inputs":{"plugins/copy-lyrics/src/tracer.js":{"bytesInOutput":693},"plugins/copy-lyrics/src/index.js":{"bytesInOutput":1362}},"bytes":2525}}}}
+2 -1
View File
@@ -1,5 +1,6 @@
{ {
"dependencies": { "dependencies": {
"canvas-confetti": "^1.6.0" "canvas-confetti": "^1.6.0",
"neptune-types": "1.0.1"
} }
} }
+48 -20
View File
@@ -1,15 +1,24 @@
/* /*
* TODO: Check for the span to be part of the lyrics div. TODO: Check for the span to be part of the lyrics div.
*
*/ */
import toast, { Toaster } from 'react-hot-toast'; require("./tracer")
import { Tracer } from "./tracer";
const trace = Tracer("[Copy Lyrics]");
const unlockSelection = ` const unlockSelection = `
[class^="lyricsText"]>div>span { [class^="lyricsText"]>div>span {
user-select: text; user-select: text;
cursor: text; cursor: text;
}`;
}
::selection {
background:rgb(0, 0, 0);
color:rgb(255, 255, 255);
}
`;
function ApplyCSS(style) { function ApplyCSS(style) {
const styleElement = document.createElement('style'); const styleElement = document.createElement('style');
@@ -21,7 +30,7 @@ function ApplyCSS(style) {
document.head.appendChild(styleElement); document.head.appendChild(styleElement);
} }
function SetClipboar(text) { function SetClipboard(text) {
const textarea = document.createElement('textarea'); const textarea = document.createElement('textarea');
textarea.value = text; textarea.value = text;
textarea.style.position = 'fixed'; // Avoid scrolling to the bottom textarea.style.position = 'fixed'; // Avoid scrolling to the bottom
@@ -30,15 +39,11 @@ function SetClipboar(text) {
try { try {
const success = document.execCommand('copy'); const success = document.execCommand('copy');
if (success) { if (!success)
console.log('Text copied to clipboard:', text);
toast.success('Copied to clipboard!');
} else {
throw new Error('Failed to copy text.'); throw new Error('Failed to copy text.');
}
} catch (err) { } catch (err) {
console.error('Failed to copy text:', err); trace.msg.err(err);
toast.error('Failed to copy to clipboard!');
} finally { } finally {
document.body.removeChild(textarea); document.body.removeChild(textarea);
} }
@@ -52,24 +57,47 @@ document.addEventListener('mousedown', function() {
isSelecting = true; isSelecting = true;
}); });
document.addEventListener('mouseup', function() { document.addEventListener('mouseup', function (event) {
if (isSelecting) { if (isSelecting) {
const selection = window.getSelection(); const selection = window.getSelection();
if (selection.toString().length > 0) { if (selection.toString().length > 0) {
let text = selection.toString(); const selectedSpans = [];
SetClipboar(text); const ranges = selection.getRangeAt(0);
toast.success("Copied to clipboard!"); const container = ranges.commonAncestorContainer;
// Get all spans within the selection
const spans = container.getElementsByTagName('span');
for (let span of spans) {
if (selection.containsNode(span, true)) {
selectedSpans.push(span);
}
}
// Concatenate text from selected spans
let text = '';
selectedSpans.forEach(span => {
text += span.textContent + '\n';
if ([...span.classList].some(className => className.startsWith('endOfStanza--'))) {
text += '\n';
}
});
text = text.trim();
SetClipboard(text);
trace.msg.log("Copied to clipboard!");
if (window.getSelection) { if (window.getSelection) {
const selection = window.getSelection();
selection.removeAllRanges(); selection.removeAllRanges();
} }
} else {
} }
isSelecting = false; isSelecting = false;
} }
}); });
export function onUnload() { export function onUnload() {
console.log("Goodbye world!"); if (styleElement && styleElement.parentNode) {
styleElement.parentNode.removeChild(styleElement);
}
document.removeEventListener('mousedown', onMouseDown);
document.removeEventListener('mouseup', onMouseUp);
} }
+55
View File
@@ -0,0 +1,55 @@
// Based on https://github.com/Inrixia/neptune-plugins/blob/3d28c9ea3252782da830698032dbb49dbe5b9fd6/plugins/_lib/trace.ts
// Credits to inrixia
import { actions } from "@neptune";
export const Tracer = (source) => {
const createLogger = (logger) => {
const _logger = (...data) => {
logger(source, ...data);
return undefined;
};
_logger.withContext = (context) => (...data) => {
logger(source, context, ...data);
return undefined;
};
return _logger;
};
const log = createLogger(console.log);
const warn = createLogger(console.warn);
const err = createLogger(console.error);
const debug = createLogger(console.debug);
const createMessager = (logger, messager, severity) => {
const _messager = (message) => {
logger(message);
messager({ message: `${source} - ${message}`, category: "OTHER", severity });
return undefined;
};
_messager.withContext = (context) => {
const loggerWithContext = logger.withContext(context);
return (message) => {
loggerWithContext(message);
if (message instanceof Error) message = message.message;
messager({ message: `${source}.${context} - ${message}`, category: "OTHER", severity });
return undefined;
};
};
return _messager;
};
return {
log,
warn,
err,
debug,
msg: {
log: createMessager(log, actions.message.messageInfo, "INFO"),
warn: createMessager(warn, actions.message.messageWarn, "WARN"),
err: createMessager(err, actions.message.messageError, "ERROR"),
},
};
};
export const libTrace = Tracer("[lib]");
+54 -14
View File
@@ -6,8 +6,6 @@
} }
*/ */
::-webkit-scrollbar { ::-webkit-scrollbar {
display: none; display: none;
} }
@@ -24,6 +22,15 @@
--wave-color-solid-accent-dark: gray; --wave-color-solid-accent-dark: gray;
} }
[class^="followingButton"],
[title="Unfollow"],
[title="Follow"],
[title="Unfollow"]>span,
[title="Follow"]>span {
background-color: var(--wave-color-solid-rainbow-yellow-fill) !important;
color: var(--wave-color-solid-base-brighter);
}
[class^="_wave-badge-color-max"] { [class^="_wave-badge-color-max"] {
color: black !important; color: black !important;
background-color: var(--wave-color-solid-accent-fill); background-color: var(--wave-color-solid-accent-fill);
@@ -61,13 +68,13 @@
} }
[class^="ReactVirtualized__Grid"] { [class^="ReactVirtualized__Grid"] {
border: 1px solid rgb(25, 25, 25);
border-radius: 10px; border-radius: 10px;
margin: 5px; margin: 5px;
} }
[class^="ReactVirtualized__Grid__innerScrollContainer"] { [class^="ReactVirtualized__Grid__innerScrollContainer"] {
border: 1px solid rgba(0, 0, 0, 0); border: none;
margin: 5px;
} }
[class^="button"]>span { [class^="button"]>span {
@@ -90,7 +97,17 @@
display: none !important; display: none !important;
} }
[class^="headerButtons"]>button { [data-test="current-media-imagery"] {
border: 0 !important;
margin: none;
}
[class^="imageBorder"] {
display: none;
}
[class^="headerButtons"]>button,
[data-test="toggle-picture-in-picture"] {
background-color: var(--wave-color-solid-accent-fill) !important; background-color: var(--wave-color-solid-accent-fill) !important;
color: black; color: black;
} }
@@ -109,8 +126,8 @@
border: 0px none; border: 0px none;
} }
[class^="feedSidebarVStack"] { [data-test="feed-sidebar"] {
background-color: #1a1a1a; margin-top: 10px;
} }
[class^="player"] { [class^="player"] {
@@ -141,7 +158,11 @@
} }
[class^="actionList"] { [class^="actionList"] {
background-color: #1a1a1a; background-color: transparent;
border: 1px solid var(--wave-color-opacity-contrast-fill-ultra-thin) !important;
margin: 5px;
border-radius: 5px;
padding: 10px;
} }
button[data-test="request-fullscreen"], button[data-test="request-fullscreen"],
@@ -174,10 +195,14 @@ button[data-test="close-now-playing"]:hover {
opacity: 1; opacity: 1;
} }
[class^="contextMenu"]>div, [data-test="main-layout-header"], [data-test="feed-sidebar"], [data-test="stream-metadata"] { [class^="contextMenu"]>div,
background-color: rgba(0, 0, 0, 0.5); [data-test="main-layout-header"],
backdrop-filter: blur(15px); [data-test="feed-sidebar"],
border: 1px solid var(--wave-color-opacity-contrast-fill-ultra-thin); [data-test="stream-metadata"],
[class^="player"] {
background-color: rgba(0, 0, 0, 0.8) !important;
backdrop-filter: blur(10px);
border: 1px solid var(--wave-color-opacity-contrast-fill-ultra-thin) !important;
} }
[data-wave-color=textUrl] { [data-wave-color=textUrl] {
@@ -188,12 +213,16 @@ button[data-test="close-now-playing"]:hover {
margin-top: 7.5px; margin-top: 7.5px;
} }
[data-test="play-all"]>div>*, [data-test="shuffle-all"]>div>*, [data-test="play-all"], [data-test="shuffle-all"] { [data-test="play-all"]>div>*,
[data-test="shuffle-all"]>div>*,
[data-test="play-all"],
[data-test="shuffle-all"] {
color: var(--wave-color-solid-accent-fill) !important; color: var(--wave-color-solid-accent-fill) !important;
background-color: transparent !important; background-color: transparent !important;
} }
[class^="__NEPTUNE_PAGE"], [data-test="main"] { [class^="__NEPTUNE_PAGE"],
[data-test="main"] {
margin-top: 35px; margin-top: 35px;
} }
@@ -207,3 +236,14 @@ button[data-test="close-now-playing"]:hover {
background-color: lightgray !important; background-color: lightgray !important;
transition: none !important; transition: none !important;
} }
#playQueueSidebar {
top: 50px !important;
border: 1px solid var(--wave-color-opacity-contrast-fill-ultra-thin);
margin: 2px;
margin-right: -5px !important;
}
[class^="bottomGradient"] {
visibility: hidden;
}