Add Activepieces integration for workflow automation

- Add Activepieces fork with SmoothSchedule custom piece
- Create integrations app with Activepieces service layer
- Add embed token endpoint for iframe integration
- Create Automations page with embedded workflow builder
- Add sidebar visibility fix for embed mode
- Add list inactive customers endpoint to Public API
- Include SmoothSchedule triggers: event created/updated/cancelled
- Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,18 @@
{
"extends": ["../../../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {}
},
{
"files": ["*.ts", "*.tsx"],
"rules": {}
},
{
"files": ["*.js", "*.jsx"],
"rules": {}
}
]
}

View File

@@ -0,0 +1,7 @@
# pieces-spotify
This library was generated with [Nx](https://nx.dev).
## Running lint
Run `nx lint pieces-spotify` to execute the lint via [ESLint](https://eslint.org/).

View File

@@ -0,0 +1,4 @@
{
"name": "@activepieces/piece-spotify",
"version": "0.3.14"
}

View File

@@ -0,0 +1,51 @@
{
"name": "pieces-spotify",
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/pieces/community/spotify/src",
"projectType": "library",
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": [
"{options.outputPath}"
],
"options": {
"outputPath": "dist/packages/pieces/community/spotify",
"tsConfig": "packages/pieces/community/spotify/tsconfig.lib.json",
"packageJson": "packages/pieces/community/spotify/package.json",
"main": "packages/pieces/community/spotify/src/index.ts",
"assets": [
"packages/pieces/community/spotify/*.md",
{
"input": "packages/pieces/community/spotify/src/i18n",
"output": "./src/i18n",
"glob": "**/!(i18n.json)"
}
],
"buildableProjectDepsInPackageJsonType": "dependencies",
"updateBuildableProjectDepsInPackageJson": true
},
"dependsOn": [
"^build",
"prebuild"
]
},
"lint": {
"executor": "@nx/eslint:lint",
"outputs": [
"{options.outputFile}"
]
},
"prebuild": {
"executor": "nx:run-commands",
"options": {
"cwd": "packages/pieces/community/spotify",
"command": "bun install --no-save --silent"
},
"dependsOn": [
"^build"
]
}
},
"tags": []
}

View File

@@ -0,0 +1,81 @@
{
"Spotify": "Spotify",
"Music for everyone": "Music for everyone",
"\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n": "\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n",
"Search": "Search",
"Get Playback State": "Get Playback State",
"Play / Resume": "Play / Resume",
"Pause": "Pause",
"Set Volume": "Set Volume",
"Get Playlists": "Get Playlists",
"Get Playlist Info": "Get Playlist Info",
"Get Playlist Items": "Get Playlist Items",
"Get Saved Tracks": "Get Saved Tracks",
"Create Playlist": "Create Playlist",
"Update Playlist": "Update Playlist",
"Add items to playlist": "Add items to playlist",
"Remove items from playlist": "Remove items from playlist",
"Reorder playlist": "Reorder playlist",
"Custom API Call": "Custom API Call",
"Searches for tracks, artists, albums, etc.": "Searches for tracks, artists, albums, etc.",
"Retrieves the current playback state of the player": "Retrieves the current playback state of the player",
"Resumes or starts playback": "Resumes or starts playback",
"Pauses the playback": "Pauses the playback",
"Sets the volume of the player": "Sets the volume of the player",
"Retrieves the list of playlists that you created or followed": "Retrieves the list of playlists that you created or followed",
"Retrieves details of a playlist": "Retrieves details of a playlist",
"Retrieves the list of items in the playlist": "Retrieves the list of items in the playlist",
"Retrieves the list of saved tracks for the current user": "Retrieves the list of saved tracks for the current user",
"Creates a new playlist for the current user": "Creates a new playlist for the current user",
"Updates details of the playlist": "Updates details of the playlist",
"Adds tracks or episodes to the playlist": "Adds tracks or episodes to the playlist",
"Removes tracks or episodes from the playlist": "Removes tracks or episodes from the playlist",
"Reorders items in the playlist": "Reorders items in the playlist",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Search Text": "Search Text",
"Object Types": "Object Types",
"Limit": "Limit",
"Offset": "Offset",
"Device": "Device",
"Context URI": "Context URI",
"Tracks": "Tracks",
"Position": "Position",
"Volume": "Volume",
"All": "All",
"Playlist": "Playlist",
"Name": "Name",
"Description": "Description",
"Public": "Public",
"Collaborative": "Collaborative",
"Items": "Items",
"From Position": "From Position",
"To Position": "To Position",
"Amount of Items": "Amount of Items",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"The word or phrase you are searching for": "The word or phrase you are searching for",
"Spotify URI of the context to play (album, artist, playlist)": "Spotify URI of the context to play (album, artist, playlist)",
"List of spotify track uris to play": "List of spotify track uris to play",
"Position in milliseconds": "Position in milliseconds",
"Volume from 0 to 100": "Volume from 0 to 100",
"Fetches all playlists in a single request": "Fetches all playlists in a single request",
"Fetches all items in a single request": "Fetches all items in a single request",
"URI's of the items to add": "URI's of the items to add",
"URI's of the items to remove": "URI's of the items to remove",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Albums": "Albums",
"Artists": "Artists",
"Playlists": "Playlists",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"Playlist Items Changed": "Playlist Items Changed",
"Triggers when the items of a playlist change": "Triggers when the items of a playlist change"
}

View File

@@ -0,0 +1,82 @@
{
"Music for everyone": "Musik für alle",
"\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n": "\nUm eine Client-ID und ein Client-Geheimnis für Spotify zu erhalten, folgen Sie diesen einfachen Schritten:\n\n1. Gehe zur [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Anmelden** in Ihrem Spotify-Konto.\n3. Klicken Sie auf den **\"Erstelle eine App\"** Knopf.\n4. Füllen Sie die erforderlichen Informationen wie den **App Name** und die **App Description** aus.\n5. Sobald Ihre App erstellt wurde, werden Sie die **Client-ID** und **Client-Geheimnis** auf dem Dashboard der App sehen.\n6. **Kopieren** die Client-ID und das Client-Geheimnis und **einfügen** sie unten.\n",
"Search": "Suche",
"Get Playback State": "Wiedergabe-Status erhalten",
"Play / Resume": "Wiedergabe / Fortsetzen",
"Pause": "Pause",
"Set Volume": "Lautstärke festlegen",
"Get Playlists": "Playlists abrufen",
"Get Playlist Info": "Playlist-Info erhalten",
"Get Playlist Items": "Playlist-Elemente abrufen",
"Get Saved Tracks": "Gespeicherte Tracks holen",
"Create Playlist": "Playlist erstellen",
"Update Playlist": "Playlist aktualisieren",
"Add items to playlist": "Elemente zur Wiedergabeliste hinzufügen",
"Remove items from playlist": "Elemente aus Wiedergabeliste entfernen",
"Reorder playlist": "Wiedergabeliste umsortieren",
"Custom API Call": "Eigener API-Aufruf",
"Searches for tracks, artists, albums, etc.": "Sucht nach Tracks, Künstlern, Alben usw.",
"Retrieves the current playback state of the player": "Ruft den aktuellen Wiedergabestatus des Spielers ab",
"Resumes or starts playback": "Fortsetzen oder Wiedergabe startet",
"Pauses the playback": "Pausiert die Wiedergabe",
"Sets the volume of the player": "Legt die Lautstärke des Players fest",
"Retrieves the list of playlists that you created or followed": "Ruft die Liste der Wiedergabelisten ab, denen du folgst oder erstellt hast",
"Retrieves details of a playlist": "Ruft Details einer Wiedergabeliste ab",
"Retrieves the list of items in the playlist": "Ruft die Liste der Elemente in der Wiedergabeliste ab",
"Retrieves the list of saved tracks for the current user": "Ruft die Liste der gespeicherten Tracks für den aktuellen Benutzer ab",
"Creates a new playlist for the current user": "Erstellt eine neue Playlist für den aktuellen Benutzer",
"Updates details of the playlist": "Aktualisierungsdetails der Wiedergabeliste",
"Adds tracks or episodes to the playlist": "Fügt Titel oder Episoden der Wiedergabeliste hinzu",
"Removes tracks or episodes from the playlist": "Entfernt Titel oder Episoden aus der Wiedergabeliste",
"Reorders items in the playlist": "Elemente in der Wiedergabeliste neu ordnen",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
"Search Text": "Suchtext",
"Object Types": "Objekttypen",
"Limit": "Limit",
"Offset": "Versatz",
"Device": "Gerät",
"Context URI": "Context URI",
"Tracks": "Tracks",
"Position": "Position",
"Volume": "Lautstärke",
"All": "Alle",
"Playlist": "Wiedergabeliste",
"Name": "Name",
"Description": "Beschreibung",
"Public": "Öffentlich",
"Collaborative": "Kollaborativ",
"Items": "Items",
"From Position": "Absenderposition",
"To Position": "Zu Position",
"Amount of Items": "Artikelanzahl",
"Method": "Methode",
"Headers": "Kopfzeilen",
"Query Parameters": "Abfrageparameter",
"Body": "Körper",
"Response is Binary ?": "Antwort ist binär?",
"No Error on Failure": "Kein Fehler bei Fehler",
"Timeout (in seconds)": "Timeout (in Sekunden)",
"The word or phrase you are searching for": "Das Wort oder die Phrase nach der Sie suchen",
"Spotify URI of the context to play (album, artist, playlist)": "Spotify-URI des abzuspielenden Kontexts (Album, Interpret, Wiedergabeliste)",
"List of spotify track uris to play": "Liste der abzuspielenden Spotify-Trackuris",
"Position in milliseconds": "Position in Millisekunden",
"Volume from 0 to 100": "Lautstärke von 0 bis 100",
"Fetches all playlists in a single request": "Ruft alle Wiedergabelisten in einer einzigen Anfrage ab",
"Fetches all items in a single request": "Ruft alle Elemente in einer einzigen Anfrage ab",
"URI's of the items to add": "URI's der hinzuzufügenden Elemente",
"URI's of the items to remove": "URI's der zu entfernenden Elemente",
"Authorization headers are injected automatically from your connection.": "Autorisierungs-Header werden automatisch von Ihrer Verbindung injiziert.",
"Enable for files like PDFs, images, etc..": "Aktivieren für Dateien wie PDFs, Bilder, etc..",
"Albums": "Alben",
"Artists": "Künstler",
"Playlists": "Wiedergabelisten",
"GET": "ERHALTEN",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "LÖSCHEN",
"HEAD": "HEAD",
"Playlist Items Changed": "Playlist-Items geändert",
"Triggers when the items of a playlist change": "Wird ausgelöst, wenn die Elemente einer Wiedergabeliste geändert werden"
}

