User: есть код
  Lampa.TMDB.api = function (url) {
    var base = Lampa.Utils.protocol() + ('api.themoviedb.org/3/' + url).replace("//", "/");
    if (url.includes("apn.ndst.pw")) {
      console.log('TMDB-Proxy', 'URL:', url);
      var urlObj = new URL(url);
      var streamUrl = urlObj.searchParams.get('url');
      console.log('TMDB-Proxy', 'streamUrl:', streamUrl);
      if (streamUrl && streamUrl.startsWith("https://stream.ndst.pw/ndi/aisearch")) {
        var streamUrlObj = new URL(streamUrl);
        var params = streamUrlObj.searchParams;
        var newUrl = streamUrlObj.origin + streamUrlObj.pathname; // Базовая часть URL
        var filteredParams = [];
        if (params.has('deviceid')) {
          filteredParams.push('deviceid=' + params.get('deviceid'));
        }
        if (params.has('query')) {
          filteredParams.push('query=' + params.get('query'));
        }
        if (filteredParams.length > 0) {
          newUrl += '?' + filteredParams.join('&');
        }
        return newUrl; // Возвращаем новый URL только с нужными параметрами
      }
      return url;
    }
    return filter_api(Lampa.Storage.field('proxy_tmdb') ? tmdb_proxy.path_api + url : base);
  };
почему-то в лог console.log('TMDB-Proxy', 'URL:', url); попадает TMDB-Proxy URL: https://apn.ndst.pw/v1?url=https://stream.ndst.pw/ndi/aisearch?deviceid=sm1fxv-MTA5LjE5NS4yNDMuMjMy-YnJvd3Nlcg==&query=%D1%80%D0%B8%D0%BC&api_key=973f38338ed91c57e3d79602540d4089&language=ru&page=1, а в console.log('TMDB-Proxy', 'streamUrl:', streamUrl); попадает TMDB-Proxy streamUrl: https://stream.ndst.pw/ndi/aisearch?deviceid=sm1fxv-MTA5LjE5NS4yNDMuMjMy-YnJvd3Nlcg== где остальная часть с api_key language и page?
Assistant: Ваша проблема связана с тем, как вы извлекаете параметр `url` из `url` строки. Давайте разберем код по частям:

1. Вы получаете полный `url`: 
   ```javascript
   console.log('TMDB-Proxy', 'URL:', url);
   ```

2. Затем вы создаете объект `URL` из этого `url` и пытаетесь извлечь параметр `url`:
   ```javascript
   var urlObj = new URL(url);
   var streamUrl = urlObj.searchParams.get('url');
   ```

   В этом случае `urlObj` создается из полного URL, который включает параметры запроса (такие как `api_key`, `language`, `page` и т.д.). Однако метод `searchParams.get('url')` извлекает только значение параметра `url`, что соответствует значению, которое вы видите в `streamUrl`.

   То есть в `streamUrl` вы получаете другой URL, который также содержит свои собственные параметры, но не включает параметры из оригинального `url`.

3. Когда вы создаете `streamUrlObj`, объекты параметров, которые вы хотите оставить, извлекаются следующим образом:
   ```javascript
   var streamUrlObj = new URL(streamUrl);
   var params = streamUrlObj.searchParams;
   ```

   Здесь вы создаете другой объект `URL` по `streamUrl`, который не будет содержать никаких параметров из оригинального `url`, только те параметры, которые были в этом `streamUrl`.

Чтобы обрабатывать все параметры, вы можете конкатенировать `streamUrl` с недостающими параметрами (такими как `api_key`, `language`, `page`) перед возвращением нового URL. Вот пример, как вы можете это реализовать:

```javascript
// Добавляем эти параметры к новому URL
if (urlObj.searchParams.has('api_key')) {
    filteredParams.push('api_key=' + urlObj.searchParams.get('api_key'));
}
if (urlObj.searchParams.has('language')) {
    filteredParams.push('language=' + urlObj.searchParams.get('language'));
}
if (urlObj.searchParams.has('page')) {
    filteredParams.push('page=' + urlObj.searchParams.get('page'));
}
```

