itube-specs 0.0.798 → 0.0.800
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.
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
import type { Language } from '../../runtime';
|
|
2
|
-
import { AsyncData } from '../../runtime';
|
|
2
|
+
import { AsyncData, convertString } 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,30 @@ 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 raw = String(from.params[rule.param] || '');
|
|
40
|
+
if (!raw) return null;
|
|
41
|
+
|
|
42
|
+
// Декодируем так же, как useSlug — бек принимает referer_value в том же виде,
|
|
43
|
+
// что и slug в остальных методах (напр. useFetchCategoriesByName).
|
|
44
|
+
const decoded = convertString().fromSlug(raw);
|
|
45
|
+
const value = String(Array.isArray(decoded) ? decoded[0] : decoded);
|
|
46
|
+
return value ? { type: rule.type, value } : null;
|
|
47
|
+
});
|
|
48
|
+
|
|
16
49
|
// view кладётся тем же ключом, что и основной фетч (url при FetchByUrlEnabled,
|
|
17
50
|
// иначе id) — поэтому тот же apiMethod принимает и его без переключений.
|
|
18
51
|
const view = computed(() => {
|
|
@@ -48,6 +81,7 @@ export const useFetchVideo = async (
|
|
|
48
81
|
identifier.value,
|
|
49
82
|
undefined,
|
|
50
83
|
headers,
|
|
84
|
+
referer.value ?? undefined,
|
|
51
85
|
)(),
|
|
52
86
|
);
|
|
53
87
|
|
package/package.json
CHANGED
|
@@ -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: {
|