View File

@@ -0,0 +1,82 @@
{
"Music for everyone": "Música para todos",
"\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n": "\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n",
"Search": "Buscar",
"Get Playback State": "Obtener estado de reproducción",
"Play / Resume": "Reproducir / Reiniciar",
"Pause": "Pausa",
"Set Volume": "Asignar volumen",
"Get Playlists": "Obtener listas",
"Get Playlist Info": "Obtener información de lista de reproducción",
"Get Playlist Items": "Obtener elementos de lista de reproducción",
"Get Saved Tracks": "Obtener pistas guardadas",
"Create Playlist": "Crear lista de reproducción",
"Update Playlist": "Actualizar playlist",
"Add items to playlist": "Añadir elementos a la lista",
"Remove items from playlist": "Eliminar elementos de la lista",
"Reorder playlist": "Reordenar lista",
"Custom API Call": "Llamada API personalizada",
"Searches for tracks, artists, albums, etc.": "Búsqueda de pistas, artistas, álbumes, etc.",
"Retrieves the current playback state of the player": "Recuperar el estado actual de reproducción del jugador",
"Resumes or starts playback": "Reanuda o inicia la reproducción",
"Pauses the playback": "Pausa la reproducción",
"Sets the volume of the player": "Establece el volumen del reproductor",
"Retrieves the list of playlists that you created or followed": "Recuperar la lista de listas de reproducción que has creado o seguido",
"Retrieves details of a playlist": "Recuperar detalles de una lista de reproducción",
"Retrieves the list of items in the playlist": "Recuperar la lista de elementos en la lista",
"Retrieves the list of saved tracks for the current user": "Recuperar la lista de pistas guardadas para el usuario actual",
"Creates a new playlist for the current user": "Crea una nueva lista de reproducción para el usuario actual",
"Updates details of the playlist": "Detalles de actualización de la lista de reproducción",
"Adds tracks or episodes to the playlist": "Añade pistas o episodios a la lista de reproducción",
"Removes tracks or episodes from the playlist": "Elimina pistas o episodios de la lista de reproducción",
"Reorders items in the playlist": "Reordenar elementos en la lista de reproducción",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
"Search Text": "Buscar texto",
"Object Types": "Tipos de objeto",
"Limit": "Límite",
"Offset": "Desplazamiento",
"Device": "Dispositivo",
"Context URI": "Context URI",
"Tracks": "Pistas",
"Position": "Posición",
"Volume": "Volumen",
"All": "Todos",
"Playlist": "Lista",
"Name": "Nombre",
"Description": "Descripción",
"Public": "Público",
"Collaborative": "Colaborativo",
"Items": "Elementos",
"From Position": "Desde posición",
"To Position": "A posición",
"Amount of Items": "Cantidad de artículos",
"Method": "Método",
"Headers": "Encabezados",
"Query Parameters": "Parámetros de consulta",
"Body": "Cuerpo",
"Response is Binary ?": "¿Respuesta es binaria?",
"No Error on Failure": "No hay ningún error en fallo",
"Timeout (in seconds)": "Tiempo de espera (en segundos)",
"The word or phrase you are searching for": "La palabra o frase que estás buscando",
"Spotify URI of the context to play (album, artist, playlist)": "URI de Spotify del contexto a reproducir (álbum, artista, lista de reproducción)",
"List of spotify track uris to play": "Lista de uris de la pista spotify a reproducir",
"Position in milliseconds": "Posición en milisegundos",
"Volume from 0 to 100": "Volumen de 0 a 100",
"Fetches all playlists in a single request": "Obtiene todas las listas de reproducción en una sola solicitud",
"Fetches all items in a single request": "Obtiene todos los elementos en una sola solicitud",
"URI's of the items to add": "URI de los elementos a añadir",
"URI's of the items to remove": "URI de los elementos a eliminar",
"Authorization headers are injected automatically from your connection.": "Las cabeceras de autorización se inyectan automáticamente desde tu conexión.",
"Enable for files like PDFs, images, etc..": "Activar para archivos como PDFs, imágenes, etc.",
"Albums": "Albumes",
"Artists": "Artistas",
"Playlists": "Listas",
"GET": "RECOGER",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "BORRAR",
"HEAD": "LIMPIO",
"Playlist Items Changed": "Elementos de la lista de reproducción modificados",
"Triggers when the items of a playlist change": "Dispara cuando los elementos de una lista de reproducción cambian"
}

View File

@@ -0,0 +1,82 @@
{
"Music for everyone": "Musique pour tout le monde",
"\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n": "\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n",
"Search": "Rechercher",
"Get Playback State": "Obtenir l'état de lecture",
"Play / Resume": "Jouer / Reprendre",
"Pause": "Mettre en pause",
"Set Volume": "Régler le volume",
"Get Playlists": "Obtenir des listes de lecture",
"Get Playlist Info": "Obtenir les infos de la playlist",
"Get Playlist Items": "Obtenir des éléments de la playlist",
"Get Saved Tracks": "Obtenir les pistes enregistrées",
"Create Playlist": "Créer une playlist",
"Update Playlist": "Mettre à jour la playlist",
"Add items to playlist": "Ajouter des éléments à la playlist",
"Remove items from playlist": "Supprimer les éléments de la playlist",
"Reorder playlist": "Réorganiser la playlist",
"Custom API Call": "Appel d'API personnalisé",
"Searches for tracks, artists, albums, etc.": "Recherche des pistes, artistes, albums, etc.",
"Retrieves the current playback state of the player": "Récupère l'état de lecture actuel du lecteur",
"Resumes or starts playback": "Reprend ou démarre la lecture",
"Pauses the playback": "Met en pause la lecture",
"Sets the volume of the player": "Définit le volume du lecteur",
"Retrieves the list of playlists that you created or followed": "Récupère la liste des playlists que vous avez créées ou suivies",
"Retrieves details of a playlist": "Récupère les détails d'une playlist",
"Retrieves the list of items in the playlist": "Récupère la liste des éléments de la playlist",
"Retrieves the list of saved tracks for the current user": "Récupère la liste des pistes enregistrées pour l'utilisateur actuel",
"Creates a new playlist for the current user": "Crée une nouvelle playlist pour l'utilisateur actuel",
"Updates details of the playlist": "Met à jour les détails de la playlist",
"Adds tracks or episodes to the playlist": "Ajoute des pistes ou des épisodes à la playlist",
"Removes tracks or episodes from the playlist": "Supprime les morceaux ou épisodes de la playlist",
"Reorders items in the playlist": "Réordonne les éléments de la playlist",
"Make a custom API call to a specific endpoint": "Passer un appel API personnalisé à un endpoint spécifique",
"Search Text": "Rechercher dans le texte",
"Object Types": "Types d'objet",
"Limit": "Limite",
"Offset": "Décalage",
"Device": "Appareil",
"Context URI": "Context URI",
"Tracks": "Pistes",
"Position": "Position",
"Volume": "Volume",
"All": "Tous",
"Playlist": "Liste de lecture",
"Name": "Nom",
"Description": "Libellé",
"Public": "Publique",
"Collaborative": "Collaboratif",
"Items": "Éléments",
"From Position": "À partir de la position",
"To Position": "Vers la position",
"Amount of Items": "Quantité d'articles",
"Method": "Méthode",
"Headers": "En-têtes",
"Query Parameters": "Paramètres de requête",
"Body": "Corps",
"Response is Binary ?": "La réponse est Binaire ?",
"No Error on Failure": "Aucune erreur en cas d'échec",
"Timeout (in seconds)": "Délai d'expiration (en secondes)",
"The word or phrase you are searching for": "Le mot ou la phrase que vous recherchez",
"Spotify URI of the context to play (album, artist, playlist)": "URI Spotify du contexte à jouer (album, artiste, playlist)",
"List of spotify track uris to play": "Liste des url de la piste spotify à jouer",
"Position in milliseconds": "Position en millisecondes",
"Volume from 0 to 100": "Volume de 0 à 100",
"Fetches all playlists in a single request": "Récupère toutes les playlists en une seule requête",
"Fetches all items in a single request": "Récupère tous les éléments en une seule requête",
"URI's of the items to add": "URI des éléments à ajouter",
"URI's of the items to remove": "URI des éléments à supprimer",
"Authorization headers are injected automatically from your connection.": "Les en-têtes d'autorisation sont injectés automatiquement à partir de votre connexion.",
"Enable for files like PDFs, images, etc..": "Activer pour les fichiers comme les PDFs, les images, etc.",
"Albums": "Albums",
"Artists": "Artistes",
"Playlists": "Listes de lecture",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"Playlist Items Changed": "Éléments de la playlist modifiés",
"Triggers when the items of a playlist change": "Déclenche quand les éléments d'une playlist changent"
}

View File

