itube-specs 0.0.798 → 0.0.799

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,6 +2,17 @@ import type { Language } from '../../runtime';
2
2
  import { AsyncData } from '../../runtime';
3
3
  import type { IVideoData } from '../../types';
4
4
 
5
+ // Роут-источник (без суффикса локали) → тип referer'а и параметр роута со значением.
6
+ // Расширяется добавлением строки: позже сюда лягут model, channel и т.д.
7
+ const REFERER_BY_ROUTE: Record<string, { type: string; param: string }> = {
8
+ 'categories-slug': { type: 'category', param: 'slug' },
9
+ 'tag-tag': { type: 'tag', param: 'tag' },
10
+ 'models-slug-tag-tag': { type: 'tag', param: 'tag' },
11
+ 'search-slug': { type: 'search', param: 'slug' },
12
+ 'search-slug-videos': { type: 'search', param: 'slug' },
13
+ 'search-slug-models': { type: 'search', param: 'slug' },
14
+ };
15
+
5
16
  // Debug-override слоя: добавлен ?view — id/url ролика, на который переключились
6
17
  // через плеер (next / автопереход). Пока он есть и меняется, useAsyncData
7
18
  // подсасывает свежие данные этого ролика, не трогая path (landing остаётся в URL).
@@ -11,8 +22,24 @@ export const useFetchVideo = async (
11
22
  const lang = useLang() as Language;
12
23
  const slug = useSlug();
13
24
  const route = useRoute();
25
+ const router = useRouter();
14
26
  const key = AsyncData.Video;
15
27
 
28
+ // referer вычисляем из предыдущей записи History API (нативно, без middleware).
29
+ // Есть только при клиентской навигации; при прямом заходе/рефреше back пустой → referer не шлём.
30
+ const referer = computed(() => {
31
+ const back = router.options.history.state.back;
32
+ if (!back || typeof back !== 'string') return null;
33
+
34
+ const from = router.resolve(back);
35
+ const name = String(from.name || '').replace(/___[a-zA-Z-]+$/, '');
36
+ const rule = REFERER_BY_ROUTE[name];
37
+ if (!rule) return null;
38
+
39
+ const value = String(from.params[rule.param] || '');
40
+ return value ? { type: rule.type, value } : null;
41
+ });
42
+
16
43
  // view кладётся тем же ключом, что и основной фетч (url при FetchByUrlEnabled,
17
44
  // иначе id) — поэтому тот же apiMethod принимает и его без переключений.
18
45
  const view = computed(() => {
@@ -48,6 +75,7 @@ export const useFetchVideo = async (
48
75
  identifier.value,
49
76
  undefined,
50
77
  headers,
78
+ referer.value ?? undefined,
51
79
  )(),
52
80
  );
53
81
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "itube-specs",
3
3
  "type": "module",
4
- "version": "0.0.798",
4
+ "version": "0.0.799",
5
5
  "main": "./nuxt.config.ts",
6
6
  "types": "./types/index.d.ts",
7
7
  "scripts": {
@@ -12,6 +12,16 @@ function getSafeReferrer(): string {
12
12
  }
13
13
  }
14
14
 
15
+ /** Собирает query-строку referer_type/referer_value для запроса видео. Пусто, если referer нет. */
16
+ function buildRefererQuery(referer?: { type: string; value: string }): string {
17
+ if (!referer?.value) return '';
18
+ const params = new URLSearchParams({
19
+ referer_type: referer.type,
20
+ referer_value: referer.value,
21
+ });
22
+ return `?${params.toString()}`;
23
+ }
24
+
15
25
  /** Сервис для работы с API видеороликов */
16
26
  /** Сервис для работы с API видеороликов */
17
27
  export class VideosApiService {
@@ -184,9 +194,10 @@ export class VideosApiService {
184
194
  id: string,
185
195
  niche = NicheHelper.getSiteDefaultNiche(),
186
196
  headers = {} as HeadersInit,
197
+ referer?: { type: string; value: string },
187
198
  ): Promise<IVideoData> {
188
199
  return await ApiHelper.fetch(
189
- `/videos/get-video-by-id/${id}`,
200
+ `/videos/get-video-by-id/${id}${buildRefererQuery(referer)}`,
190
201
  {
191
202
  method: 'GET',
192
203
  headers: {
@@ -206,9 +217,10 @@ export class VideosApiService {
206
217
  url: string,
207
218
  niche = NicheHelper.getSiteDefaultNiche(),
208
219
  headers = {} as HeadersInit,
220
+ referer?: { type: string; value: string },
209
221
  ): Promise<IVideoData> {
210
222
  return await ApiHelper.fetch(
211
- `/videos/get-video-by-url/${url}`,
223
+ `/videos/get-video-by-url/${url}${buildRefererQuery(referer)}`,
212
224
  {
213
225
  method: 'GET',
214
226
  headers: {