diff --git a/.claude/commands/generate_engine.md b/.claude/commands/generate_engine.md new file mode 100644 index 0000000..ddc5f47 --- /dev/null +++ b/.claude/commands/generate_engine.md @@ -0,0 +1,292 @@ +# Generate n8n SearchApi Engine Command + +## Overview +You are an expert n8n node developer tasked with generating SearchApi engine files from OpenAPI specifications. Your goal is to create TypeScript files that properly integrate with the n8n SearchApi node framework. + +**⚠️ CRITICAL REQUIREMENT**: You MUST run lint checks on the generated file before completing this task. The file MUST pass all lint checks. + +--- + +## Task Workflow + +### 1. Input Analysis +You will receive: +- An OpenAPI 3.0 specification (YAML or JSON format) +- The target engine name/endpoint to generate +- Look for .yaml files to get the openapi specs for the engine + +### 2. Behavior Rules +- **If engine doesn't exist**: Create it from scratch +- **If engine already exists**: Act as a reviewer and ensure the code follows all guidelines + +### 3. Final Validation (MANDATORY) +1. Run `pnpm lint` to check for any linting errors +2. If there are errors, run `pnpm lintfix` to automatically fix what can be fixed +3. Manually fix any remaining errors that couldn't be auto-fixed +4. Ensure the file passes all lint checks before completing the task + +**DO NOT stop until the engine file passes all lint checks.** + +--- + +## Code Structure Requirements + +### TypeScript File Template +```typescript +import { INodeProperties, INodePropertyOptions } from 'n8n-workflow'; + +const displayOptions = { + show: { + resource: ['{engine_name}'], + }, +}; + +const resource: INodePropertyOptions = { + name: '{Human Readable Engine Name}', + value: '{engine_name}' +}; + +const properties: INodeProperties[] = [ + // Generated properties array (use collection/fixedCollection for grouping when appropriate) +]; + +export const {engine_name} = { + resource, + properties, +}; +``` + +### Property Structure Template +```typescript +{ + displayName: 'Human Readable Name', + name: 'parameter_name', + type: 'string' | 'options' | 'boolean' | 'multiOptions', + required: false, // true if the value is required, false if not + default: 'default_value', + description: 'Clear, helpful description from OpenAPI', + options: [], // For non-options types, empty array + displayOptions, + routing: { + request: { + qs: { + parameter_name: '={{$value}}', + }, + }, + }, +} +``` + +--- + +## Parameter Mapping Rules + +### Type Mappings +| OpenAPI Type | n8n Type | Notes | +|--------------|----------|-------| +| `string` | `'string'` | Basic text input | +| `integer` | `'string'` | For API compatibility | +| `number` | `'string'` | For API compatibility | +| `boolean` | `'boolean'` | Checkbox input | +| `string` with `enum` | `'options'` | Dropdown selection | +| `array` | `'multiOptions'` | If applicable | + +### Display Name Conventions +- **Priority**: Use OpenAPI `x-display-name` if available +- **Fallback**: Convert parameter names to human-readable format + +Common conversions: +- `q` → `'Query'` +- `api_key` → `'API Key'` +- `time_period` → `'Time Period'` +- `num` → `'Results Per Page'` +- `safe_search` → `'Safe Search'` +- `video_id` → `'Video ID'` +- Always use proper capitalization and spacing + +### Engine Naming Rules +- **Value**: Use snake_case (e.g., `google_search`, `bing_news`, `youtube_transcripts`) +- **Display Name**: Use Title Case (e.g., `Google Search`, `Bing News`, `YouTube Transcripts`) +- Must match the OpenAPI operationId or endpoint purpose + +--- + +## Special Parameter Handling + +### Excluded Parameters +Skip these parameters (handled by node framework): +- `api_key` +- `engine` + +### Required vs Optional Parameters +- Mark truly required parameters with `required: true` +- Use reasonable defaults for optional parameters +- Optional parameters should have sensible `default` values + +### Options/Enum Parameters +```typescript +options: [ + { name: 'Desktop', value: 'desktop' }, + { name: 'Mobile', value: 'mobile' }, + { name: 'Tablet', value: 'tablet' }, +] +``` +Requirements: +- Options must be sorted alphabetically by name +- Names must be human-readable with proper capitalization +- Values should match the API's expected format + +### Parameter Grouping +Use collections to group related parameters: + +#### Collection Type (for optional parameter groups) +```typescript +{ + displayName: 'Search Options', + name: 'searchOptions', + type: 'collection', + placeholder: 'Add Search Option', + default: {}, + options: [ + // Related parameters go here + ], + displayOptions, +} +``` + +#### Fixed Collection Type (for required parameter groups) +```typescript +{ + displayName: 'Required Settings', + name: 'requiredSettings', + type: 'fixedCollection', + default: {}, + options: [ + // Related parameters go here + ], + displayOptions, +} +``` + +Group categories examples: +- "Search Options" +- "Pagination" +- "Location Settings" +- "Date Filters" +- "Transcript Options" +- "Advanced Settings" + +--- + +## Content Guidelines + +### Descriptions +- Use the OpenAPI description as-is when clear and helpful +- Add context about parameter usage when beneficial +- Include format specifications when provided +- Maintain markdown formatting for readability +- End descriptions with periods for consistency + +### Default Values +Common defaults by type: +- Pagination: `page: '1'`, `num: '10'` +- Language: `'en'` +- Boolean flags: `false` +- Location: Appropriate regional defaults + +--- + +## Quality Checklist + +Before finalizing, verify: + +### Code Quality +- [ ] TypeScript syntax is correct +- [ ] Import statements are included +- [ ] Export structure matches the pattern +- [ ] No TypeScript errors + +### Parameter Quality +- [ ] All parameter names are human-readable +- [ ] All enum options are properly capitalized and sorted +- [ ] Default values are sensible and useful +- [ ] Descriptions are clear and informative +- [ ] Required parameters are properly marked +- [ ] Optional parameters have appropriate defaults + +### Structure Quality +- [ ] Related parameters are grouped using collections +- [ ] Group names are meaningful and descriptive +- [ ] Parameters within groups have consistent displayOptions +- [ ] No API keys or sensitive parameters are exposed + +### Linting (MANDATORY) +- [ ] Run `pnpm lint` - no errors +- [ ] Run `pnpm lintfix` if needed +- [ ] All lint errors resolved + +--- + +## Example Transformation + +### OpenAPI Input: +```yaml +device: + name: device + in: query + required: false + description: "The device type for the search" + schema: + type: string + enum: [desktop, mobile, tablet] + default: desktop + x-display-name: "Device Type" +``` + +### n8n Output: +```typescript +{ + displayName: 'Device Type', + name: 'device', + type: 'options', + default: 'desktop', + description: 'The device type for the search', + options: [ + { name: 'Desktop', value: 'desktop' }, + { name: 'Mobile', value: 'mobile' }, + { name: 'Tablet', value: 'tablet' }, + ], + displayOptions, + routing: { + request: { + qs: { + device: '={{$value}}', + }, + }, + }, +} +``` + +--- + +## Completion Criteria + +The task is **ONLY** complete when: + +1. ✅ The engine file has been generated or reviewed +2. ✅ `pnpm lint` has been run on the file +3. ✅ All linting errors have been fixed +4. ✅ The file passes all lint checks without errors + +**🛑 STOP**: Do NOT mark this task as complete until the lint check passes! + +--- + +## Additional Notes + +- Prioritize user experience with clear, intuitive parameter names +- Follow n8n's established patterns for consistency +- Test the generated code for TypeScript compatibility +- Consider parameter interdependencies and validation +- Ensure the generated engine integrates seamlessly with the SearchApi node framework +- To save tokens, when reading the yaml files, you can read everything that is inside the "parameters" key, and everything that is inside the "request" key. As it is the only thing that is needed to generate the engine. diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..0dc099c --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,47 @@ +name: Build and Test SearchAPI.io n8n node + +on: + pull_request: + branches: + - '*' + push: + branches: + - main + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + env: + CI: true + steps: + - name: Checkout + uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v3 + name: Install pnpm + with: + run_install: false + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version-file: "package.json" + cache: pnpm + registry-url: https://registry.npmjs.org + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Lint + run: pnpm lint + + - name: Build + run: pnpm build + diff --git a/nodes/SearchApi/SearchApi.node.ts b/nodes/SearchApi/SearchApi.node.ts index 971d109..ed16630 100644 --- a/nodes/SearchApi/SearchApi.node.ts +++ b/nodes/SearchApi/SearchApi.node.ts @@ -3,6 +3,12 @@ import { google } from './engines/google'; import { google_images } from './engines/google_images'; import { google_maps } from './engines/google_maps'; import { google_shopping } from './engines/google_shopping'; +import { youtube } from './engines/youtube'; +import { youtube_transcripts } from './engines/youtube_transcripts'; +import { youtube_comments } from './engines/youtube_comments'; +import { youtube_channel } from './engines/youtube_channel'; +import { youtube_video } from './engines/youtube_video'; +import { youtube_channel_videos } from './engines/youtube_channel_videos'; export class SearchApi implements INodeType { @@ -47,7 +53,12 @@ export class SearchApi implements INodeType { google_images.resource, google_maps.resource, google_shopping.resource, - + youtube.resource, + youtube_transcripts.resource, + youtube_comments.resource, + youtube_channel.resource, + youtube_video.resource, + youtube_channel_videos.resource, ], default: google.resource.value, }, @@ -77,6 +88,12 @@ export class SearchApi implements INodeType { ...google_images.properties, ...google_maps.properties, ...google_shopping.properties, + ...youtube.properties, + ...youtube_transcripts.properties, + ...youtube_comments.properties, + ...youtube_channel.properties, + ...youtube_video.properties, + ...youtube_channel_videos.properties, ], }; } diff --git a/nodes/SearchApi/engines/youtube.ts b/nodes/SearchApi/engines/youtube.ts new file mode 100644 index 0000000..0a1c201 --- /dev/null +++ b/nodes/SearchApi/engines/youtube.ts @@ -0,0 +1,286 @@ +import { INodeProperties, INodePropertyOptions } from 'n8n-workflow'; + +const displayOptions = { + show: { + resource: ['youtube'], + }, +}; + +const resource: INodePropertyOptions = { + name: 'YouTube', + value: 'youtube' +}; + +const properties: INodeProperties[] = [ + { + displayName: 'Query', + name: 'q', + type: 'string', + required: true, + default: '', + description: 'Search query to search on YouTube', + options: [], + displayOptions, + routing: { + request: { + qs: { + q: '={{$value}}', + }, + }, + }, + }, + { + displayName: 'Search Options', + name: 'searchOptions', + type: 'collection', + placeholder: 'Add Search Option', + default: {}, + options: [ + { + displayName: 'Country', + name: 'gl', + type: 'options', + default: 'US', + description: 'Country code for localized results', + options: [ + { name: 'Algeria', value: 'DZ' }, + { name: 'Argentina', value: 'AR' }, + { name: 'Australia', value: 'AU' }, + { name: 'Austria', value: 'AT' }, + { name: 'Azerbaijan', value: 'AZ' }, + { name: 'Bahrain', value: 'BH' }, + { name: 'Bangladesh', value: 'BD' }, + { name: 'Belarus', value: 'BY' }, + { name: 'Belgium', value: 'BE' }, + { name: 'Bolivia', value: 'BO' }, + { name: 'Bosnia and Herzegovina', value: 'BA' }, + { name: 'Brazil', value: 'BR' }, + { name: 'Bulgaria', value: 'BG' }, + { name: 'Cambodia', value: 'KH' }, + { name: 'Canada', value: 'CA' }, + { name: 'Chile', value: 'CL' }, + { name: 'Colombia', value: 'CO' }, + { name: 'Costa Rica', value: 'CR' }, + { name: 'Croatia', value: 'HR' }, + { name: 'Cyprus', value: 'CY' }, + { name: 'Czech Republic', value: 'CZ' }, + { name: 'Denmark', value: 'DK' }, + { name: 'Dominican Republic', value: 'DO' }, + { name: 'Ecuador', value: 'EC' }, + { name: 'Egypt', value: 'EG' }, + { name: 'El Salvador', value: 'SV' }, + { name: 'Estonia', value: 'EE' }, + { name: 'Finland', value: 'FI' }, + { name: 'France', value: 'FR' }, + { name: 'Georgia', value: 'GE' }, + { name: 'Germany', value: 'DE' }, + { name: 'Ghana', value: 'GH' }, + { name: 'Greece', value: 'GR' }, + { name: 'Guatemala', value: 'GT' }, + { name: 'Honduras', value: 'HN' }, + { name: 'Hong Kong', value: 'HK' }, + { name: 'Hungary', value: 'HU' }, + { name: 'Iceland', value: 'IS' }, + { name: 'India', value: 'IN' }, + { name: 'Indonesia', value: 'ID' }, + { name: 'Iraq', value: 'IQ' }, + { name: 'Ireland', value: 'IE' }, + { name: 'Israel', value: 'IL' }, + { name: 'Italy', value: 'IT' }, + { name: 'Jamaica', value: 'JM' }, + { name: 'Japan', value: 'JP' }, + { name: 'Jordan', value: 'JO' }, + { name: 'Kazakhstan', value: 'KZ' }, + { name: 'Kenya', value: 'KE' }, + { name: 'Kuwait', value: 'KW' }, + { name: 'Laos', value: 'LA' }, + { name: 'Latvia', value: 'LV' }, + { name: 'Lebanon', value: 'LB' }, + { name: 'Libya', value: 'LY' }, + { name: 'Liechtenstein', value: 'LI' }, + { name: 'Lithuania', value: 'LT' }, + { name: 'Luxembourg', value: 'LU' }, + { name: 'Malaysia', value: 'MY' }, + { name: 'Malta', value: 'MT' }, + { name: 'Mexico', value: 'MX' }, + { name: 'Montenegro', value: 'ME' }, + { name: 'Morocco', value: 'MA' }, + { name: 'Nepal', value: 'NP' }, + { name: 'Netherlands', value: 'NL' }, + { name: 'New Zealand', value: 'NZ' }, + { name: 'Nicaragua', value: 'NI' }, + { name: 'Nigeria', value: 'NG' }, + { name: 'North Macedonia', value: 'MK' }, + { name: 'Norway', value: 'NO' }, + { name: 'Oman', value: 'OM' }, + { name: 'Pakistan', value: 'PK' }, + { name: 'Panama', value: 'PA' }, + { name: 'Papua New Guinea', value: 'PG' }, + { name: 'Paraguay', value: 'PY' }, + { name: 'Peru', value: 'PE' }, + { name: 'Philippines', value: 'PH' }, + { name: 'Poland', value: 'PL' }, + { name: 'Portugal', value: 'PT' }, + { name: 'Puerto Rico', value: 'PR' }, + { name: 'Qatar', value: 'QA' }, + { name: 'Romania', value: 'RO' }, + { name: 'Russia', value: 'RU' }, + { name: 'Saudi Arabia', value: 'SA' }, + { name: 'Senegal', value: 'SN' }, + { name: 'Serbia', value: 'RS' }, + { name: 'Singapore', value: 'SG' }, + { name: 'Slovakia', value: 'SK' }, + { name: 'Slovenia', value: 'SI' }, + { name: 'South Africa', value: 'ZA' }, + { name: 'South Korea', value: 'KR' }, + { name: 'Spain', value: 'ES' }, + { name: 'Sri Lanka', value: 'LK' }, + { name: 'Sweden', value: 'SE' }, + { name: 'Switzerland', value: 'CH' }, + { name: 'Taiwan', value: 'TW' }, + { name: 'Tanzania', value: 'TZ' }, + { name: 'Thailand', value: 'TH' }, + { name: 'Tunisia', value: 'TN' }, + { name: 'Turkey', value: 'TR' }, + { name: 'Uganda', value: 'UG' }, + { name: 'Ukraine', value: 'UA' }, + { name: 'United Arab Emirates', value: 'AE' }, + { name: 'United Kingdom', value: 'GB' }, + { name: 'United States', value: 'US' }, + { name: 'Uruguay', value: 'UY' }, + { name: 'Venezuela', value: 'VE' }, + { name: 'Vietnam', value: 'VN' }, + { name: 'Yemen', value: 'YE' }, + { name: 'Zimbabwe', value: 'ZW' }, + ], + routing: { + request: { + qs: { + gl: '={{$value}}', + }, + }, + }, + }, + { + displayName: 'Language', + name: 'hl', + type: 'options', + default: 'en', + description: 'Interface language for search results', + options: [ + { name: 'Afrikaans', value: 'af' }, + { name: 'Albanian', value: 'sq' }, + { name: 'Amharic', value: 'am' }, + { name: 'Arabic', value: 'ar' }, + { name: 'Armenian', value: 'hy' }, + { name: 'Assamese', value: 'as' }, + { name: 'Azerbaijani', value: 'az' }, + { name: 'Basque', value: 'eu' }, + { name: 'Belarusian', value: 'be' }, + { name: 'Bengali', value: 'bn' }, + { name: 'Bosnian', value: 'bs' }, + { name: 'Bulgarian', value: 'bg' }, + { name: 'Burmese', value: 'my' }, + { name: 'Catalan', value: 'ca' }, + { name: 'Chinese (Hong Kong)', value: 'zh-hk' }, + { name: 'Chinese (Simplified)', value: 'zh-cn' }, + { name: 'Chinese (Traditional)', value: 'zh-tw' }, + { name: 'Croatian', value: 'hr' }, + { name: 'Czech', value: 'cs' }, + { name: 'Danish', value: 'da' }, + { name: 'Dutch', value: 'nl' }, + { name: 'English', value: 'en' }, + { name: 'English (India)', value: 'en-in' }, + { name: 'English (UK)', value: 'en-gb' }, + { name: 'Estonian', value: 'et' }, + { name: 'Filipino', value: 'fil' }, + { name: 'Finnish', value: 'fi' }, + { name: 'French', value: 'fr' }, + { name: 'French (Canada)', value: 'fr-ca' }, + { name: 'Galician', value: 'gl' }, + { name: 'Georgian', value: 'ka' }, + { name: 'German', value: 'de' }, + { name: 'Greek', value: 'el' }, + { name: 'Gujarati', value: 'gu' }, + { name: 'Hebrew', value: 'iw' }, + { name: 'Hindi', value: 'hi' }, + { name: 'Hungarian', value: 'hu' }, + { name: 'Icelandic', value: 'is' }, + { name: 'Indonesian', value: 'id' }, + { name: 'Italian', value: 'it' }, + { name: 'Japanese', value: 'ja' }, + { name: 'Kannada', value: 'kn' }, + { name: 'Kazakh', value: 'kk' }, + { name: 'Khmer', value: 'km' }, + { name: 'Korean', value: 'ko' }, + { name: 'Kyrgyz', value: 'ky' }, + { name: 'Lao', value: 'lo' }, + { name: 'Latvian', value: 'lv' }, + { name: 'Lithuanian', value: 'lt' }, + { name: 'Macedonian', value: 'mk' }, + { name: 'Malay', value: 'ms' }, + { name: 'Malayalam', value: 'ml' }, + { name: 'Marathi', value: 'mr' }, + { name: 'Mongolian', value: 'mn' }, + { name: 'Nepali', value: 'ne' }, + { name: 'Norwegian', value: 'no' }, + { name: 'Odia', value: 'or' }, + { name: 'Pashto', value: 'pa' }, + { name: 'Persian', value: 'fa' }, + { name: 'Polish', value: 'pl' }, + { name: 'Portuguese', value: 'pt' }, + { name: 'Portuguese (Portugal)', value: 'pt-pt' }, + { name: 'Romanian', value: 'ro' }, + { name: 'Russian', value: 'ru' }, + { name: 'Serbian', value: 'sr' }, + { name: 'Serbian (Latin)', value: 'sr-latn' }, + { name: 'Sinhala', value: 'si' }, + { name: 'Slovak', value: 'sk' }, + { name: 'Slovenian', value: 'sl' }, + { name: 'Spanish', value: 'es' }, + { name: 'Spanish (Latin America)', value: 'es-419' }, + { name: 'Spanish (US)', value: 'es-us' }, + { name: 'Swahili', value: 'sw' }, + { name: 'Swedish', value: 'sv' }, + { name: 'Tamil', value: 'ta' }, + { name: 'Telugu', value: 'te' }, + { name: 'Thai', value: 'th' }, + { name: 'Turkish', value: 'tr' }, + { name: 'Ukrainian', value: 'uk' }, + { name: 'Urdu', value: 'ur' }, + { name: 'Uzbek', value: 'uz' }, + { name: 'Vietnamese', value: 'vi' }, + { name: 'Zulu', value: 'zu' }, + ], + routing: { + request: { + qs: { + hl: '={{$value}}', + }, + }, + }, + }, + { + displayName: 'Filter Token', + name: 'sp', + type: 'string', + default: '', + description: 'Filters and pagination token for YouTube search results', + options: [], + routing: { + request: { + qs: { + sp: '={{$value}}', + }, + }, + }, + }, + ], + displayOptions, + }, +]; + +export const youtube = { + resource, + properties, +}; \ No newline at end of file diff --git a/nodes/SearchApi/engines/youtube_channel.ts b/nodes/SearchApi/engines/youtube_channel.ts new file mode 100644 index 0000000..e43c042 --- /dev/null +++ b/nodes/SearchApi/engines/youtube_channel.ts @@ -0,0 +1,262 @@ +import { INodeProperties, INodePropertyOptions } from 'n8n-workflow'; + +const displayOptions = { + show: { + resource: ['youtube_channel'], + }, +}; + +const resource: INodePropertyOptions = { + name: 'YouTube Channel', + value: 'youtube_channel', +}; + +const properties: INodeProperties[] = [ + { + displayName: 'Channel ID', + name: 'channel_id', + type: 'string', + required: true, + default: '', + description: 'YouTube channel ID or handle (e.g., "@MrBeast" or "UCX6OQ3DkcsbYNE6H8uQQuVA")', + displayOptions, + routing: { + request: { + qs: { + channel_id: '={{$value}}', + }, + }, + }, + }, + { + displayName: 'Country', + name: 'gl', + type: 'options', + default: 'US', + description: 'Country code for localized results (ISO 3166-1 alpha-2)', + options: [ + { name: 'Algeria', value: 'DZ' }, + { name: 'Argentina', value: 'AR' }, + { name: 'Australia', value: 'AU' }, + { name: 'Austria', value: 'AT' }, + { name: 'Azerbaijan', value: 'AZ' }, + { name: 'Bahrain', value: 'BH' }, + { name: 'Bangladesh', value: 'BD' }, + { name: 'Belarus', value: 'BY' }, + { name: 'Belgium', value: 'BE' }, + { name: 'Bolivia', value: 'BO' }, + { name: 'Bosnia and Herzegovina', value: 'BA' }, + { name: 'Brazil', value: 'BR' }, + { name: 'Bulgaria', value: 'BG' }, + { name: 'Cambodia', value: 'KH' }, + { name: 'Canada', value: 'CA' }, + { name: 'Chile', value: 'CL' }, + { name: 'Colombia', value: 'CO' }, + { name: 'Costa Rica', value: 'CR' }, + { name: 'Croatia', value: 'HR' }, + { name: 'Cyprus', value: 'CY' }, + { name: 'Czech Republic', value: 'CZ' }, + { name: 'Denmark', value: 'DK' }, + { name: 'Dominican Republic', value: 'DO' }, + { name: 'Ecuador', value: 'EC' }, + { name: 'Egypt', value: 'EG' }, + { name: 'El Salvador', value: 'SV' }, + { name: 'Estonia', value: 'EE' }, + { name: 'Finland', value: 'FI' }, + { name: 'France', value: 'FR' }, + { name: 'Georgia', value: 'GE' }, + { name: 'Germany', value: 'DE' }, + { name: 'Ghana', value: 'GH' }, + { name: 'Greece', value: 'GR' }, + { name: 'Guatemala', value: 'GT' }, + { name: 'Honduras', value: 'HN' }, + { name: 'Hong Kong', value: 'HK' }, + { name: 'Hungary', value: 'HU' }, + { name: 'Iceland', value: 'IS' }, + { name: 'India', value: 'IN' }, + { name: 'Indonesia', value: 'ID' }, + { name: 'Iraq', value: 'IQ' }, + { name: 'Ireland', value: 'IE' }, + { name: 'Israel', value: 'IL' }, + { name: 'Italy', value: 'IT' }, + { name: 'Jamaica', value: 'JM' }, + { name: 'Japan', value: 'JP' }, + { name: 'Jordan', value: 'JO' }, + { name: 'Kazakhstan', value: 'KZ' }, + { name: 'Kenya', value: 'KE' }, + { name: 'Kuwait', value: 'KW' }, + { name: 'Laos', value: 'LA' }, + { name: 'Latvia', value: 'LV' }, + { name: 'Lebanon', value: 'LB' }, + { name: 'Libya', value: 'LY' }, + { name: 'Liechtenstein', value: 'LI' }, + { name: 'Lithuania', value: 'LT' }, + { name: 'Luxembourg', value: 'LU' }, + { name: 'Malaysia', value: 'MY' }, + { name: 'Malta', value: 'MT' }, + { name: 'Mexico', value: 'MX' }, + { name: 'Montenegro', value: 'ME' }, + { name: 'Morocco', value: 'MA' }, + { name: 'Nepal', value: 'NP' }, + { name: 'Netherlands', value: 'NL' }, + { name: 'New Zealand', value: 'NZ' }, + { name: 'Nicaragua', value: 'NI' }, + { name: 'Nigeria', value: 'NG' }, + { name: 'North Macedonia', value: 'MK' }, + { name: 'Norway', value: 'NO' }, + { name: 'Oman', value: 'OM' }, + { name: 'Pakistan', value: 'PK' }, + { name: 'Panama', value: 'PA' }, + { name: 'Papua New Guinea', value: 'PG' }, + { name: 'Paraguay', value: 'PY' }, + { name: 'Peru', value: 'PE' }, + { name: 'Philippines', value: 'PH' }, + { name: 'Poland', value: 'PL' }, + { name: 'Portugal', value: 'PT' }, + { name: 'Puerto Rico', value: 'PR' }, + { name: 'Qatar', value: 'QA' }, + { name: 'Romania', value: 'RO' }, + { name: 'Russia', value: 'RU' }, + { name: 'Saudi Arabia', value: 'SA' }, + { name: 'Senegal', value: 'SN' }, + { name: 'Serbia', value: 'RS' }, + { name: 'Singapore', value: 'SG' }, + { name: 'Slovakia', value: 'SK' }, + { name: 'Slovenia', value: 'SI' }, + { name: 'South Africa', value: 'ZA' }, + { name: 'South Korea', value: 'KR' }, + { name: 'Spain', value: 'ES' }, + { name: 'Sri Lanka', value: 'LK' }, + { name: 'Sweden', value: 'SE' }, + { name: 'Switzerland', value: 'CH' }, + { name: 'Taiwan', value: 'TW' }, + { name: 'Tanzania', value: 'TZ' }, + { name: 'Thailand', value: 'TH' }, + { name: 'Tunisia', value: 'TN' }, + { name: 'Turkey', value: 'TR' }, + { name: 'Uganda', value: 'UG' }, + { name: 'Ukraine', value: 'UA' }, + { name: 'United Arab Emirates', value: 'AE' }, + { name: 'United Kingdom', value: 'GB' }, + { name: 'United States', value: 'US' }, + { name: 'Uruguay', value: 'UY' }, + { name: 'Venezuela', value: 'VE' }, + { name: 'Vietnam', value: 'VN' }, + { name: 'Yemen', value: 'YE' }, + { name: 'Zimbabwe', value: 'ZW' }, + ], + displayOptions, + routing: { + request: { + qs: { + gl: '={{$value}}', + }, + }, + }, + }, + { + displayName: 'Language', + name: 'hl', + type: 'options', + default: 'en', + description: 'Language code for interface language', + options: [ + { name: 'Afrikaans', value: 'af' }, + { name: 'Albanian', value: 'sq' }, + { name: 'Amharic', value: 'am' }, + { name: 'Arabic', value: 'ar' }, + { name: 'Armenian', value: 'hy' }, + { name: 'Assamese', value: 'as' }, + { name: 'Azerbaijani', value: 'az' }, + { name: 'Basque', value: 'eu' }, + { name: 'Belarusian', value: 'be' }, + { name: 'Bengali', value: 'bn' }, + { name: 'Bosnian', value: 'bs' }, + { name: 'Bulgarian', value: 'bg' }, + { name: 'Burmese', value: 'my' }, + { name: 'Catalan', value: 'ca' }, + { name: 'Chinese (Hong Kong)', value: 'zh-hk' }, + { name: 'Chinese (Simplified)', value: 'zh-cn' }, + { name: 'Chinese (Traditional)', value: 'zh-tw' }, + { name: 'Croatian', value: 'hr' }, + { name: 'Czech', value: 'cs' }, + { name: 'Danish', value: 'da' }, + { name: 'Dutch', value: 'nl' }, + { name: 'English', value: 'en' }, + { name: 'English (Great Britain)', value: 'en-gb' }, + { name: 'English (India)', value: 'en-in' }, + { name: 'Estonian', value: 'et' }, + { name: 'Filipino', value: 'fil' }, + { name: 'Finnish', value: 'fi' }, + { name: 'French', value: 'fr' }, + { name: 'French (Canada)', value: 'fr-ca' }, + { name: 'Galician', value: 'gl' }, + { name: 'Georgian', value: 'ka' }, + { name: 'German', value: 'de' }, + { name: 'Greek', value: 'el' }, + { name: 'Gujarati', value: 'gu' }, + { name: 'Hebrew', value: 'iw' }, + { name: 'Hindi', value: 'hi' }, + { name: 'Hungarian', value: 'hu' }, + { name: 'Icelandic', value: 'is' }, + { name: 'Indonesian', value: 'id' }, + { name: 'Italian', value: 'it' }, + { name: 'Japanese', value: 'ja' }, + { name: 'Kannada', value: 'kn' }, + { name: 'Kazakh', value: 'kk' }, + { name: 'Khmer', value: 'km' }, + { name: 'Korean', value: 'ko' }, + { name: 'Kyrgyz', value: 'ky' }, + { name: 'Lao', value: 'lo' }, + { name: 'Latvian', value: 'lv' }, + { name: 'Lithuanian', value: 'lt' }, + { name: 'Macedonian', value: 'mk' }, + { name: 'Malay', value: 'ms' }, + { name: 'Malayalam', value: 'ml' }, + { name: 'Marathi', value: 'mr' }, + { name: 'Mongolian', value: 'mn' }, + { name: 'Nepali', value: 'ne' }, + { name: 'Norwegian', value: 'no' }, + { name: 'Oriya', value: 'or' }, + { name: 'Persian', value: 'fa' }, + { name: 'Polish', value: 'pl' }, + { name: 'Portuguese', value: 'pt' }, + { name: 'Portuguese (Portugal)', value: 'pt-pt' }, + { name: 'Punjabi', value: 'pa' }, + { name: 'Romanian', value: 'ro' }, + { name: 'Russian', value: 'ru' }, + { name: 'Serbian', value: 'sr' }, + { name: 'Serbian (Latin)', value: 'sr-latn' }, + { name: 'Sinhala', value: 'si' }, + { name: 'Slovak', value: 'sk' }, + { name: 'Slovenian', value: 'sl' }, + { name: 'Spanish', value: 'es' }, + { name: 'Spanish (Latin America)', value: 'es-419' }, + { name: 'Spanish (United States)', value: 'es-us' }, + { name: 'Swahili', value: 'sw' }, + { name: 'Swedish', value: 'sv' }, + { name: 'Tamil', value: 'ta' }, + { name: 'Telugu', value: 'te' }, + { name: 'Thai', value: 'th' }, + { name: 'Turkish', value: 'tr' }, + { name: 'Ukrainian', value: 'uk' }, + { name: 'Urdu', value: 'ur' }, + { name: 'Uzbek', value: 'uz' }, + { name: 'Vietnamese', value: 'vi' }, + { name: 'Zulu', value: 'zu' }, + ], + displayOptions, + routing: { + request: { + qs: { + hl: '={{$value}}', + }, + }, + }, + }, +]; + +export const youtube_channel = { + resource, + properties, +}; \ No newline at end of file diff --git a/nodes/SearchApi/engines/youtube_channel_videos.ts b/nodes/SearchApi/engines/youtube_channel_videos.ts new file mode 100644 index 0000000..a961fc8 --- /dev/null +++ b/nodes/SearchApi/engines/youtube_channel_videos.ts @@ -0,0 +1,296 @@ +import { INodeProperties, INodePropertyOptions } from 'n8n-workflow'; + +const displayOptions = { + show: { + resource: ['youtube_channel_videos'], + }, +}; + +const resource: INodePropertyOptions = { + name: 'YouTube Channel Videos', + value: 'youtube_channel_videos' +}; + +const properties: INodeProperties[] = [ + { + displayName: 'Channel ID', + name: 'channel_id', + type: 'string', + required: true, + default: '', + description: 'The YouTube channel ID or handle (e.g., "@MrBeast" or "UCX6OQ3DkcsbYNE6H8uQQuVA")', + options: [], + displayOptions, + routing: { + request: { + qs: { + channel_id: '={{$value}}', + }, + }, + }, + }, + { + displayName: 'Location Settings', + name: 'locationSettings', + type: 'collection', + placeholder: 'Add Location Setting', + default: {}, + options: [ + { + displayName: 'Country', + name: 'gl', + type: 'options', + default: 'US', + description: 'Country code for localized results (ISO 3166-1 alpha-2)', + options: [ + { name: 'Algeria', value: 'DZ' }, + { name: 'Argentina', value: 'AR' }, + { name: 'Australia', value: 'AU' }, + { name: 'Austria', value: 'AT' }, + { name: 'Azerbaijan', value: 'AZ' }, + { name: 'Bahrain', value: 'BH' }, + { name: 'Bangladesh', value: 'BD' }, + { name: 'Belarus', value: 'BY' }, + { name: 'Belgium', value: 'BE' }, + { name: 'Bolivia', value: 'BO' }, + { name: 'Bosnia and Herzegovina', value: 'BA' }, + { name: 'Brazil', value: 'BR' }, + { name: 'Bulgaria', value: 'BG' }, + { name: 'Cambodia', value: 'KH' }, + { name: 'Canada', value: 'CA' }, + { name: 'Chile', value: 'CL' }, + { name: 'Colombia', value: 'CO' }, + { name: 'Costa Rica', value: 'CR' }, + { name: 'Croatia', value: 'HR' }, + { name: 'Cyprus', value: 'CY' }, + { name: 'Czech Republic', value: 'CZ' }, + { name: 'Denmark', value: 'DK' }, + { name: 'Dominican Republic', value: 'DO' }, + { name: 'Ecuador', value: 'EC' }, + { name: 'Egypt', value: 'EG' }, + { name: 'El Salvador', value: 'SV' }, + { name: 'Estonia', value: 'EE' }, + { name: 'Finland', value: 'FI' }, + { name: 'France', value: 'FR' }, + { name: 'Georgia', value: 'GE' }, + { name: 'Germany', value: 'DE' }, + { name: 'Ghana', value: 'GH' }, + { name: 'Greece', value: 'GR' }, + { name: 'Guatemala', value: 'GT' }, + { name: 'Honduras', value: 'HN' }, + { name: 'Hong Kong', value: 'HK' }, + { name: 'Hungary', value: 'HU' }, + { name: 'Iceland', value: 'IS' }, + { name: 'India', value: 'IN' }, + { name: 'Indonesia', value: 'ID' }, + { name: 'Iraq', value: 'IQ' }, + { name: 'Ireland', value: 'IE' }, + { name: 'Israel', value: 'IL' }, + { name: 'Italy', value: 'IT' }, + { name: 'Jamaica', value: 'JM' }, + { name: 'Japan', value: 'JP' }, + { name: 'Jordan', value: 'JO' }, + { name: 'Kazakhstan', value: 'KZ' }, + { name: 'Kenya', value: 'KE' }, + { name: 'Kuwait', value: 'KW' }, + { name: 'Laos', value: 'LA' }, + { name: 'Latvia', value: 'LV' }, + { name: 'Lebanon', value: 'LB' }, + { name: 'Libya', value: 'LY' }, + { name: 'Liechtenstein', value: 'LI' }, + { name: 'Lithuania', value: 'LT' }, + { name: 'Luxembourg', value: 'LU' }, + { name: 'Malaysia', value: 'MY' }, + { name: 'Malta', value: 'MT' }, + { name: 'Mexico', value: 'MX' }, + { name: 'Montenegro', value: 'ME' }, + { name: 'Morocco', value: 'MA' }, + { name: 'Nepal', value: 'NP' }, + { name: 'Netherlands', value: 'NL' }, + { name: 'New Zealand', value: 'NZ' }, + { name: 'Nicaragua', value: 'NI' }, + { name: 'Nigeria', value: 'NG' }, + { name: 'North Macedonia', value: 'MK' }, + { name: 'Norway', value: 'NO' }, + { name: 'Oman', value: 'OM' }, + { name: 'Pakistan', value: 'PK' }, + { name: 'Panama', value: 'PA' }, + { name: 'Papua New Guinea', value: 'PG' }, + { name: 'Paraguay', value: 'PY' }, + { name: 'Peru', value: 'PE' }, + { name: 'Philippines', value: 'PH' }, + { name: 'Poland', value: 'PL' }, + { name: 'Portugal', value: 'PT' }, + { name: 'Puerto Rico', value: 'PR' }, + { name: 'Qatar', value: 'QA' }, + { name: 'Romania', value: 'RO' }, + { name: 'Russia', value: 'RU' }, + { name: 'Saudi Arabia', value: 'SA' }, + { name: 'Senegal', value: 'SN' }, + { name: 'Serbia', value: 'RS' }, + { name: 'Singapore', value: 'SG' }, + { name: 'Slovakia', value: 'SK' }, + { name: 'Slovenia', value: 'SI' }, + { name: 'South Africa', value: 'ZA' }, + { name: 'South Korea', value: 'KR' }, + { name: 'Spain', value: 'ES' }, + { name: 'Sri Lanka', value: 'LK' }, + { name: 'Sweden', value: 'SE' }, + { name: 'Switzerland', value: 'CH' }, + { name: 'Taiwan', value: 'TW' }, + { name: 'Tanzania', value: 'TZ' }, + { name: 'Thailand', value: 'TH' }, + { name: 'Tunisia', value: 'TN' }, + { name: 'Turkey', value: 'TR' }, + { name: 'Uganda', value: 'UG' }, + { name: 'Ukraine', value: 'UA' }, + { name: 'United Arab Emirates', value: 'AE' }, + { name: 'United Kingdom', value: 'GB' }, + { name: 'United States', value: 'US' }, + { name: 'Uruguay', value: 'UY' }, + { name: 'Venezuela', value: 'VE' }, + { name: 'Vietnam', value: 'VN' }, + { name: 'Yemen', value: 'YE' }, + { name: 'Zimbabwe', value: 'ZW' }, + ], + routing: { + request: { + qs: { + gl: '={{$value}}', + }, + }, + }, + }, + { + displayName: 'Language', + name: 'hl', + type: 'options', + default: 'en', + description: 'Language code for the interface language', + options: [ + { name: 'Afrikaans', value: 'af' }, + { name: 'Albanian', value: 'sq' }, + { name: 'Amharic', value: 'am' }, + { name: 'Arabic', value: 'ar' }, + { name: 'Armenian', value: 'hy' }, + { name: 'Assamese', value: 'as' }, + { name: 'Azerbaijani', value: 'az' }, + { name: 'Basque', value: 'eu' }, + { name: 'Belarusian', value: 'be' }, + { name: 'Bengali', value: 'bn' }, + { name: 'Bosnian', value: 'bs' }, + { name: 'Bulgarian', value: 'bg' }, + { name: 'Burmese', value: 'my' }, + { name: 'Catalan', value: 'ca' }, + { name: 'Chinese (Hong Kong)', value: 'zh-hk' }, + { name: 'Chinese (Simplified)', value: 'zh-cn' }, + { name: 'Chinese (Traditional)', value: 'zh-tw' }, + { name: 'Croatian', value: 'hr' }, + { name: 'Czech', value: 'cs' }, + { name: 'Danish', value: 'da' }, + { name: 'Dutch', value: 'nl' }, + { name: 'English', value: 'en' }, + { name: 'English (Great Britain)', value: 'en-gb' }, + { name: 'English (India)', value: 'en-in' }, + { name: 'Estonian', value: 'et' }, + { name: 'Filipino', value: 'fil' }, + { name: 'Finnish', value: 'fi' }, + { name: 'French', value: 'fr' }, + { name: 'French (Canada)', value: 'fr-ca' }, + { name: 'Galician', value: 'gl' }, + { name: 'Georgian', value: 'ka' }, + { name: 'German', value: 'de' }, + { name: 'Greek', value: 'el' }, + { name: 'Gujarati', value: 'gu' }, + { name: 'Hebrew', value: 'iw' }, + { name: 'Hindi', value: 'hi' }, + { name: 'Hungarian', value: 'hu' }, + { name: 'Icelandic', value: 'is' }, + { name: 'Indonesian', value: 'id' }, + { name: 'Italian', value: 'it' }, + { name: 'Japanese', value: 'ja' }, + { name: 'Kannada', value: 'kn' }, + { name: 'Kazakh', value: 'kk' }, + { name: 'Khmer', value: 'km' }, + { name: 'Korean', value: 'ko' }, + { name: 'Kyrgyz', value: 'ky' }, + { name: 'Lao', value: 'lo' }, + { name: 'Latvian', value: 'lv' }, + { name: 'Lithuanian', value: 'lt' }, + { name: 'Macedonian', value: 'mk' }, + { name: 'Malay', value: 'ms' }, + { name: 'Malayalam', value: 'ml' }, + { name: 'Marathi', value: 'mr' }, + { name: 'Mongolian', value: 'mn' }, + { name: 'Nepali', value: 'ne' }, + { name: 'Norwegian', value: 'no' }, + { name: 'Oriya', value: 'or' }, + { name: 'Persian', value: 'fa' }, + { name: 'Polish', value: 'pl' }, + { name: 'Portuguese', value: 'pt' }, + { name: 'Portuguese (Portugal)', value: 'pt-pt' }, + { name: 'Punjabi', value: 'pa' }, + { name: 'Romanian', value: 'ro' }, + { name: 'Russian', value: 'ru' }, + { name: 'Serbian', value: 'sr' }, + { name: 'Serbian (Latin)', value: 'sr-latn' }, + { name: 'Sinhala', value: 'si' }, + { name: 'Slovak', value: 'sk' }, + { name: 'Slovenian', value: 'sl' }, + { name: 'Spanish', value: 'es' }, + { name: 'Spanish (Latin America)', value: 'es-419' }, + { name: 'Spanish (United States)', value: 'es-us' }, + { name: 'Swahili', value: 'sw' }, + { name: 'Swedish', value: 'sv' }, + { name: 'Tamil', value: 'ta' }, + { name: 'Telugu', value: 'te' }, + { name: 'Thai', value: 'th' }, + { name: 'Turkish', value: 'tr' }, + { name: 'Ukrainian', value: 'uk' }, + { name: 'Urdu', value: 'ur' }, + { name: 'Uzbek', value: 'uz' }, + { name: 'Vietnamese', value: 'vi' }, + { name: 'Zulu', value: 'zu' }, + ], + routing: { + request: { + qs: { + hl: '={{$value}}', + }, + }, + }, + }, + ], + displayOptions, + }, + { + displayName: 'Pagination', + name: 'pagination', + type: 'collection', + placeholder: 'Add Pagination', + default: {}, + options: [ + { + displayName: 'Next Page Token', + name: 'next_page_token', + type: 'string', + typeOptions: { password: true }, + default: '', + description: 'Token for pagination to retrieve the next page of results', + routing: { + request: { + qs: { + next_page_token: '={{$value}}', + }, + }, + }, + }, + ], + displayOptions, + }, +]; + +export const youtube_channel_videos = { + resource, + properties, +}; diff --git a/nodes/SearchApi/engines/youtube_comments.ts b/nodes/SearchApi/engines/youtube_comments.ts new file mode 100644 index 0000000..173ab15 --- /dev/null +++ b/nodes/SearchApi/engines/youtube_comments.ts @@ -0,0 +1,297 @@ +import { INodeProperties, INodePropertyOptions } from 'n8n-workflow'; + +const displayOptions = { + show: { + resource: ['youtube_comments'], + }, +}; + +const resource: INodePropertyOptions = { + name: 'YouTube Comments', + value: 'youtube_comments' +}; + +const properties: INodeProperties[] = [ + { + displayName: 'Video ID', + name: 'video_id', + type: 'string', + required: true, + default: '', + description: 'YouTube video ID to retrieve comments from', + options: [], + displayOptions, + routing: { + request: { + qs: { + video_id: '={{$value}}', + }, + }, + }, + }, + { + displayName: 'Localization Settings', + name: 'localizationSettings', + type: 'collection', + placeholder: 'Add Localization Setting', + default: {}, + options: [ + { + displayName: 'Country', + name: 'gl', + type: 'options', + default: 'US', + description: 'Country code (ISO 3166-1 alpha-2) for localizing results', + options: [ + { name: 'Algeria', value: 'DZ' }, + { name: 'Argentina', value: 'AR' }, + { name: 'Australia', value: 'AU' }, + { name: 'Austria', value: 'AT' }, + { name: 'Azerbaijan', value: 'AZ' }, + { name: 'Bahrain', value: 'BH' }, + { name: 'Bangladesh', value: 'BD' }, + { name: 'Belarus', value: 'BY' }, + { name: 'Belgium', value: 'BE' }, + { name: 'Bolivia', value: 'BO' }, + { name: 'Bosnia and Herzegovina', value: 'BA' }, + { name: 'Brazil', value: 'BR' }, + { name: 'Bulgaria', value: 'BG' }, + { name: 'Cambodia', value: 'KH' }, + { name: 'Canada', value: 'CA' }, + { name: 'Chile', value: 'CL' }, + { name: 'Colombia', value: 'CO' }, + { name: 'Costa Rica', value: 'CR' }, + { name: 'Croatia', value: 'HR' }, + { name: 'Cyprus', value: 'CY' }, + { name: 'Czech Republic', value: 'CZ' }, + { name: 'Denmark', value: 'DK' }, + { name: 'Dominican Republic', value: 'DO' }, + { name: 'Ecuador', value: 'EC' }, + { name: 'Egypt', value: 'EG' }, + { name: 'El Salvador', value: 'SV' }, + { name: 'Estonia', value: 'EE' }, + { name: 'Finland', value: 'FI' }, + { name: 'France', value: 'FR' }, + { name: 'Georgia', value: 'GE' }, + { name: 'Germany', value: 'DE' }, + { name: 'Ghana', value: 'GH' }, + { name: 'Greece', value: 'GR' }, + { name: 'Guatemala', value: 'GT' }, + { name: 'Honduras', value: 'HN' }, + { name: 'Hong Kong', value: 'HK' }, + { name: 'Hungary', value: 'HU' }, + { name: 'Iceland', value: 'IS' }, + { name: 'India', value: 'IN' }, + { name: 'Indonesia', value: 'ID' }, + { name: 'Iraq', value: 'IQ' }, + { name: 'Ireland', value: 'IE' }, + { name: 'Israel', value: 'IL' }, + { name: 'Italy', value: 'IT' }, + { name: 'Jamaica', value: 'JM' }, + { name: 'Japan', value: 'JP' }, + { name: 'Jordan', value: 'JO' }, + { name: 'Kazakhstan', value: 'KZ' }, + { name: 'Kenya', value: 'KE' }, + { name: 'Kuwait', value: 'KW' }, + { name: 'Laos', value: 'LA' }, + { name: 'Latvia', value: 'LV' }, + { name: 'Lebanon', value: 'LB' }, + { name: 'Libya', value: 'LY' }, + { name: 'Liechtenstein', value: 'LI' }, + { name: 'Lithuania', value: 'LT' }, + { name: 'Luxembourg', value: 'LU' }, + { name: 'Malaysia', value: 'MY' }, + { name: 'Malta', value: 'MT' }, + { name: 'Mexico', value: 'MX' }, + { name: 'Montenegro', value: 'ME' }, + { name: 'Morocco', value: 'MA' }, + { name: 'Nepal', value: 'NP' }, + { name: 'Netherlands', value: 'NL' }, + { name: 'New Zealand', value: 'NZ' }, + { name: 'Nicaragua', value: 'NI' }, + { name: 'Nigeria', value: 'NG' }, + { name: 'North Macedonia', value: 'MK' }, + { name: 'Norway', value: 'NO' }, + { name: 'Oman', value: 'OM' }, + { name: 'Pakistan', value: 'PK' }, + { name: 'Panama', value: 'PA' }, + { name: 'Papua New Guinea', value: 'PG' }, + { name: 'Paraguay', value: 'PY' }, + { name: 'Peru', value: 'PE' }, + { name: 'Philippines', value: 'PH' }, + { name: 'Poland', value: 'PL' }, + { name: 'Portugal', value: 'PT' }, + { name: 'Puerto Rico', value: 'PR' }, + { name: 'Qatar', value: 'QA' }, + { name: 'Romania', value: 'RO' }, + { name: 'Russia', value: 'RU' }, + { name: 'Saudi Arabia', value: 'SA' }, + { name: 'Senegal', value: 'SN' }, + { name: 'Serbia', value: 'RS' }, + { name: 'Singapore', value: 'SG' }, + { name: 'Slovakia', value: 'SK' }, + { name: 'Slovenia', value: 'SI' }, + { name: 'South Africa', value: 'ZA' }, + { name: 'South Korea', value: 'KR' }, + { name: 'Spain', value: 'ES' }, + { name: 'Sri Lanka', value: 'LK' }, + { name: 'Sweden', value: 'SE' }, + { name: 'Switzerland', value: 'CH' }, + { name: 'Taiwan', value: 'TW' }, + { name: 'Tanzania', value: 'TZ' }, + { name: 'Thailand', value: 'TH' }, + { name: 'Tunisia', value: 'TN' }, + { name: 'Turkey', value: 'TR' }, + { name: 'Uganda', value: 'UG' }, + { name: 'Ukraine', value: 'UA' }, + { name: 'United Arab Emirates', value: 'AE' }, + { name: 'United Kingdom', value: 'GB' }, + { name: 'United States', value: 'US' }, + { name: 'Uruguay', value: 'UY' }, + { name: 'Venezuela', value: 'VE' }, + { name: 'Vietnam', value: 'VN' }, + { name: 'Yemen', value: 'YE' }, + { name: 'Zimbabwe', value: 'ZW' }, + ], + routing: { + request: { + qs: { + gl: '={{$value}}', + }, + }, + }, + }, + { + displayName: 'Language', + name: 'hl', + type: 'options', + default: 'en', + description: 'Language code for the user interface', + options: [ + { name: 'Afrikaans', value: 'af' }, + { name: 'Albanian', value: 'sq' }, + { name: 'Amharic', value: 'am' }, + { name: 'Arabic', value: 'ar' }, + { name: 'Armenian', value: 'hy' }, + { name: 'Assamese', value: 'as' }, + { name: 'Azerbaijani', value: 'az' }, + { name: 'Basque', value: 'eu' }, + { name: 'Belarusian', value: 'be' }, + { name: 'Bengali', value: 'bn' }, + { name: 'Bosnian', value: 'bs' }, + { name: 'Bulgarian', value: 'bg' }, + { name: 'Burmese', value: 'my' }, + { name: 'Catalan', value: 'ca' }, + { name: 'Chinese (Hong Kong)', value: 'zh-hk' }, + { name: 'Chinese (Simplified)', value: 'zh-cn' }, + { name: 'Chinese (Traditional)', value: 'zh-tw' }, + { name: 'Croatian', value: 'hr' }, + { name: 'Czech', value: 'cs' }, + { name: 'Danish', value: 'da' }, + { name: 'Dutch', value: 'nl' }, + { name: 'English', value: 'en' }, + { name: 'English (Australia)', value: 'en-gb' }, + { name: 'English (India)', value: 'en-in' }, + { name: 'Estonian', value: 'et' }, + { name: 'Filipino', value: 'fil' }, + { name: 'Finnish', value: 'fi' }, + { name: 'French', value: 'fr' }, + { name: 'French (Canada)', value: 'fr-ca' }, + { name: 'Galician', value: 'gl' }, + { name: 'Georgian', value: 'ka' }, + { name: 'German', value: 'de' }, + { name: 'Greek', value: 'el' }, + { name: 'Gujarati', value: 'gu' }, + { name: 'Hebrew', value: 'iw' }, + { name: 'Hindi', value: 'hi' }, + { name: 'Hungarian', value: 'hu' }, + { name: 'Icelandic', value: 'is' }, + { name: 'Indonesian', value: 'id' }, + { name: 'Italian', value: 'it' }, + { name: 'Japanese', value: 'ja' }, + { name: 'Kannada', value: 'kn' }, + { name: 'Kazakh', value: 'kk' }, + { name: 'Khmer', value: 'km' }, + { name: 'Korean', value: 'ko' }, + { name: 'Kyrgyz', value: 'ky' }, + { name: 'Lao', value: 'lo' }, + { name: 'Latvian', value: 'lv' }, + { name: 'Lithuanian', value: 'lt' }, + { name: 'Macedonian', value: 'mk' }, + { name: 'Malay', value: 'ms' }, + { name: 'Malayalam', value: 'ml' }, + { name: 'Marathi', value: 'mr' }, + { name: 'Mongolian', value: 'mn' }, + { name: 'Nepali', value: 'ne' }, + { name: 'Norwegian', value: 'no' }, + { name: 'Odia', value: 'or' }, + { name: 'Persian', value: 'fa' }, + { name: 'Polish', value: 'pl' }, + { name: 'Portuguese', value: 'pt' }, + { name: 'Portuguese (Portugal)', value: 'pt-pt' }, + { name: 'Punjabi', value: 'pa' }, + { name: 'Romanian', value: 'ro' }, + { name: 'Russian', value: 'ru' }, + { name: 'Serbian', value: 'sr' }, + { name: 'Serbian (Latin)', value: 'sr-latn' }, + { name: 'Sinhala', value: 'si' }, + { name: 'Slovak', value: 'sk' }, + { name: 'Slovenian', value: 'sl' }, + { name: 'Spanish', value: 'es' }, + { name: 'Spanish (Latin America)', value: 'es-419' }, + { name: 'Spanish (United States)', value: 'es-us' }, + { name: 'Swahili', value: 'sw' }, + { name: 'Swedish', value: 'sv' }, + { name: 'Tamil', value: 'ta' }, + { name: 'Telugu', value: 'te' }, + { name: 'Thai', value: 'th' }, + { name: 'Turkish', value: 'tr' }, + { name: 'Ukrainian', value: 'uk' }, + { name: 'Urdu', value: 'ur' }, + { name: 'Uzbek', value: 'uz' }, + { name: 'Vietnamese', value: 'vi' }, + { name: 'Zulu', value: 'zu' }, + ], + routing: { + request: { + qs: { + hl: '={{$value}}', + }, + }, + }, + }, + ], + displayOptions, + }, + { + displayName: 'Pagination', + name: 'pagination', + type: 'collection', + placeholder: 'Add Pagination', + default: {}, + options: [ + { + displayName: 'Next Page Token', + name: 'next_page_token', + type: 'string', + typeOptions: { password: true }, + default: '', + description: 'Token for retrieving the next page of comments or replies', + options: [], + routing: { + request: { + qs: { + next_page_token: '={{$value}}', + }, + }, + }, + }, + ], + displayOptions, + }, +]; + +export const youtube_comments = { + resource, + properties, +}; \ No newline at end of file diff --git a/nodes/SearchApi/engines/youtube_transcripts.ts b/nodes/SearchApi/engines/youtube_transcripts.ts new file mode 100644 index 0000000..9aeb6f4 --- /dev/null +++ b/nodes/SearchApi/engines/youtube_transcripts.ts @@ -0,0 +1,80 @@ +import { INodeProperties, INodePropertyOptions } from 'n8n-workflow'; + +const displayOptions = { + show: { + resource: ['youtube_transcripts'], + }, +}; + +const resource: INodePropertyOptions = { + name: 'YouTube Transcripts', + value: 'youtube_transcripts' +}; + +const properties: INodeProperties[] = [ + { + displayName: 'Video ID', + name: 'video_id', + type: 'string', + required: true, + default: '', + description: 'YouTube video ID or URL. Accepts direct video IDs, watch URLs, or share links.', + options: [], + displayOptions, + routing: { + request: { + qs: { + video_id: '={{$value}}', + }, + }, + }, + }, + { + displayName: 'Transcript Options', + name: 'transcriptOptions', + type: 'collection', + placeholder: 'Add Transcript Option', + default: {}, + options: [ + { + displayName: 'Language', + name: 'lang', + type: 'string', + default: 'en', + description: 'Language code for the transcript', + options: [], + routing: { + request: { + qs: { + lang: '={{$value}}', + }, + }, + }, + }, + { + displayName: 'Transcript Type', + name: 'transcript_type', + type: 'options', + default: 'auto', + description: 'Type of transcript to retrieve', + options: [ + { name: 'Auto', value: 'auto' }, + { name: 'Manual', value: 'manual' }, + ], + routing: { + request: { + qs: { + transcript_type: '={{$value}}', + }, + }, + }, + }, + ], + displayOptions, + }, +]; + +export const youtube_transcripts = { + resource, + properties, +}; \ No newline at end of file diff --git a/nodes/SearchApi/engines/youtube_video.ts b/nodes/SearchApi/engines/youtube_video.ts new file mode 100644 index 0000000..3ad4b52 --- /dev/null +++ b/nodes/SearchApi/engines/youtube_video.ts @@ -0,0 +1,271 @@ +import { INodeProperties, INodePropertyOptions } from 'n8n-workflow'; + +const displayOptions = { + show: { + resource: ['youtube_video'], + }, +}; + +const resource: INodePropertyOptions = { + name: 'YouTube Video', + value: 'youtube_video' +}; + +const properties: INodeProperties[] = [ + { + displayName: 'Video ID', + name: 'video_id', + type: 'string', + required: true, + default: '', + description: 'The YouTube video ID to retrieve details for', + options: [], + displayOptions, + routing: { + request: { + qs: { + video_id: '={{$value}}', + }, + }, + }, + }, + { + displayName: 'Location Settings', + name: 'locationSettings', + type: 'collection', + placeholder: 'Add Location Setting', + default: {}, + options: [ + { + displayName: 'Country', + name: 'gl', + type: 'options', + default: 'US', + description: 'Country code (ISO 3166-1 alpha-2 format)', + options: [ + { name: 'Algeria', value: 'DZ' }, + { name: 'Argentina', value: 'AR' }, + { name: 'Australia', value: 'AU' }, + { name: 'Austria', value: 'AT' }, + { name: 'Azerbaijan', value: 'AZ' }, + { name: 'Bahrain', value: 'BH' }, + { name: 'Bangladesh', value: 'BD' }, + { name: 'Belarus', value: 'BY' }, + { name: 'Belgium', value: 'BE' }, + { name: 'Bolivia', value: 'BO' }, + { name: 'Bosnia and Herzegovina', value: 'BA' }, + { name: 'Brazil', value: 'BR' }, + { name: 'Bulgaria', value: 'BG' }, + { name: 'Cambodia', value: 'KH' }, + { name: 'Canada', value: 'CA' }, + { name: 'Chile', value: 'CL' }, + { name: 'Colombia', value: 'CO' }, + { name: 'Costa Rica', value: 'CR' }, + { name: 'Croatia', value: 'HR' }, + { name: 'Cyprus', value: 'CY' }, + { name: 'Czech Republic', value: 'CZ' }, + { name: 'Denmark', value: 'DK' }, + { name: 'Dominican Republic', value: 'DO' }, + { name: 'Ecuador', value: 'EC' }, + { name: 'Egypt', value: 'EG' }, + { name: 'El Salvador', value: 'SV' }, + { name: 'Estonia', value: 'EE' }, + { name: 'Finland', value: 'FI' }, + { name: 'France', value: 'FR' }, + { name: 'Georgia', value: 'GE' }, + { name: 'Germany', value: 'DE' }, + { name: 'Ghana', value: 'GH' }, + { name: 'Greece', value: 'GR' }, + { name: 'Guatemala', value: 'GT' }, + { name: 'Honduras', value: 'HN' }, + { name: 'Hong Kong', value: 'HK' }, + { name: 'Hungary', value: 'HU' }, + { name: 'Iceland', value: 'IS' }, + { name: 'India', value: 'IN' }, + { name: 'Indonesia', value: 'ID' }, + { name: 'Iraq', value: 'IQ' }, + { name: 'Ireland', value: 'IE' }, + { name: 'Israel', value: 'IL' }, + { name: 'Italy', value: 'IT' }, + { name: 'Jamaica', value: 'JM' }, + { name: 'Japan', value: 'JP' }, + { name: 'Jordan', value: 'JO' }, + { name: 'Kazakhstan', value: 'KZ' }, + { name: 'Kenya', value: 'KE' }, + { name: 'Kuwait', value: 'KW' }, + { name: 'Laos', value: 'LA' }, + { name: 'Latvia', value: 'LV' }, + { name: 'Lebanon', value: 'LB' }, + { name: 'Libya', value: 'LY' }, + { name: 'Liechtenstein', value: 'LI' }, + { name: 'Lithuania', value: 'LT' }, + { name: 'Luxembourg', value: 'LU' }, + { name: 'Malaysia', value: 'MY' }, + { name: 'Malta', value: 'MT' }, + { name: 'Mexico', value: 'MX' }, + { name: 'Montenegro', value: 'ME' }, + { name: 'Morocco', value: 'MA' }, + { name: 'Nepal', value: 'NP' }, + { name: 'Netherlands', value: 'NL' }, + { name: 'New Zealand', value: 'NZ' }, + { name: 'Nicaragua', value: 'NI' }, + { name: 'Nigeria', value: 'NG' }, + { name: 'North Macedonia', value: 'MK' }, + { name: 'Norway', value: 'NO' }, + { name: 'Oman', value: 'OM' }, + { name: 'Pakistan', value: 'PK' }, + { name: 'Panama', value: 'PA' }, + { name: 'Papua New Guinea', value: 'PG' }, + { name: 'Paraguay', value: 'PY' }, + { name: 'Peru', value: 'PE' }, + { name: 'Philippines', value: 'PH' }, + { name: 'Poland', value: 'PL' }, + { name: 'Portugal', value: 'PT' }, + { name: 'Puerto Rico', value: 'PR' }, + { name: 'Qatar', value: 'QA' }, + { name: 'Romania', value: 'RO' }, + { name: 'Russia', value: 'RU' }, + { name: 'Saudi Arabia', value: 'SA' }, + { name: 'Senegal', value: 'SN' }, + { name: 'Serbia', value: 'RS' }, + { name: 'Singapore', value: 'SG' }, + { name: 'Slovakia', value: 'SK' }, + { name: 'Slovenia', value: 'SI' }, + { name: 'South Africa', value: 'ZA' }, + { name: 'South Korea', value: 'KR' }, + { name: 'Spain', value: 'ES' }, + { name: 'Sri Lanka', value: 'LK' }, + { name: 'Sweden', value: 'SE' }, + { name: 'Switzerland', value: 'CH' }, + { name: 'Taiwan', value: 'TW' }, + { name: 'Tanzania', value: 'TZ' }, + { name: 'Thailand', value: 'TH' }, + { name: 'Tunisia', value: 'TN' }, + { name: 'Turkey', value: 'TR' }, + { name: 'Uganda', value: 'UG' }, + { name: 'Ukraine', value: 'UA' }, + { name: 'United Arab Emirates', value: 'AE' }, + { name: 'United Kingdom', value: 'GB' }, + { name: 'United States', value: 'US' }, + { name: 'Uruguay', value: 'UY' }, + { name: 'Venezuela', value: 'VE' }, + { name: 'Vietnam', value: 'VN' }, + { name: 'Yemen', value: 'YE' }, + { name: 'Zimbabwe', value: 'ZW' }, + ], + routing: { + request: { + qs: { + gl: '={{$value}}', + }, + }, + }, + }, + { + displayName: 'Language', + name: 'hl', + type: 'options', + default: 'en', + description: 'Language code for the interface', + options: [ + { name: 'Afrikaans', value: 'af' }, + { name: 'Albanian', value: 'sq' }, + { name: 'Amharic', value: 'am' }, + { name: 'Arabic', value: 'ar' }, + { name: 'Armenian', value: 'hy' }, + { name: 'Assamese', value: 'as' }, + { name: 'Azerbaijani', value: 'az' }, + { name: 'Basque', value: 'eu' }, + { name: 'Belarusian', value: 'be' }, + { name: 'Bengali', value: 'bn' }, + { name: 'Bosnian', value: 'bs' }, + { name: 'Bulgarian', value: 'bg' }, + { name: 'Burmese', value: 'my' }, + { name: 'Catalan', value: 'ca' }, + { name: 'Chinese (Hong Kong)', value: 'zh-hk' }, + { name: 'Chinese (Simplified)', value: 'zh-cn' }, + { name: 'Chinese (Traditional)', value: 'zh-tw' }, + { name: 'Croatian', value: 'hr' }, + { name: 'Czech', value: 'cs' }, + { name: 'Danish', value: 'da' }, + { name: 'Dutch', value: 'nl' }, + { name: 'English', value: 'en' }, + { name: 'English (India)', value: 'en-in' }, + { name: 'English (UK)', value: 'en-gb' }, + { name: 'Estonian', value: 'et' }, + { name: 'Filipino', value: 'fil' }, + { name: 'Finnish', value: 'fi' }, + { name: 'French', value: 'fr' }, + { name: 'French (Canada)', value: 'fr-ca' }, + { name: 'Galician', value: 'gl' }, + { name: 'Georgian', value: 'ka' }, + { name: 'German', value: 'de' }, + { name: 'Greek', value: 'el' }, + { name: 'Gujarati', value: 'gu' }, + { name: 'Hebrew', value: 'iw' }, + { name: 'Hindi', value: 'hi' }, + { name: 'Hungarian', value: 'hu' }, + { name: 'Icelandic', value: 'is' }, + { name: 'Indonesian', value: 'id' }, + { name: 'Italian', value: 'it' }, + { name: 'Japanese', value: 'ja' }, + { name: 'Kannada', value: 'kn' }, + { name: 'Kazakh', value: 'kk' }, + { name: 'Khmer', value: 'km' }, + { name: 'Korean', value: 'ko' }, + { name: 'Kyrgyz', value: 'ky' }, + { name: 'Lao', value: 'lo' }, + { name: 'Latvian', value: 'lv' }, + { name: 'Lithuanian', value: 'lt' }, + { name: 'Macedonian', value: 'mk' }, + { name: 'Malay', value: 'ms' }, + { name: 'Malayalam', value: 'ml' }, + { name: 'Marathi', value: 'mr' }, + { name: 'Mongolian', value: 'mn' }, + { name: 'Nepali', value: 'ne' }, + { name: 'Norwegian', value: 'no' }, + { name: 'Odia', value: 'or' }, + { name: 'Persian', value: 'fa' }, + { name: 'Polish', value: 'pl' }, + { name: 'Portuguese', value: 'pt' }, + { name: 'Portuguese (Brazil)', value: 'pt-pt' }, + { name: 'Punjabi', value: 'pa' }, + { name: 'Romanian', value: 'ro' }, + { name: 'Russian', value: 'ru' }, + { name: 'Serbian', value: 'sr' }, + { name: 'Serbian (Latin)', value: 'sr-latn' }, + { name: 'Sinhala', value: 'si' }, + { name: 'Slovak', value: 'sk' }, + { name: 'Slovenian', value: 'sl' }, + { name: 'Spanish', value: 'es' }, + { name: 'Spanish (Latin America)', value: 'es-419' }, + { name: 'Spanish (US)', value: 'es-us' }, + { name: 'Swahili', value: 'sw' }, + { name: 'Swedish', value: 'sv' }, + { name: 'Tamil', value: 'ta' }, + { name: 'Telugu', value: 'te' }, + { name: 'Thai', value: 'th' }, + { name: 'Turkish', value: 'tr' }, + { name: 'Ukrainian', value: 'uk' }, + { name: 'Urdu', value: 'ur' }, + { name: 'Uzbek', value: 'uz' }, + { name: 'Vietnamese', value: 'vi' }, + { name: 'Zulu', value: 'zu' }, + ], + routing: { + request: { + qs: { + hl: '={{$value}}', + }, + }, + }, + }, + ], + displayOptions, + }, +]; + +export const youtube_video = { + resource, + properties, +}; \ No newline at end of file diff --git a/package.json b/package.json index 89dd4cf..fa92051 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@searchapi/n8n-nodes-searchapi", - "version": "2.0.4", + "version": "2.1.0", "description": "SearchApi.io nodes for n8n", "keywords": [ "n8n-community-node-package"