@@ -0,0 +1,81 @@
{
"Spotify": "Spotify",
"Music for everyone": "Music for everyone",
"\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n": "\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n",
"Search": "Search",
"Get Playback State": "Get Playback State",
"Play / Resume": "Play / Resume",
"Pause": "Pause",
"Set Volume": "Set Volume",
"Get Playlists": "Get Playlists",
"Get Playlist Info": "Get Playlist Info",
"Get Playlist Items": "Get Playlist Items",
"Get Saved Tracks": "Get Saved Tracks",
"Create Playlist": "Create Playlist",
"Update Playlist": "Update Playlist",
"Add items to playlist": "Add items to playlist",
"Remove items from playlist": "Remove items from playlist",
"Reorder playlist": "Reorder playlist",
"Custom API Call": "Custom API Call",
"Searches for tracks, artists, albums, etc.": "Searches for tracks, artists, albums, etc.",
"Retrieves the current playback state of the player": "Retrieves the current playback state of the player",
"Resumes or starts playback": "Resumes or starts playback",
"Pauses the playback": "Pauses the playback",
"Sets the volume of the player": "Sets the volume of the player",
"Retrieves the list of playlists that you created or followed": "Retrieves the list of playlists that you created or followed",
"Retrieves details of a playlist": "Retrieves details of a playlist",
"Retrieves the list of items in the playlist": "Retrieves the list of items in the playlist",
"Retrieves the list of saved tracks for the current user": "Retrieves the list of saved tracks for the current user",
"Creates a new playlist for the current user": "Creates a new playlist for the current user",
"Updates details of the playlist": "Updates details of the playlist",
"Adds tracks or episodes to the playlist": "Adds tracks or episodes to the playlist",
"Removes tracks or episodes from the playlist": "Removes tracks or episodes from the playlist",
"Reorders items in the playlist": "Reorders items in the playlist",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Search Text": "Search Text",
"Object Types": "Object Types",
"Limit": "Limit",
"Offset": "Offset",
"Device": "Device",
"Context URI": "Context URI",
"Tracks": "Tracks",
"Position": "Position",
"Volume": "Volume",
"All": "All",
"Playlist": "Playlist",
"Name": "Name",
"Description": "Description",
"Public": "Public",
"Collaborative": "Collaborative",
"Items": "Items",
"From Position": "From Position",
"To Position": "To Position",
"Amount of Items": "Amount of Items",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"The word or phrase you are searching for": "The word or phrase you are searching for",
"Spotify URI of the context to play (album, artist, playlist)": "Spotify URI of the context to play (album, artist, playlist)",
"List of spotify track uris to play": "List of spotify track uris to play",
"Position in milliseconds": "Position in milliseconds",
"Volume from 0 to 100": "Volume from 0 to 100",
"Fetches all playlists in a single request": "Fetches all playlists in a single request",
"Fetches all items in a single request": "Fetches all items in a single request",
"URI's of the items to add": "URI's of the items to add",
"URI's of the items to remove": "URI's of the items to remove",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Albums": "Albums",
"Artists": "Artists",
"Playlists": "Playlists",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"Playlist Items Changed": "Playlist Items Changed",
"Triggers when the items of a playlist change": "Triggers when the items of a playlist change"
}

View File

@@ -0,0 +1,81 @@
{
"Spotify": "Spotify",
"Music for everyone": "Music for everyone",
"\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n": "\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n",
"Search": "Search",
"Get Playback State": "Get Playback State",
"Play / Resume": "Play / Resume",
"Pause": "Pause",
"Set Volume": "Set Volume",
"Get Playlists": "Get Playlists",
"Get Playlist Info": "Get Playlist Info",
"Get Playlist Items": "Get Playlist Items",
"Get Saved Tracks": "Get Saved Tracks",
"Create Playlist": "Create Playlist",
"Update Playlist": "Update Playlist",
"Add items to playlist": "Add items to playlist",
"Remove items from playlist": "Remove items from playlist",
"Reorder playlist": "Reorder playlist",
"Custom API Call": "Custom API Call",
"Searches for tracks, artists, albums, etc.": "Searches for tracks, artists, albums, etc.",
"Retrieves the current playback state of the player": "Retrieves the current playback state of the player",
"Resumes or starts playback": "Resumes or starts playback",
"Pauses the playback": "Pauses the playback",
"Sets the volume of the player": "Sets the volume of the player",
"Retrieves the list of playlists that you created or followed": "Retrieves the list of playlists that you created or followed",
"Retrieves details of a playlist": "Retrieves details of a playlist",
"Retrieves the list of items in the playlist": "Retrieves the list of items in the playlist",
"Retrieves the list of saved tracks for the current user": "Retrieves the list of saved tracks for the current user",
"Creates a new playlist for the current user": "Creates a new playlist for the current user",
"Updates details of the playlist": "Updates details of the playlist",
"Adds tracks or episodes to the playlist": "Adds tracks or episodes to the playlist",
"Removes tracks or episodes from the playlist": "Removes tracks or episodes from the playlist",
"Reorders items in the playlist": "Reorders items in the playlist",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Search Text": "Search Text",
"Object Types": "Object Types",
"Limit": "Limit",
"Offset": "Offset",
"Device": "Device",
"Context URI": "Context URI",
"Tracks": "Tracks",
"Position": "Position",
"Volume": "Volume",
"All": "Semua",
"Playlist": "Playlist",
"Name": "Name",
"Description": "Description",
"Public": "Public",
"Collaborative": "Collaborative",
"Items": "Items",
"From Position": "From Position",
"To Position": "To Position",
"Amount of Items": "Amount of Items",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"The word or phrase you are searching for": "The word or phrase you are searching for",
"Spotify URI of the context to play (album, artist, playlist)": "Spotify URI of the context to play (album, artist, playlist)",
"List of spotify track uris to play": "List of spotify track uris to play",
"Position in milliseconds": "Position in milliseconds",
"Volume from 0 to 100": "Volume from 0 to 100",
"Fetches all playlists in a single request": "Fetches all playlists in a single request",
"Fetches all items in a single request": "Fetches all items in a single request",
"URI's of the items to add": "URI's of the items to add",
"URI's of the items to remove": "URI's of the items to remove",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Albums": "Albums",
"Artists": "Artists",
"Playlists": "Playlists",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"Playlist Items Changed": "Playlist Items Changed",
"Triggers when the items of a playlist change": "Triggers when the items of a playlist change"
}

View File

@@ -0,0 +1,82 @@
{
"Music for everyone": "みんなのための音楽",
"\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n": "\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n",
"Search": "検索",
"Get Playback State": "再生状態を取得する",
"Play / Resume": "再生/再開",
"Pause": "一時停止",
"Set Volume": "音量を設定",
"Get Playlists": "プレイリストを入手",
"Get Playlist Info": "プレイリスト情報を取得する",
"Get Playlist Items": "プレイリストのアイテムを取得",
"Get Saved Tracks": "保存されたトラックを取得",
"Create Playlist": "プレイリストを作成",
"Update Playlist": "プレイリストを更新",
"Add items to playlist": "プレイリストにアイテムを追加",
"Remove items from playlist": "プレイリストからアイテムを削除",
"Reorder playlist": "プレイリストの並べ替え",
"Custom API Call": "カスタムAPI通話",
"Searches for tracks, artists, albums, etc.": "トラック、アーティスト、アルバムなどを検索します。",
"Retrieves the current playback state of the player": "プレイヤーの現在の再生状態を取得します",
"Resumes or starts playback": "再生を再開または開始",
"Pauses the playback": "再生を一時停止します",
"Sets the volume of the player": "プレーヤーの音量を設定します",
"Retrieves the list of playlists that you created or followed": "作成またはフォローしたプレイリストのリストを取得します。",
"Retrieves details of a playlist": "プレイリストの詳細を取得します",
"Retrieves the list of items in the playlist": "プレイリストの項目のリストを取得します。",
"Retrieves the list of saved tracks for the current user": "現在のユーザーの保存済みトラックのリストを取得します。",
"Creates a new playlist for the current user": "現在のユーザーの新しいプレイリストを作成します",
"Updates details of the playlist": "プレイリストの詳細を更新",
"Adds tracks or episodes to the playlist": "プレイリストにトラックやエピソードを追加します",
"Removes tracks or episodes from the playlist": "プレイリストからトラックやエピソードを削除します。",
"Reorders items in the playlist": "プレイリスト内のアイテムを再注文",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
"Search Text": "テキストを検索",
"Object Types": "オブジェクトの種類",
"Limit": "制限",
"Offset": "オフセット",
"Device": "デバイス",
"Context URI": "Context URI",
"Tracks": "トラック",
"Position": "位置",
"Volume": "音量",
"All": "すべて",
"Playlist": "プレイリスト",
"Name": "Name",
"Description": "Description",
"Public": "公開",
"Collaborative": "共同作業",
"Items": "Items",
"From Position": "ポジションから",
"To Position": "位置",
"Amount of Items": "アイテムの量",
"Method": "方法",
"Headers": "ヘッダー",
"Query Parameters": "クエリパラメータ",
"Body": "本文",
"Response is Binary ?": "応答はバイナリですか?",
"No Error on Failure": "失敗時にエラーはありません",
"Timeout (in seconds)": "タイムアウト(秒)",
"The word or phrase you are searching for": "検索する単語またはフレーズ",
"Spotify URI of the context to play (album, artist, playlist)": "再生するコンテキストの Spotify URI (アルバム、アーティスト、プレイリスト)",
"List of spotify track uris to play": "再生するSpotifyトラック尿路のリスト",
"Position in milliseconds": "ミリ秒単位で表示",
"Volume from 0 to 100": "0 から 100 までの音量",
"Fetches all playlists in a single request": "一度のリクエストですべてのプレイリストを取得します。",
"Fetches all items in a single request": "単一のリクエストですべてのアイテムをフェッチします。",
"URI's of the items to add": "追加するアイテムの URI",
"URI's of the items to remove": "削除するアイテムの URI",
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
"Albums": "アルバム",
"Artists": "アーティスト",
"Playlists": "プレイリスト",
"GET": "取得",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "削除",
"HEAD": "頭",
"Playlist Items Changed": "プレイリストのアイテムが変更されました",
"Triggers when the items of a playlist change": "プレイリストのアイテムが変更されたときにトリガーします"
}

View File

@@ -0,0 +1,82 @@
{
"Music for everyone": "Muziek voor iedereen",
"\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n": "\nOm een client-ID en clientgeheim voor Spotify te verkrijgen, volg je deze eenvoudige stappen:\n\n1. Ga naar het [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** op uw Spotify-account.\n3. Klik op de **\"Maak een App\"** knop.\n4. Vul de vereiste informatie in, zoals de **App Naam** en **App Beschrijving**.\n5. Zodra uw app is gemaakt, ziet u de **client ID** en **client secret** op het dashboard van de app.\n6. **Kopieer** de client-ID en clientgeheim en **plakken** ze hieronder.\n",
"Search": "Zoeken",
"Get Playback State": "Afspeel status",
"Play / Resume": "Afspelen / hervatten",
"Pause": "Onderbreken",
"Set Volume": "Volume instellen",
"Get Playlists": "Afspeellijsten ophalen",
"Get Playlist Info": "Get Playlist Info",
"Get Playlist Items": "Haal afspeellijst items op",
"Get Saved Tracks": "Opgeslagen tracks ophalen",
"Create Playlist": "Afspeellijst maken",
"Update Playlist": "Afspeellijst bijwerken",
"Add items to playlist": "Voeg items toe aan afspeellijst",
"Remove items from playlist": "Verwijder items van afspeellijst",
"Reorder playlist": "Afspeellijst opnieuw sorteren",
"Custom API Call": "Custom API Call",
"Searches for tracks, artists, albums, etc.": "Zoekt naar tracks, artiesten, albums, enz.",
"Retrieves the current playback state of the player": "Haalt de huidige afspeelstatus van de speler op",
"Resumes or starts playback": "Hervat of begin met afspelen",
"Pauses the playback": "Pauzeert het afspelen",
"Sets the volume of the player": "Stelt het volume van de speler in",
"Retrieves the list of playlists that you created or followed": "Herstelt de lijst met afspeellijsten die je hebt gemaakt of gevolgd",
"Retrieves details of a playlist": "Ophalen details van een afspeellijst",
"Retrieves the list of items in the playlist": "Haal de lijst op met items in de afspeellijst",
"Retrieves the list of saved tracks for the current user": "Haalt de lijst op met opgeslagen nummers voor de huidige gebruiker",
"Creates a new playlist for the current user": "Maakt een nieuwe afspeellijst voor de huidige gebruiker",
"Updates details of the playlist": "Updates details van de afspeellijst",
"Adds tracks or episodes to the playlist": "Voegt tracks of afleveringen toe aan de afspeellijst",
"Removes tracks or episodes from the playlist": "Verwijdert tracks of afleveringen van de afspeellijst",
"Reorders items in the playlist": "Herschik items in de afspeellijst",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
"Search Text": "Zoek tekst",
"Object Types": "Object types",
"Limit": "Limiet",
"Offset": "Verschuiving",
"Device": "Apparaat",
"Context URI": "Context URI",
"Tracks": "Nummers",
"Position": "Positie",
"Volume": "Volume",
"All": "Allemaal",
"Playlist": "Afspeellijst",
"Name": "Naam",
"Description": "Beschrijving",
"Public": "Openbaar",
"Collaborative": "Samenwerkend",
"Items": "Artikelen",
"From Position": "Van positie",
"To Position": "Naar positie",
"Amount of Items": "Hoeveelheid artikelen",
"Method": "Methode",
"Headers": "Kopteksten",
"Query Parameters": "Query parameters",
"Body": "Lichaam",
"Response is Binary ?": "Antwoord is binair?",
"No Error on Failure": "Geen fout bij fout",
"Timeout (in seconds)": "Time-out (in seconden)",
"The word or phrase you are searching for": "Het woord of zin waarnaar je op zoek bent",
"Spotify URI of the context to play (album, artist, playlist)": "Spotify URI van de context te spelen (album, artiest, afspeellijst)",
"List of spotify track uris to play": "Lijst van spotify track uris om te spelen",
"Position in milliseconds": "Positie in milliseconden",
"Volume from 0 to 100": "Volume van 0 tot 100",
"Fetches all playlists in a single request": "Haalt alle afspeellijsten op in één enkel verzoek",
"Fetches all items in a single request": "Haalt alle items op in een enkel verzoek",
"URI's of the items to add": "URI's van de toe te voegen items",
"URI's of the items to remove": "URI's van de items om te verwijderen",
"Authorization headers are injected automatically from your connection.": "Autorisatie headers worden automatisch geïnjecteerd vanuit uw verbinding.",
"Enable for files like PDFs, images, etc..": "Inschakelen voor bestanden zoals PDF's, afbeeldingen etc..",
"Albums": "Albums",
"Artists": "Artiesten",
"Playlists": "Afspeellijsten",
"GET": "KRIJG",
"POST": "POSTE",
"PATCH": "BEKIJK",
"PUT": "PUT",
"DELETE": "VERWIJDEREN",
"HEAD": "HOOFD",
"Playlist Items Changed": "Afspeellijst items gewijzigd",
"Triggers when the items of a playlist change": "Activeert wanneer de items van een afspeellijst veranderen"
}

View File

@@ -0,0 +1,82 @@
{
"Music for everyone": "Música para todos",
"\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n": "\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n",
"Search": "Pesquisar",
"Get Playback State": "Obter Status de Reprodução",
"Play / Resume": "Reproduzir / Continuar",
"Pause": "Suspender",
"Set Volume": "Definir Volume",
"Get Playlists": "Obter playlists",
"Get Playlist Info": "Obter informações da playlist",
"Get Playlist Items": "Obter itens da Playlist",
"Get Saved Tracks": "Obter Acompanhamentos Salvos",
"Create Playlist": "Criar playlist",
"Update Playlist": "Atualizar playlist",
"Add items to playlist": "Adicionar itens à lista de reprodução",
"Remove items from playlist": "Remover itens da lista de reprodução",
"Reorder playlist": "Reordenar playlist",
"Custom API Call": "Chamada de API personalizada",
"Searches for tracks, artists, albums, etc.": "Pesquisa por faixas, artistas, álbuns, etc.",
"Retrieves the current playback state of the player": "Recupera o estado atual de reprodução do jogador",
"Resumes or starts playback": "Retoma ou inicia a reprodução",
"Pauses the playback": "Pausa a reprodução",
"Sets the volume of the player": "Define o volume do player",
"Retrieves the list of playlists that you created or followed": "Recupera a lista de playlists que você criou ou seguiu",
"Retrieves details of a playlist": "Recupera detalhes de uma playlist",
"Retrieves the list of items in the playlist": "Recupera a lista de itens da playlist",
"Retrieves the list of saved tracks for the current user": "Recupera a lista de faixas salvas para o usuário atual",
"Creates a new playlist for the current user": "Cria uma nova playlist para o usuário atual",
"Updates details of the playlist": "Detalhes da atualização da playlist",
"Adds tracks or episodes to the playlist": "Adicionar faixas ou episódios à lista de reprodução",
"Removes tracks or episodes from the playlist": "Remove faixas ou episódios da playlist",
"Reorders items in the playlist": "Reordenar itens na lista de reprodução",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
"Search Text": "Pesquisar texto",
"Object Types": "Tipos de Objetos",
"Limit": "Limitar",
"Offset": "Deslocamento",
"Device": "Dispositivo",
"Context URI": "Context URI",
"Tracks": "Acompanhamentos",
"Position": "Posição",
"Volume": "Volume",
"All": "TODOS",
"Playlist": "Playlist",
"Name": "Nome",
"Description": "Descrição",
"Public": "Público",
"Collaborative": "Colaborativo",
"Items": "Itens",
"From Position": "Da Posição",
"To Position": "Para a Posição",
"Amount of Items": "Quantidade de Itens",
"Method": "Método",
"Headers": "Cabeçalhos",
"Query Parameters": "Parâmetros da consulta",
"Body": "Conteúdo",
"Response is Binary ?": "A resposta é binária ?",
"No Error on Failure": "Nenhum erro no Failure",
"Timeout (in seconds)": "Tempo limite (em segundos)",
"The word or phrase you are searching for": "A palavra ou frase que você está procurando",
"Spotify URI of the context to play (album, artist, playlist)": "Spotify URI do contexto para reproduzir (álbum, artista, playlist)",
"List of spotify track uris to play": "Lista de spotify track uris para tocar",
"Position in milliseconds": "Posição em milissegundos",
"Volume from 0 to 100": "Volume de 0 a 100",
"Fetches all playlists in a single request": "Obtém todas as playlists em uma única solicitação",
"Fetches all items in a single request": "Obtém todos os itens em uma única requisição",
"URI's of the items to add": "URI dos itens a adicionar",
"URI's of the items to remove": "URI dos itens a serem removidos",
"Authorization headers are injected automatically from your connection.": "Os cabeçalhos de autorização são inseridos automaticamente a partir da sua conexão.",
"Enable for files like PDFs, images, etc..": "Habilitar para arquivos como PDFs, imagens, etc..",
"Albums": "álbuns",
"Artists": "artistas",
"Playlists": "Playlists",
"GET": "OBTER",
"POST": "POSTAR",
"PATCH": "COMPRAR",
"PUT": "COLOCAR",
"DELETE": "EXCLUIR",
"HEAD": "CABEÇA",
"Playlist Items Changed": "Itens da lista de reprodução alterados",
"Triggers when the items of a playlist change": "Aciona quando os itens de uma lista mudam"
}

View File