Таким образом, ваш код будет включать все необходимые параметры из исходного `url` в конечный `newUrl`.

Вот как это можно интегрировать в ваш текущий код:

```javascript
if (filteredParams.length > 0) {
    newUrl += '?' + filteredParams.join('&');
}
if (urlObj.searchParams.has('api_key')) {
    newUrl += (filteredParams.length > 0 ? '&' : '?') + 'api_key=' + urlObj.searchParams.get('api_key');
}
if (urlObj.searchParams.has('language')) {
    newUrl += (filteredParams.length > 0 || urlObj.searchParams.has('api_key') ? '&' : '?') + 'language=' + urlObj.searchParams.get('language');
}
if (urlObj.searchParams.has('page')) {
    newUrl += (filteredParams.length > 0 || urlObj.searchParams.has('api_key') || urlObj.searchParams.has('language') ? '&' : '?') + 'page=' + urlObj.searchParams.get('page');
}
```

Теперь `newUrl` будет содержать все необходимые параметры из оригинального `url`, включая `api_key`, `language`, и `page`, вместе с фильтрами параметров (если они существуют).
User: а почему url api_key и page не принадлежат к streamUrl если ссылка такая https://stream.ndst.pw/ndi/aisearch?deviceid=sm1fxv-MTA5LjE5NS4yNDMuMjMy-YnJvd3Nlcg==&query=%D1%80%D0%B8%D0%BC&api_key=973f38338ed91c57e3d79602540d4089&language=ru&page=1?
Assistant: Понимание причин, по которым параметры `api_key`, `language`, и `page` не будут присутствовать в `streamUrl`, объясняется тем, как вы извлекаете это значение из оригинального URL.

Смотрим на ваш оригинальный URL:

```
https://apn.ndst.pw/v1?url=https://stream.ndst.pw/ndi/aisearch?deviceid=sm1fxv-MTA5LjE5NS4yNDMuMjMy-YnJvd3Nlcg==&query=%D1%80%D0%B8%D0%BC&api_key=973f38338ed91c57e3d79602540d4089&language=ru&page=1
```

Когда вы создаете `urlObj` и извлекаете `streamUrl` с помощью `urlObj.searchParams.get('url')`, вы получаете только часть URL, которая стоит после `url=`:

```
https://stream.ndst.pw/ndi/aisearch?deviceid=sm1fxv-MTA5LjE5NS4yNDMuMjMy-YnJvd3Nlcg==&query=%D1%80%D0%B8%D0%BC&api_key=973f38338ed91c57e3d79602540d4089&language=ru&page=1
```

Эта конструкция `url=` берет часть строки, а не все параметры из родительского URL. Параметры, такие как `api_key`, `language`, и `page`, находятся в строке запроса родительского URL, а не в `streamUrl` самих по себе, поэтому они не "принадлежат" `streamUrl`, даже если они фактически присутствуют в URL.

Таким образом, `streamUrl` является валидным URL со своими параметрами, но он "наследует" параметры только от конструкции `url=http://...`, не учитывая остальные параметры, находящиеся на уровне выше.

Если вам нужно, чтобы параметры `api_key`, `language` и `page` были доступны и в `streamUrl`, при их извлечении вы можете объединить параметры из оригинального URL с параметрами из `streamUrl`, как было предложено ранее. Это будет правильным решением, если вы считаете, что эти параметры должны быть частью окончательного результирующего URL.

В итоге, причины, по которым параметры не "принадлежат" `streamUrl`, кроются в логике ссылки и том, как происходит извлечение параметров из запроса, а не в их физическом отсутствии в самом `streamUrl`.
User: а почему тогда deviceid и query попадают?
Assistant: