Skip to content

Commit f64af03

Browse files
committed
fix: seo stuff, sitemaps, redirections
1 parent b1d431b commit f64af03

File tree

9 files changed

+78
-63
lines changed

9 files changed

+78
-63
lines changed

next.config.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,6 @@ const nextConfig: NextConfig = {
4646
destination: '/@:username/:path*',
4747
permanent: true,
4848
},
49-
// TV Series
50-
{
51-
source: '/tv_series/:path*',
52-
destination: '/tv-series/:path*',
53-
permanent: true,
54-
}
5549
];
5650
},
5751
async rewrites() {

src/app/[lang]/layout.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,10 @@ export default async function LangLayout({
6565
params: Promise<{ lang: string }>;
6666
}) {
6767
const { lang } = await params;
68-
const direction = getLangDir(lang);
68+
// Disable for RTL languages for now
69+
// const direction = getLangDir(lang);
6970
return (
70-
<html lang={lang} dir={direction} suppressHydrationWarning>
71+
<html lang={lang} suppressHydrationWarning>
7172
<head>
7273
<link rel="search" type="application/opensearchdescription+xml" title="Recomend" href="/opensearch.xml" />
7374
</head>

src/app/sitemaps/(medias)/medias.xml/route.ts renamed to src/app/sitemaps/(films)/films.xml/route.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
import { siteConfig } from "@/config/site";
2-
import { getSitemapMediaCount } from "@/features/server/sitemap";
2+
import { getSitemapMediaMovieCount } from "@/features/server/sitemap";
33
import { buildSitemapIndex } from "@/lib/sitemap";
44
import { NextResponse } from "next/server";
55
import { gzipSync } from "zlib";
66

77
export async function GET() {
88
try {
9-
const count = await getSitemapMediaCount();
9+
const count = await getSitemapMediaMovieCount();
1010

11-
const sitemapIndexes = [
12-
...Array.from({ length: count.films }, (_, index) => {
13-
return `${siteConfig.url}/sitemaps/medias/films/${index}`;
14-
}),
15-
...Array.from({ length: count.series }, (_, index) => {
16-
return `${siteConfig.url}/sitemaps/medias/tv-series/${index}`;
17-
}),
18-
];
11+
const sitemapIndexes = Array.from({ length: count }, (_, index) => {
12+
return `${siteConfig.url}/sitemaps/films/${index}`;
13+
});
1914

2015
const sitemapIndexXML = buildSitemapIndex(sitemapIndexes);
2116
const gzipped = gzipSync(sitemapIndexXML);
File renamed without changes.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { siteConfig } from "@/config/site";
2+
import { getSitemapMediaTvSeriesCount } from "@/features/server/sitemap";
3+
import { buildSitemapIndex } from "@/lib/sitemap";
4+
import { NextResponse } from "next/server";
5+
import { gzipSync } from "zlib";
6+
7+
export async function GET() {
8+
try {
9+
const count = await getSitemapMediaTvSeriesCount();
10+
11+
const sitemapIndexes = Array.from({ length: count }, (_, index) => {
12+
return `${siteConfig.url}/sitemaps/tv-series/${index}`;
13+
});
14+
15+
const sitemapIndexXML = buildSitemapIndex(sitemapIndexes);
16+
const gzipped = gzipSync(sitemapIndexXML);
17+
18+
return new NextResponse(Uint8Array.from(gzipped), {
19+
headers: {
20+
"Content-Type": "application/xml",
21+
"Content-Encoding": "gzip",
22+
"Content-Length": gzipped.length.toString(),
23+
"Cache-Control": "public, max-age=86400",
24+
},
25+
});
26+
} catch (error) {
27+
console.error("Error generating sitemap index:", error);
28+
return NextResponse.error();
29+
}
30+
}

src/app/sitemaps/(medias)/medias/tv-series/[id]/route.ts renamed to src/app/sitemaps/(tv-series)/tv-series/[id]/route.ts

File renamed without changes.

src/app/sitemaps/sitemap.xml/route.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import { NextResponse } from "next/server";
55
export async function GET() {
66
try {
77
const sitemapIndexes = [
8-
`${siteConfig.url}/sitemaps/medias.xml`,
8+
`${siteConfig.url}/sitemaps/films.xml`,
9+
`${siteConfig.url}/sitemaps/tv-series.xml`,
910
`${siteConfig.url}/sitemaps/reviews.xml`,
1011
`${siteConfig.url}/sitemaps/playlists.xml`,
1112
`${siteConfig.url}/sitemaps/users.xml`,

src/features/server/sitemap.ts

Lines changed: 26 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ const PLAYLIST_REVALIDATE_TIME = 60 * 60 * 24; // 24 hours
88
const REVIEW_REVALIDATE_TIME = 60 * 60 * 24; // 24 hours
99

1010
/* ---------------------------------- USERS --------------------------------- */
11+
const USER_PER_PAGE = 10000;
1112
export const getSitemapUserCount = cache(
12-
async (perPage: number = 10000): Promise<number> => {
13+
async (perPage: number = USER_PER_PAGE): Promise<number> => {
1314
const supabase = await createClient(routing.defaultLocale);
1415
const { count, error } = await supabase
1516
.from('profile')
@@ -23,9 +24,8 @@ export const getSitemapUserCount = cache(
2324
},
2425
{ revalidate: USER_REVALIDATE_TIME },
2526
);
26-
2727
export const getSitemapUsers = cache(
28-
async (id: number, perPage: number = 10000) => {
28+
async (id: number, perPage: number = USER_PER_PAGE) => {
2929
const start = id * perPage;
3030
const end = start + perPage - 1;
3131
const supabase = await createClient(routing.defaultLocale);
@@ -34,8 +34,7 @@ export const getSitemapUsers = cache(
3434
.select('id, username, created_at')
3535
.eq('private', false)
3636
.range(start, end)
37-
.order('followers_count', { ascending: false })
38-
.order('created_at', { ascending: false });
37+
.order('created_at', { ascending: true });
3938
if (error) throw error;
4039
return data || [];
4140
},
@@ -45,8 +44,9 @@ export const getSitemapUsers = cache(
4544

4645
/* --------------------------------- MEDIAS --------------------------------- */
4746
// Movies
47+
const MEDIA_MOVIE_PER_PAGE = 500;
4848
export const getSitemapMediaMovieCount = cache(
49-
async (perPage: number = 500) => {
49+
async (perPage: number = MEDIA_MOVIE_PER_PAGE) => {
5050
const supabase = await createClient(routing.defaultLocale);
5151
const { count, error } = await supabase
5252
.from('tmdb_movie')
@@ -60,7 +60,7 @@ export const getSitemapMediaMovieCount = cache(
6060
{ revalidate: MEDIA_REVALIDATE_TIME },
6161
);
6262
export const getSitemapMediaMovies = cache(
63-
async (id: number, perPage: number = 500) => {
63+
async (id: number, perPage: number = MEDIA_MOVIE_PER_PAGE) => {
6464
const start = id * perPage;
6565
const end = start + perPage - 1;
6666
const supabase = await createClient(routing.defaultLocale);
@@ -76,16 +76,17 @@ export const getSitemapMediaMovies = cache(
7676
)
7777
`)
7878
.range(start, end)
79-
.order('popularity', { ascending: false });
79+
.order('id', { ascending: true });
8080
if (error) throw error;
8181
return data || [];
8282
},
8383
{ revalidate: MEDIA_REVALIDATE_TIME },
8484
);
8585

8686
// TV Series
87+
const MEDIA_TV_SERIES_PER_PAGE = 500;
8788
export const getSitemapMediaTvSeriesCount = cache(
88-
async (perPage: number = 500) => {
89+
async (perPage: number = MEDIA_TV_SERIES_PER_PAGE) => {
8990
const supabase = await createClient(routing.defaultLocale);
9091
const { count, error } = await supabase
9192
.from('tmdb_tv_series')
@@ -98,9 +99,8 @@ export const getSitemapMediaTvSeriesCount = cache(
9899
},
99100
{ revalidate: MEDIA_REVALIDATE_TIME },
100101
);
101-
102102
export const getSitemapMediaTvSeries = cache(
103-
async (id: number, perPage: number = 500) => {
103+
async (id: number, perPage: number = MEDIA_TV_SERIES_PER_PAGE) => {
104104
const start = id * perPage;
105105
const end = start + perPage - 1;
106106
const supabase = await createClient(routing.defaultLocale);
@@ -116,39 +116,18 @@ export const getSitemapMediaTvSeries = cache(
116116
)
117117
`)
118118
.range(start, end)
119-
.order('popularity', { ascending: false });
119+
.order('id', { ascending: true });
120120
if (error) throw error;
121121
return data || [];
122122
},
123123
{ revalidate: MEDIA_REVALIDATE_TIME },
124124
);
125-
126-
127-
export const getSitemapMediaCount = cache(
128-
async (perPage: number = 500) => {
129-
const supabase = await createClient(routing.defaultLocale);
130-
const { count: filmCount, error: filmError } = await supabase
131-
.from('tmdb_movie')
132-
.select('*', { count: 'exact', head: true });
133-
if (filmError) throw filmError;
134-
const { count: seriesCount, error: seriesError } = await supabase
135-
.from('tmdb_tv_series')
136-
.select('*', { count: 'exact', head: true });
137-
if (seriesError) throw seriesError;
138-
139-
return {
140-
films: filmCount ? Math.ceil(filmCount / perPage) : 0,
141-
series: seriesCount ? Math.ceil(seriesCount / perPage) : 0,
142-
}
143-
},
144-
{ revalidate: MEDIA_REVALIDATE_TIME },
145-
);
146-
147125
/* -------------------------------------------------------------------------- */
148126

149127
/* -------------------------------- PLAYLISTS ------------------------------- */
128+
const PLAYLIST_PER_PAGE = 10000;
150129
export const getSitemapPlaylistCount = cache(
151-
async (perPage: number = 10000): Promise<number> => {
130+
async (perPage: number = PLAYLIST_PER_PAGE): Promise<number> => {
152131
const supabase = await createClient(routing.defaultLocale);
153132
const { count, error } = await supabase
154133
.from('playlists')
@@ -163,15 +142,15 @@ export const getSitemapPlaylistCount = cache(
163142
{ revalidate: PLAYLIST_REVALIDATE_TIME }
164143
);
165144
export const getSitemapPlaylists = cache(
166-
async (id: number, perPage: number = 10000) => {
145+
async (id: number, perPage: number = PLAYLIST_PER_PAGE) => {
167146
const start = id * perPage;
168147
const end = start + perPage - 1;
169148
const supabase = await createClient(routing.defaultLocale);
170149
const { data, error } = await supabase
171150
.from('playlists')
172151
.select('id, title, updated_at')
173-
// .eq('private', false) // RLS already handles this
174-
.range(start, end);
152+
.range(start, end)
153+
.order('id', { ascending: true });
175154
if (error) throw error;
176155
return data || [];
177156
},
@@ -180,8 +159,9 @@ export const getSitemapPlaylists = cache(
180159
/* -------------------------------------------------------------------------- */
181160

182161
/* --------------------------------- REVIEWS -------------------------------- */
162+
const REVIEW_PER_PAGE = 10000;
183163
export const getSitemapReviewMovieCount = cache(
184-
async (perPage: number = 10000): Promise<number> => {
164+
async (perPage: number = REVIEW_PER_PAGE): Promise<number> => {
185165
const supabase = await createClient(routing.defaultLocale);
186166
const { count, error } = await supabase
187167
.from('user_reviews_movie')
@@ -195,7 +175,7 @@ export const getSitemapReviewMovieCount = cache(
195175
{ revalidate: REVIEW_REVALIDATE_TIME },
196176
);
197177
export const getSitemapReviewTvSeriesCount = cache(
198-
async (perPage: number = 10000): Promise<number> => {
178+
async (perPage: number = REVIEW_PER_PAGE): Promise<number> => {
199179
const supabase = await createClient(routing.defaultLocale);
200180
const { count, error } = await supabase
201181
.from('user_reviews_tv_series')
@@ -210,28 +190,30 @@ export const getSitemapReviewTvSeriesCount = cache(
210190
);
211191

212192
export const getSitemapReviewsMovie = cache(
213-
async (id: number, perPage: number = 10000) => {
193+
async (id: number, perPage: number = REVIEW_PER_PAGE) => {
214194
const start = id * perPage;
215195
const end = start + perPage - 1;
216196
const supabase = await createClient(routing.defaultLocale);
217197
const { data, error } = await supabase
218198
.from('user_reviews_movie')
219199
.select('id, updated_at, activity:user_activities_movie(movie_id)')
220-
.range(start, end);
200+
.range(start, end)
201+
.order('created_at', { ascending: true });
221202
if (error) throw error;
222203
return data || [];
223204
},
224205
{ revalidate: REVIEW_REVALIDATE_TIME },
225206
);
226207
export const getSitemapReviewsTvSeries = cache(
227-
async (id: number, perPage: number = 10000) => {
208+
async (id: number, perPage: number = REVIEW_PER_PAGE) => {
228209
const start = id * perPage;
229210
const end = start + perPage - 1;
230211
const supabase = await createClient(routing.defaultLocale);
231212
const { data, error } = await supabase
232213
.from('user_reviews_tv_series')
233214
.select('id, updated_at, activity:user_activities_tv_series(tv_series_id)')
234-
.range(start, end);
215+
.range(start, end)
216+
.order('created_at', { ascending: true });
235217
if (error) throw error;
236218
return data || [];
237219
},

src/proxy.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ export async function proxy(request: NextRequest) {
1414
).pathname.split('/');
1515
const pathname = '/' + rest.join('/');
1616

17+
const isBrowser =
18+
request.headers.get("accept")?.includes("text/html") &&
19+
/Mozilla|Chrome|Safari|Firefox|Edge/i.test(
20+
request.headers.get("user-agent") || ""
21+
);
22+
1723
// IMPORTANT: Avoid writing any logic between createServerClient and
1824
// supabase.auth.getClaims(). A simple mistake could make it very hard to debug
1925
// issues with users being randomly logged out.
@@ -24,6 +30,9 @@ export async function proxy(request: NextRequest) {
2430
* Redirect user if not logged in
2531
*/
2632
if (user && siteConfig.routes.anonRoutes.some((path) => pathname.startsWith(path))) {
33+
if (!isBrowser) {
34+
return new NextResponse('Unauthorized', { status: 401 });
35+
}
2736
const redirect = request.nextUrl.searchParams.get('redirect');
2837

2938
if (redirect) {
@@ -41,6 +50,9 @@ export async function proxy(request: NextRequest) {
4150
* Redirect user if logged in
4251
*/
4352
if (!user && siteConfig.routes.authRoutes.some((path) => pathname.startsWith(path))) {
53+
if (!isBrowser) {
54+
return new NextResponse('Unauthorized', { status: 401 });
55+
}
4456
const redirectTo = encodeURIComponent(pathname);
4557
return NextResponse.redirect(
4658
new URL(`/${locale}/auth/login?redirect=${redirectTo}`, request.url)

0 commit comments

Comments
 (0)