@@ -0,0 +1,81 @@
{
"Spotify": "Spotify",
"Music for everyone": "Музыка для всех",
"\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n": "\nЧтобы получить идентификатор клиента и секретный ключ для Spotify, выполните следующие простые шаги:\n\n1. Перейдите на [панель управления разработчиками Spotify](https://developer.spotify.com/).\n2. **Войдите** в свою учетную запись Spotify.\n3. Нажмите на кнопку **\"Создать приложение\"**.\n4. Заполните необходимые данные, такие как **Название приложения** и **Описание приложения**.\n5. После создания вашего приложения, вы увидите **Идентификатор клиента** и **Секретный ключ** на панели приложения.\n6. **Скопируйте** идентификатор клиента и секретный ключ и **вставьте** их ниже.\n",
"Search": "Search",
"Get Playback State": "Получение статуса воспроизведения",
"Play / Resume": "Играть / Продолжить",
"Pause": "Пауза",
"Set Volume": "Установить громкость",
"Get Playlists": "Получить плейлисты",
"Get Playlist Info": "Получить информацию о плейлисте",
"Get Playlist Items": "Получить плейлист",
"Get Saved Tracks": "Получить сохраненные треки",
"Create Playlist": "Создать плейлист",
"Update Playlist": "Обновить плейлист",
"Add items to playlist": "Добавить элементы в плейлист",
"Remove items from playlist": "Удалить элементы из плейлиста",
"Reorder playlist": "Изменить порядок плейлиста",
"Custom API Call": "Пользовательский вызов API",
"Searches for tracks, artists, albums, etc.": "Поиск треков, исполнителей, альбомов и т.д.",
"Retrieves the current playback state of the player": "Возвращает текущее состояние воспроизведения игрока",
"Resumes or starts playback": "Возобновить или начать воспроизведение",
"Pauses the playback": "Приостанавливает воспроизведение",
"Sets the volume of the player": "Устанавливает громкость плеера",
"Retrieves the list of playlists that you created or followed": "Извлекает список плейлистов, которые вы создали или следовали",
"Retrieves details of a playlist": "Получает подробности плейлиста",
"Retrieves the list of items in the playlist": "Извлекает список элементов в плейлисте",
"Retrieves the list of saved tracks for the current user": "Извлекает список сохраненных треков для текущего пользователя",
"Creates a new playlist for the current user": "Создает новый плейлист для текущего пользователя",
"Updates details of the playlist": "Обновляет детали плейлиста",
"Adds tracks or episodes to the playlist": "Добавляет треки или эпизоды в плейлист",
"Removes tracks or episodes from the playlist": "Удаляет треки или эпизоды из плейлиста",
"Reorders items in the playlist": "Порядок элементов в плейлисте",
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
"Search Text": "Поиск текста",
"Object Types": "Типы объектов",
"Limit": "Лимит",
"Offset": "Смещение",
"Device": "Устройство",
"Context URI": "Context URI",
"Tracks": "Треки",
"Position": "Позиция",
"Volume": "Объем",
"All": "Все",
"Playlist": "Плейлист",
"Name": "Наименование",
"Description": "Description",
"Public": "Публичный",
"Collaborative": "Совместное",
"Items": "Items",
"From Position": "С позиции",
"To Position": "На позицию",
"Amount of Items": "Количество элементов",
"Method": "Метод",
"Headers": "Заголовки",
"Query Parameters": "Параметры запроса",
"Body": "Тело",
"No Error on Failure": "Нет ошибок при ошибке",
"Timeout (in seconds)": "Таймаут (в секундах)",
"The word or phrase you are searching for": "Слово или фраза которую вы ищите",
"Spotify URI of the context to play (album, artist, playlist)": "URL Spotify URI контекста для воспроизведения (альбом, исполнитель, плейлист)",
"List of spotify track uris to play": "Список пропусков uris для воспроизведения",
"Position in milliseconds": "Позиция в миллисекундах",
"Volume from 0 to 100": "Громкость от 0 до 100",
"Fetches all playlists in a single request": "Извлекает все плейлисты в одном запросе",
"Fetches all items in a single request": "Извлекает все элементы в одном запросе",
"URI's of the items to add": "URI элементов для добавления",
"URI's of the items to remove": "URI элементов для удаления",
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
"Albums": "Альбомы",
"Artists": "Художники",
"Playlists": "Плейлисты",
"GET": "ПОЛУЧИТЬ",
"POST": "ПОСТ",
"PATCH": "ПАТЧ",
"PUT": "ПОКУПИТЬ",
"DELETE": "УДАЛИТЬ",
"HEAD": "HEAD",
"Playlist Items Changed": "Элементы плейлиста изменены",
"Triggers when the items of a playlist change": "Включает при смене элементов списка воспроизведения"
}

View File

@@ -0,0 +1,82 @@
{
"Music for everyone": "Music for everyone",
"\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n": "\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n",
"Search": "Search",
"Get Playback State": "Get Playback State",
"Play / Resume": "Play / Resume",
"Pause": "Pause",
"Set Volume": "Set Volume",
"Get Playlists": "Get Playlists",
"Get Playlist Info": "Get Playlist Info",
"Get Playlist Items": "Get Playlist Items",
"Get Saved Tracks": "Get Saved Tracks",
"Create Playlist": "Create Playlist",
"Update Playlist": "Update Playlist",
"Add items to playlist": "Add items to playlist",
"Remove items from playlist": "Remove items from playlist",
"Reorder playlist": "Reorder playlist",
"Custom API Call": "Custom API Call",
"Searches for tracks, artists, albums, etc.": "Searches for tracks, artists, albums, etc.",
"Retrieves the current playback state of the player": "Retrieves the current playback state of the player",
"Resumes or starts playback": "Resumes or starts playback",
"Pauses the playback": "Pauses the playback",
"Sets the volume of the player": "Sets the volume of the player",
"Retrieves the list of playlists that you created or followed": "Retrieves the list of playlists that you created or followed",
"Retrieves details of a playlist": "Retrieves details of a playlist",
"Retrieves the list of items in the playlist": "Retrieves the list of items in the playlist",
"Retrieves the list of saved tracks for the current user": "Retrieves the list of saved tracks for the current user",
"Creates a new playlist for the current user": "Creates a new playlist for the current user",
"Updates details of the playlist": "Updates details of the playlist",
"Adds tracks or episodes to the playlist": "Adds tracks or episodes to the playlist",
"Removes tracks or episodes from the playlist": "Removes tracks or episodes from the playlist",
"Reorders items in the playlist": "Reorders items in the playlist",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Search Text": "Search Text",
"Object Types": "Object Types",
"Limit": "Limit",
"Offset": "Offset",
"Device": "Device",
"Context URI": "Context URI",
"Tracks": "Tracks",
"Position": "Position",
"Volume": "Volume",
"All": "All",
"Playlist": "Playlist",
"Name": "Name",
"Description": "Description",
"Public": "Public",
"Collaborative": "Collaborative",
"Items": "Items",
"From Position": "From Position",
"To Position": "To Position",
"Amount of Items": "Amount of Items",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"The word or phrase you are searching for": "The word or phrase you are searching for",
"Spotify URI of the context to play (album, artist, playlist)": "Spotify URI of the context to play (album, artist, playlist)",
"List of spotify track uris to play": "List of spotify track uris to play",
"Position in milliseconds": "Position in milliseconds",
"Volume from 0 to 100": "Volume from 0 to 100",
"Fetches all playlists in a single request": "Fetches all playlists in a single request",
"Fetches all items in a single request": "Fetches all items in a single request",
"URI's of the items to add": "URI's of the items to add",
"URI's of the items to remove": "URI's of the items to remove",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"Albums": "Albums",
"Artists": "Artists",
"Playlists": "Playlists",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"Playlist Items Changed": "Playlist Items Changed",
"Triggers when the items of a playlist change": "Triggers when the items of a playlist change"
}

View File

@@ -0,0 +1,81 @@
{
"Spotify": "Spotify",
"Music for everyone": "Music for everyone",
"\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n": "\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n",
"Search": "Search",
"Get Playback State": "Get Playback State",
"Play / Resume": "Play / Resume",
"Pause": "Pause",
"Set Volume": "Set Volume",
"Get Playlists": "Get Playlists",
"Get Playlist Info": "Get Playlist Info",
"Get Playlist Items": "Get Playlist Items",
"Get Saved Tracks": "Get Saved Tracks",
"Create Playlist": "Create Playlist",
"Update Playlist": "Update Playlist",
"Add items to playlist": "Add items to playlist",
"Remove items from playlist": "Remove items from playlist",
"Reorder playlist": "Reorder playlist",
"Custom API Call": "Custom API Call",
"Searches for tracks, artists, albums, etc.": "Searches for tracks, artists, albums, etc.",
"Retrieves the current playback state of the player": "Retrieves the current playback state of the player",
"Resumes or starts playback": "Resumes or starts playback",
"Pauses the playback": "Pauses the playback",
"Sets the volume of the player": "Sets the volume of the player",
"Retrieves the list of playlists that you created or followed": "Retrieves the list of playlists that you created or followed",
"Retrieves details of a playlist": "Retrieves details of a playlist",
"Retrieves the list of items in the playlist": "Retrieves the list of items in the playlist",
"Retrieves the list of saved tracks for the current user": "Retrieves the list of saved tracks for the current user",
"Creates a new playlist for the current user": "Creates a new playlist for the current user",
"Updates details of the playlist": "Updates details of the playlist",
"Adds tracks or episodes to the playlist": "Adds tracks or episodes to the playlist",
"Removes tracks or episodes from the playlist": "Removes tracks or episodes from the playlist",
"Reorders items in the playlist": "Reorders items in the playlist",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Search Text": "Search Text",
"Object Types": "Object Types",
"Limit": "Limit",
"Offset": "Offset",
"Device": "Device",
"Context URI": "Context URI",
"Tracks": "Tracks",
"Position": "Position",
"Volume": "Volume",
"All": "Tất cả",
"Playlist": "Playlist",
"Name": "Name",
"Description": "Description",
"Public": "Public",
"Collaborative": "Collaborative",
"Items": "Các mục",
"From Position": "From Position",
"To Position": "To Position",
"Amount of Items": "Amount of Items",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"The word or phrase you are searching for": "The word or phrase you are searching for",
"Spotify URI of the context to play (album, artist, playlist)": "Spotify URI of the context to play (album, artist, playlist)",
"List of spotify track uris to play": "List of spotify track uris to play",
"Position in milliseconds": "Position in milliseconds",
"Volume from 0 to 100": "Volume from 0 to 100",
"Fetches all playlists in a single request": "Fetches all playlists in a single request",
"Fetches all items in a single request": "Fetches all items in a single request",
"URI's of the items to add": "URI's of the items to add",
"URI's of the items to remove": "URI's of the items to remove",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Albums": "Albums",
"Artists": "Artists",
"Playlists": "Playlists",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"Playlist Items Changed": "Playlist Items Changed",
"Triggers when the items of a playlist change": "Triggers when the items of a playlist change"
}

View File

@@ -0,0 +1,82 @@
{
"Music for everyone": "Music for everyone",
"\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n": "\nTo obtain a client ID and client secret for Spotify, follow these simple steps:\n\n1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).\n2. **Log in** to your Spotify account.\n3. Click on the **\"Create an App\"** button.\n4. Fill in the required information, such as the **App Name** and **App Description**.\n5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.\n6. **Copy** the client ID and client secret and **paste** them below.\n",
"Search": "Search",
"Get Playback State": "Get Playback State",
"Play / Resume": "Play / Resume",
"Pause": "Pause",
"Set Volume": "Set Volume",
"Get Playlists": "Get Playlists",
"Get Playlist Info": "Get Playlist Info",
"Get Playlist Items": "Get Playlist Items",
"Get Saved Tracks": "Get Saved Tracks",
"Create Playlist": "Create Playlist",
"Update Playlist": "Update Playlist",
"Add items to playlist": "Add items to playlist",
"Remove items from playlist": "Remove items from playlist",
"Reorder playlist": "Reorder playlist",
"Custom API Call": "自定义 API 呼叫",
"Searches for tracks, artists, albums, etc.": "Searches for tracks, artists, albums, etc.",
"Retrieves the current playback state of the player": "Retrieves the current playback state of the player",
"Resumes or starts playback": "Resumes or starts playback",
"Pauses the playback": "Pauses the playback",
"Sets the volume of the player": "Sets the volume of the player",
"Retrieves the list of playlists that you created or followed": "Retrieves the list of playlists that you created or followed",
"Retrieves details of a playlist": "Retrieves details of a playlist",
"Retrieves the list of items in the playlist": "Retrieves the list of items in the playlist",
"Retrieves the list of saved tracks for the current user": "Retrieves the list of saved tracks for the current user",
"Creates a new playlist for the current user": "Creates a new playlist for the current user",
"Updates details of the playlist": "Updates details of the playlist",
"Adds tracks or episodes to the playlist": "Adds tracks or episodes to the playlist",
"Removes tracks or episodes from the playlist": "Removes tracks or episodes from the playlist",
"Reorders items in the playlist": "Reorders items in the playlist",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
"Search Text": "Search Text",
"Object Types": "Object Types",
"Limit": "Limit",
"Offset": "Offset",
"Device": "Device",
"Context URI": "Context URI",
"Tracks": "Tracks",
"Position": "Position",
"Volume": "Volume",
"All": "所有的",
"Playlist": "Playlist",
"Name": "名称",
"Description": "描述",
"Public": "Public",
"Collaborative": "Collaborative",
"Items": "项目",
"From Position": "From Position",
"To Position": "To Position",
"Amount of Items": "Amount of Items",
"Method": "方法",
"Headers": "信头",
"Query Parameters": "查询参数",
"Body": "正文内容",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "失败时没有错误",
"Timeout (in seconds)": "超时(秒)",
"The word or phrase you are searching for": "The word or phrase you are searching for",
"Spotify URI of the context to play (album, artist, playlist)": "Spotify URI of the context to play (album, artist, playlist)",
"List of spotify track uris to play": "List of spotify track uris to play",
"Position in milliseconds": "Position in milliseconds",
"Volume from 0 to 100": "Volume from 0 to 100",
"Fetches all playlists in a single request": "Fetches all playlists in a single request",
"Fetches all items in a single request": "Fetches all items in a single request",
"URI's of the items to add": "URI's of the items to add",
"URI's of the items to remove": "URI's of the items to remove",
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"Albums": "Albums",
"Artists": "Artists",
"Playlists": "Playlists",
"GET": "获取",
"POST": "帖子",
"PATCH": "PATCH",
"PUT": "弹出",
"DELETE": "删除",
"HEAD": "黑色",
"Playlist Items Changed": "Playlist Items Changed",
"Triggers when the items of a playlist change": "Triggers when the items of a playlist change"
}

View File

@@ -0,0 +1,30 @@
import { createCustomApiCallAction } from '@activepieces/pieces-common';
import {
OAuth2PropertyValue,
createPiece,
} from '@activepieces/pieces-framework';
import actions from './lib/actions';
import { spotifyCommon } from './lib/common';
import triggers from './lib/triggers';
export const spotify = createPiece({
displayName: 'Spotify',
description: 'Music for everyone',
auth: spotifyCommon.authentication,
minimumSupportedRelease: '0.30.0',
logoUrl: 'https://cdn.activepieces.com/pieces/spotify.png',
categories: [],
authors: ["JanHolger","kishanprmr","MoShizzle","abuaboud","jerboa88"],
actions: [
...actions,
createCustomApiCallAction({
baseUrl: () => 'https://api.spotify.com/v1',
auth: spotifyCommon.authentication,
authMapping: async (auth) => ({
Authorization: `Bearer ${(auth as OAuth2PropertyValue).access_token}`,
}),
}),
],
triggers,
});

View File

@@ -0,0 +1,30 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { spotifyCommon, makeClient } from '../common';
export default createAction({
name: 'add_playlist_items',
auth: spotifyCommon.authentication,
displayName: 'Add items to playlist',
description: 'Adds tracks or episodes to the playlist',
props: {
playlist_id: spotifyCommon.playlist_id(true),
items: Property.Array({
displayName: 'Items',
description: "URI's of the items to add",
required: true,
}),
position: Property.Number({
displayName: 'Position',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient({
auth,
});
await client.addItemsToPlaylist(propsValue.playlist_id as string, {
uris: propsValue.items as string[],
position: propsValue.position,
});
},
});

View File

@@ -0,0 +1,38 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { spotifyCommon, makeClient } from '../common';
export default createAction({
name: 'create_playlist',
displayName: 'Create Playlist',
description: 'Creates a new playlist for the current user',
auth: spotifyCommon.authentication,
props: {
name: Property.ShortText({
displayName: 'Name',
required: true,
}),
description: Property.ShortText({
displayName: 'Description',
required: false,
}),
public: Property.Checkbox({
displayName: 'Public',
required: false,
}),
collaborative: Property.Checkbox({
displayName: 'Collaborative',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient({ auth });
const user = await client.getCurrentUser();
const res = await client.createPlaylist(user.id, {
name: propsValue.name,
description: propsValue.description,
public: propsValue.public,
collaborative: propsValue.collaborative,
});
return res;
},
});

View File

@@ -0,0 +1,15 @@
import { createAction } from '@activepieces/pieces-framework';
import { spotifyCommon, makeClient } from '../common';
export default createAction({
name: 'get_playback_state',
displayName: 'Get Playback State',
description: 'Retrieves the current playback state of the player',
auth: spotifyCommon.authentication,
props: {},
async run({ auth }) {
const client = makeClient({ auth });
const res = await client.getPlaybackState();
return res;
},
});

View File

@@ -0,0 +1,16 @@
import { createAction } from '@activepieces/pieces-framework';
import { spotifyCommon, makeClient } from '../common';
export default createAction({
name: 'get_playlist_info',
displayName: 'Get Playlist Info',
description: 'Retrieves details of a playlist',
auth: spotifyCommon.authentication,
props: {
playlist_id: spotifyCommon.playlist_id(true),
},
async run({ auth, propsValue }) {
const client = makeClient({ auth });
return await client.getPlaylist(propsValue.playlist_id as string);
},
});

View File

@@ -0,0 +1,38 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { spotifyCommon, makeClient } from '../common';
export default createAction({
name: 'get_playlist_items',
displayName: 'Get Playlist Items',
description: 'Retrieves the list of items in the playlist',
auth: spotifyCommon.authentication,
props: {
playlist_id: spotifyCommon.playlist_id(true),
offset: Property.Number({
displayName: 'Offset',
required: false,
}),
limit: Property.Number({
displayName: 'Limit',
required: false,
}),
all: Property.Checkbox({
displayName: 'All',
description: 'Fetches all items in a single request',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient({ auth });
if (propsValue.all) {
const items = await client.getAllPlaylistItems(
propsValue.playlist_id as string
);
return { total: items.length, items };
}
return await client.getPlaylistItems(propsValue.playlist_id as string, {
limit: propsValue.limit,
offset: propsValue.offset,
});
},
});

View File

@@ -0,0 +1,35 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { spotifyCommon, makeClient } from '../common';
export default createAction({
name: 'get_playlists',
displayName: 'Get Playlists',
description: 'Retrieves the list of playlists that you created or followed',
auth: spotifyCommon.authentication,
props: {
offset: Property.Number({
displayName: 'Offset',
required: false,
}),
limit: Property.Number({
displayName: 'Limit',
required: false,
}),
all: Property.Checkbox({
displayName: 'All',
description: 'Fetches all playlists in a single request',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient({ auth });
if (propsValue.all) {
const items = await client.getAllCurrentUserPlaylists();
return { total: items.length, items };
}
return await client.getCurrentUserPlaylists({
limit: propsValue.limit,
offset: propsValue.offset,
});
},
});

View File

@@ -0,0 +1,35 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { spotifyCommon, makeClient } from '../common';
export default createAction({
name: 'get_saved_tracks',
displayName: 'Get Saved Tracks',
description: 'Retrieves the list of saved tracks for the current user',
auth: spotifyCommon.authentication,
props: {
offset: Property.Number({
displayName: 'Offset',
required: false,
}),
limit: Property.Number({
displayName: 'Limit',
required: false,
}),
all: Property.Checkbox({
displayName: 'All',
description: 'Fetches all items in a single request',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient({ auth });
if (propsValue.all) {
const items = await client.getAllSavedTracks();
return { total: items.length, items };
}
return await client.getSavedTracks({
limit: propsValue.limit,
offset: propsValue.offset,
});
},
});

View File

@@ -0,0 +1,31 @@
import search from './search';
import getPlaybackState from './get-playback-state';
import setVolume from './set-volume';
import play from './play';
import pause from './pause';
import getPlaylistInfo from './get-playlist-info';
import createPlaylist from './create-playlist';
import updatePlaylist from './update-playlist';
import addPlaylistItems from './add-playlist-items';
import removePlaylistItems from './remove-playlist-items';
import getPlaylistItems from './get-playlist-items';
import getSavedTracks from './get-saved-tracks';
import reorderPlaylist from './reorder-playlist';
import getPlaylists from './get-playlists';
export default [
search,
getPlaybackState,
play,
pause,
setVolume,
getPlaylists,
getPlaylistInfo,
getPlaylistItems,
getSavedTracks,
createPlaylist,
updatePlaylist,
addPlaylistItems,
removePlaylistItems,
reorderPlaylist,
];

View File

@@ -0,0 +1,19 @@
import { createAction } from '@activepieces/pieces-framework';
import { spotifyCommon, makeClient } from '../common';
export default createAction({
name: 'pause',
displayName: 'Pause',
description: 'Pauses the playback',
auth: spotifyCommon.authentication,
props: {
device_id: spotifyCommon.device_id(false),
},
async run({ auth, propsValue }) {
const client = makeClient({ auth });
const res = await client.pause({
device_id: propsValue.device_id,
});
return res;
},
});

View File

@@ -0,0 +1,38 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { spotifyCommon, makeClient } from '../common';
export default createAction({
name: 'play',
displayName: 'Play / Resume',
description: 'Resumes or starts playback',
auth: spotifyCommon.authentication,
props: {
device_id: spotifyCommon.device_id(false),
context_uri: Property.ShortText({
displayName: 'Context URI',
description:
'Spotify URI of the context to play (album, artist, playlist)',
required: false,
}),
tracks: Property.Array({
displayName: 'Tracks',
description: 'List of spotify track uris to play',
required: false,
}),
position_ms: Property.Number({
displayName: 'Position',
description: 'Position in milliseconds',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient({ auth });
const res = await client.play({
device_id: propsValue.device_id,
context_uri: propsValue.context_uri,
uris: propsValue.tracks as string[],
position_ms: propsValue.position_ms,
});
return res;
},
});

View File

@@ -0,0 +1,23 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { spotifyCommon, makeClient } from '../common';
export default createAction({
name: 'remove_playlist_items',
displayName: 'Remove items from playlist',
description: 'Removes tracks or episodes from the playlist',
auth: spotifyCommon.authentication,
props: {
playlist_id: spotifyCommon.playlist_id(true),
items: Property.Array({
displayName: 'Items',
description: "URI's of the items to remove",
required: true,
}),
},
async run({ auth, propsValue }) {
const client = makeClient({ auth });
await client.removeItemsFromPlaylist(propsValue.playlist_id as string, {
tracks: propsValue.items.map((uri) => ({ uri: uri as string })),
});
},
});

View File

@@ -0,0 +1,32 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { spotifyCommon, makeClient } from '../common';
export default createAction({
name: 'reorder_playlist',
displayName: 'Reorder playlist',
description: 'Reorders items in the playlist',
auth: spotifyCommon.authentication,
props: {
playlist_id: spotifyCommon.playlist_id(true),
from_position: Property.Number({
displayName: 'From Position',
required: true,
}),
to_position: Property.Number({
displayName: 'To Position',
required: true,
}),
amount: Property.Number({
displayName: 'Amount of Items',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient({ auth });
await client.reorderPlaylist(propsValue.playlist_id as string, {
range_start: propsValue.from_position,
range_length: propsValue.amount,
insert_before: propsValue.to_position,
});
},
});

View File

@@ -0,0 +1,52 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { spotifyCommon, makeClient } from '../common';
export default createAction({
name: 'search',
displayName: 'Search',
description: 'Searches for tracks, artists, albums, etc.',
auth: spotifyCommon.authentication,
props: {
search_text: Property.ShortText({
displayName: 'Search Text',
description: 'The word or phrase you are searching for',
required: true,
}),
types: Property.StaticMultiSelectDropdown({
displayName: 'Object Types',
required: true,
options: {
options: [
{ label: 'Albums', value: '' },
{ label: 'Artists', value: 'artist' },
{ label: 'Playlists', value: 'playlist' },
{ label: 'Tracks', value: 'track' },
],
},
}),
limit: Property.Number({
displayName: 'Limit',
required: false,
}),
offset: Property.Number({
displayName: 'Offset',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient({ auth });
const res = await client.search({
q: propsValue.search_text,
type: propsValue.types.join(','),
limit: propsValue.limit,
offset: propsValue.offset,
});
const result = {
tracks: res.tracks?.items,
artists: res.artists?.items,
albums: res.albums?.items,
playlists: res.playlists?.items,
};
return result;
},
});

View File

@@ -0,0 +1,25 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { spotifyCommon, makeClient } from '../common';
export default createAction({
name: 'set_volume',
displayName: 'Set Volume',
auth: spotifyCommon.authentication,
description: 'Sets the volume of the player',
props: {
volume: Property.Number({
displayName: 'Volume',
description: 'Volume from 0 to 100',
required: true,
}),
device_id: spotifyCommon.device_id(false),
},
async run({ auth, propsValue }) {
const client = makeClient({ auth });
const res = await client.setVolume({
volume_percent: propsValue.volume,
device_id: propsValue.device_id,
});
return res;
},
});

View File

@@ -0,0 +1,37 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { spotifyCommon, makeClient } from '../common';
export default createAction({
name: 'update_playlist',
displayName: 'Update Playlist',
description: 'Updates details of the playlist',
auth: spotifyCommon.authentication,
props: {
playlist_id: spotifyCommon.playlist_id(true),
name: Property.ShortText({
displayName: 'Name',
required: false,
}),
description: Property.ShortText({
displayName: 'Description',
required: false,
}),
public: Property.Checkbox({
displayName: 'Public',
required: false,
}),
collaborative: Property.Checkbox({
displayName: 'Collaborative',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient({ auth });
await client.updatePlaylist(propsValue.playlist_id as string, {
name: propsValue.name,
description: propsValue.description,
public: propsValue.public,
collaborative: propsValue.collaborative,
});
},
});

View File

@@ -0,0 +1,257 @@
import {
AuthenticationType,
HttpMessageBody,
HttpMethod,
QueryParams,
httpClient,
} from '@activepieces/pieces-common';
import { SearchRequest, SearchResult } from './models/search';
import {
DeviceListResponse,
PlaybackPauseRequest,
PlaybackPlayRequest,
PlaybackSeekRequest,
PlaybackState,
PlaybackVolumeRequest,
} from './models/playback';
import {
Playlist,
PlaylistAddItemsRequest,
PlaylistCreateRequest,
PlaylistItem,
PlaylistRemoveItemsRequest,
PlaylistReorderItemsRequest,
PlaylistUpdateRequest,
} from './models/playlist';
import { User } from './models/user';
import { Pagination, PaginationRequest } from './models/common';
function emptyValueFilter(
accessor: (key: string) => any
): (key: string) => boolean {
return (key: string) => {
const val = accessor(key);
return (
val !== null &&
val !== undefined &&
(typeof val != 'string' || val.length > 0)
);
};
}
export function prepareQuery(request?: Record<string, any>): QueryParams {
const params: QueryParams = {};
if (!request) return params;
Object.keys(request)
.filter(emptyValueFilter((k) => request[k]))
.forEach((k: string) => {
params[k] = (request as Record<string, any>)[k].toString();
});
return params;
}
export class SpotifyWebApi {
constructor(private accessToken: string) {}
async makeRequest<T extends HttpMessageBody>(
method: HttpMethod,
url: string,
query?: QueryParams,
body?: object
): Promise<T> {
const res = await httpClient.sendRequest<T>({
method,
url: 'https://api.spotify.com/v1' + url,
queryParams: query,
body,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: this.accessToken,
},
});
return res.body;
}
async search(request: SearchRequest): Promise<SearchResult> {
const res = await this.makeRequest<SearchResult>(
HttpMethod.GET,
'/search',
prepareQuery(request)
);
return res;
}
async getDevices(): Promise<DeviceListResponse> {
return await this.makeRequest<DeviceListResponse>(
HttpMethod.GET,
'/me/player/devices'
);
}
async getPlaybackState(): Promise<PlaybackState> {
return await this.makeRequest<PlaybackState>(HttpMethod.GET, '/me/player');
}
async setVolume(request: PlaybackVolumeRequest) {
await this.makeRequest(
HttpMethod.PUT,
'/me/player/volume',
prepareQuery(request)
);
}
async pause(request: PlaybackPauseRequest) {
await this.makeRequest(
HttpMethod.PUT,
'/me/player/pause',
prepareQuery(request)
);
}
async play(request: PlaybackPlayRequest) {
const query: QueryParams = {};
if (request.device_id) query.device_id = request.device_id;
request.device_id = undefined;
await this.makeRequest(HttpMethod.PUT, '/me/player/play', query, request);
}
async seek(request: PlaybackSeekRequest) {
await this.makeRequest(
HttpMethod.PUT,
'/me/player/seek',
prepareQuery(request)
);
}
async getCurrentUser(): Promise<User> {
return await this.makeRequest<User>(HttpMethod.GET, '/me');
}
async getCurrentUserPlaylists(
request?: PaginationRequest
): Promise<Pagination<Playlist>> {
return await this.makeRequest<Pagination<Playlist>>(
HttpMethod.GET,
'/me/playlists',
prepareQuery(request)
);
}
async getAllCurrentUserPlaylists(): Promise<Playlist[]> {
const playlists: Playlist[] = [];
let total = 99999;
while (playlists.length < total) {
const res = await this.getCurrentUserPlaylists({
limit: 50,
offset: playlists.length,
});
total = res.total;
res.items.forEach((item) => playlists.push(item));
}
return playlists;
}
async createPlaylist(
userId: string,
request: PlaylistCreateRequest
): Promise<Playlist> {
return await this.makeRequest<Playlist>(
HttpMethod.POST,
'/users/' + userId + '/playlists',
undefined,
request
);
}
async updatePlaylist(id: string, request: PlaylistUpdateRequest) {
await this.makeRequest(
HttpMethod.PUT,
'/playlists/' + id,
undefined,
request
);
}
async getPlaylist(id: string): Promise<Playlist> {
return await this.makeRequest<Playlist>(HttpMethod.GET, '/playlists/' + id);
}
async getPlaylistItems(
id: string,
request?: PaginationRequest
): Promise<Pagination<PlaylistItem>> {
return await this.makeRequest<Pagination<PlaylistItem>>(
HttpMethod.GET,
'/playlists/' + id + '/tracks',
prepareQuery(request)
);
}
async getAllPlaylistItems(id: string): Promise<PlaylistItem[]> {
const items: PlaylistItem[] = [];
let total = 99999;
while (items.length < total) {
const res = await this.getPlaylistItems(id, {
limit: 50,
offset: items.length,
});
total = res.total;
res.items.forEach((item) => items.push(item));
}
return items;
}
async getSavedTracks(
request?: PaginationRequest
): Promise<Pagination<PlaylistItem>> {
return await this.makeRequest<Pagination<PlaylistItem>>(
HttpMethod.GET,
'/me/tracks',
prepareQuery(request)
);
}
async getAllSavedTracks(): Promise<PlaylistItem[]> {
const items: PlaylistItem[] = [];
let total = 99999;
while (items.length < total) {
const res = await this.getSavedTracks({
limit: 50,
offset: items.length,
});
total = res.total;
res.items.forEach((item) => items.push(item));
}
return items;
}
async addItemsToPlaylist(id: string, request: PlaylistAddItemsRequest) {
await this.makeRequest(
HttpMethod.POST,
'/playlists/' + id + '/tracks',
undefined,
request
);
}
async removeItemsFromPlaylist(
id: string,
request: PlaylistRemoveItemsRequest
) {
await this.makeRequest(
HttpMethod.DELETE,
'/playlists/' + id + '/tracks',
undefined,
request
);
}
async reorderPlaylist(id: string, request: PlaylistReorderItemsRequest) {
await this.makeRequest(
HttpMethod.PUT,
'/playlists/' + id + '/tracks',
undefined,
request
);
}
}

View File

@@ -0,0 +1,104 @@
import { getAccessTokenOrThrow } from '@activepieces/pieces-common';
import {
OAuth2PropertyValue,
PieceAuth,
Property,
} from '@activepieces/pieces-framework';
import { SpotifyWebApi } from './client';
const markdownDescription = `
To obtain a client ID and client secret for Spotify, follow these simple steps:
1. Go to the [Spotify Developer Dashboard](https://developer.spotify.com/).
2. **Log in** to your Spotify account.
3. Click on the **"Create an App"** button.
4. Fill in the required information, such as the **App Name** and **App Description**.
5. Once your app is created, you will see the **client ID** and **client secret** on the app's dashboard.
6. **Copy** the client ID and client secret and **paste** them below.
`;
export const spotifyCommon = {
authentication: PieceAuth.OAuth2({
description: markdownDescription,
required: true,
authUrl: 'https://accounts.spotify.com/authorize',
tokenUrl: 'https://accounts.spotify.com/api/token',
scope: [
'user-read-playback-state',
'user-modify-playback-state',
'user-read-currently-playing',
'user-read-playback-position',
'user-read-recently-played',
'playlist-read-private',
'playlist-read-collaborative',
'playlist-modify-private',
'playlist-modify-public',
'user-library-read',
],
}),
device_id: (required = true) =>
Property.Dropdown({
auth: spotifyCommon.authentication,
displayName: 'Device',
required,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'setup authentication first',
options: [],
};
}
const client = makeClient({
auth: auth,
});
const res = await client.getDevices();
return {
disabled: false,
options: res.devices.map((device) => {
return {
label: device.name,
value: device.id,
};
}),
};
},
}),
playlist_id: (required = true) =>
Property.Dropdown({
auth: spotifyCommon.authentication,
displayName: 'Playlist',
required,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'setup authentication first',
options: [],
};
}
const client = makeClient({
auth: auth as OAuth2PropertyValue,
});
const playlists = await client.getAllCurrentUserPlaylists();
return {
disabled: false,
options: playlists.map((playlist) => {
return {
label: playlist.name,
value: playlist.id,
};
}),
};
},
}),
};
export function makeClient(propsValue: {
auth: OAuth2PropertyValue;
}): SpotifyWebApi {
const token = getAccessTokenOrThrow(propsValue.auth);
return new SpotifyWebApi(token);
}

View File

@@ -0,0 +1,5 @@
export interface Album {
id: string;
name: string;
uri: string;
}

View File

@@ -0,0 +1,7 @@
export interface Artist {
id: string;
name: string;
type: 'artist';
uri: string;
genres: string[];
}

View File

@@ -0,0 +1,23 @@
export interface HasURI {
uri: string;
}
export interface SpotifyObject {
id: string;
uri: string;
}
export interface Pagination<T> {
href: string;
limit: number;
next: string;
offset: number;
previous: string;
total: number;
items: T[];
}
export interface PaginationRequest {
limit?: number;
offset?: number;
}

View File

@@ -0,0 +1,80 @@
import { Track } from './track';
export enum RepeatState {
OFF = 'off',
TRACK = 'track',
CONTEXT = 'context',
}
export enum PlayingType {
TRACK = 'track',
EPISODE = 'episode',
AD = 'ad',
UNKNOWN = 'unknown',
}
export interface PlaybackActions {
interrupting_playback: boolean;
pausing: boolean;
resuming: boolean;
seeking: boolean;
skipping_next: boolean;
skipping_prev: boolean;
toggling_repeat_context: boolean;
toggling_shuffle: boolean;
toggling_repeat_track: boolean;
transferring_playback: boolean;
}
export interface PlaybackState {
device: Device;
timestamp: number;
progress_ms?: number;
is_playing: boolean;
shuffle_state: boolean;
repeat_state: RepeatState;
item?: Track;
current_playing_type: PlayingType;
actions: PlaybackActions;
}
export interface PlaybackVolumeRequest {
volume_percent: number;
device_id?: string;
}
export interface PlaybackPauseRequest {
device_id?: string;
}
export interface PlaybackPlayRequest {
device_id?: string;
context_uri?: string;
uris?: string[];
position_ms?: number;
}
export interface PlaybackSeekRequest {
device_id?: string;
position_ms: number;
}
export enum DeviceType {
COMPUTER = 'computer',
SMARTPHONE = 'smartphone',
SPEAKER = 'speaker',
}
export interface Device {
id: string;
is_active: boolean;
is_private_session: boolean;
is_restricted: boolean;
name: string;
type: DeviceType;
volume_percent: number;
}
export interface DeviceListResponse {
devices: Device[];
}

View File

@@ -0,0 +1,47 @@
import { HasURI } from './common';
import { Track } from './track';
import { User } from './user';
export interface PlaylistItem {
added_at: string;
added_by?: User;
is_local: boolean;
track: Track;
}
export interface Playlist {
id: string;
name: string;
type: 'playlist';
uri: string;
owner?: User;
}
export interface PlaylistCreateRequest {
name: string;
public?: boolean;
collaborative?: boolean;
description?: string;
}
export interface PlaylistAddItemsRequest {
uris: string[];
position?: number;
}
export interface PlaylistRemoveItemsRequest {
tracks: HasURI[];
}
export interface PlaylistReorderItemsRequest {
range_start: number;
range_length?: number;
insert_before: number;
}
export interface PlaylistUpdateRequest {
name?: string;
public?: boolean;
collaborative?: boolean;
description?: string;
}

View File

@@ -0,0 +1,21 @@
import { Artist } from './artist';
import { Track } from './track';
import { Album } from './album';
import { Playlist } from './playlist';
import { Pagination } from './common';
export interface SearchResult {
tracks?: Pagination<Track>;
artists?: Pagination<Artist>;
playlists?: Pagination<Playlist>;
albums?: Pagination<Album>;
}
export interface SearchRequest {
q: string;
type: string;
market?: string;
limit?: number;
offset?: number;
include_external?: string;
}

View File

@@ -0,0 +1,5 @@
export interface Track {
id: string;
name: string;
uri: string;
}

View File

@@ -0,0 +1,14 @@
export enum Product {
OPEN = 'open',
FREE = 'free',
PREMIUM = 'premium',
}
export interface User {
id: string;
email?: string;
display_name: string;
product: Product;
type: 'user';
uri: string;
}

View File

@@ -0,0 +1,3 @@
import playlistItemsChanged from './playlist-items-changed';
export default [playlistItemsChanged];

View File

@@ -0,0 +1,61 @@
import {
createTrigger,
StoreScope,
TriggerStrategy,
} from '@activepieces/pieces-framework';
import { spotifyCommon, makeClient } from '../common';
import { createHash } from 'crypto';
export default createTrigger({
name: 'playlist_items_changed',
displayName: 'Playlist Items Changed',
description: 'Triggers when the items of a playlist change',
auth: spotifyCommon.authentication,
type: TriggerStrategy.POLLING,
props: {
playlist_id: spotifyCommon.playlist_id(true),
},
sampleData: {},
onEnable: async ({ store, auth, propsValue }) => {
const client = makeClient({ auth });
const items = await client.getAllPlaylistItems(
propsValue.playlist_id as string
);
const hash = createHash('md5')
.update(items.map((item) => item.track.id).join(','))
.digest('hex');
await store.put('playlist_changed_trigger_hash', hash, StoreScope.FLOW);
},
onDisable: async ({ store, auth, propsValue }) => {
await store.delete('playlist_changed_trigger_hash', StoreScope.FLOW);
},
run: async ({ store, auth, propsValue }) => {
const oldHash = await store.get(
'playlist_changed_trigger_hash',
StoreScope.FLOW
);
const client = makeClient({ auth });
const items = await client.getAllPlaylistItems(
propsValue.playlist_id as string
);
const newHash = createHash('md5')
.update(items.map((item) => item.track.id).join(','))
.digest('hex');
if (oldHash != newHash) {
await store.put(
'playlist_changed_trigger_hash',
newHash,
StoreScope.FLOW
);
return [{ total: items.length, items }];
}
return [];
},
test: async ({ auth, propsValue }) => {
const client = makeClient({ auth });
const items = await client.getAllPlaylistItems(
propsValue.playlist_id as string
);
return [{ total: items.length, items }];
},
});

View File

@@ -0,0 +1,16 @@
{
"extends": "../../../../tsconfig.base.json",
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
}
],
"compilerOptions": {
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
}
}

View File

@@ -0,0 +1,11 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"outDir": "../../../../dist/out-tsc",
"declaration": true,
"types": ["node"]
},
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"],
"include": ["src/**/*.ts"]
}