Ship canonical/Open Graph/Twitter tags, WebApplication schema, and landing copy aimed at audio-to-YouTube queries.
92 lines
2.3 KiB
TypeScript
92 lines
2.3 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { Inter } from "next/font/google";
|
|
import "./globals.css";
|
|
import { Providers } from "./providers";
|
|
import { JsonLd } from "@/components/JsonLd";
|
|
|
|
const inter = Inter({ subsets: ["latin"] });
|
|
|
|
const SITE_URL = "https://songs2vid.com";
|
|
const SITE_NAME = "Songs2VID";
|
|
const DEFAULT_TITLE =
|
|
"Songs2VID - Fast Audio to Video Converter for YouTube | TunesToTube Alternative";
|
|
const DEFAULT_DESCRIPTION =
|
|
"Convert MP3, WAV, and audio files into YouTube videos instantly. The fastest, privacy-focused online tool to upload music, beats, and podcasts directly to YouTube.";
|
|
const OG_TITLE = "Songs2VID - Fast Audio to Video Converter for YouTube";
|
|
const OG_DESCRIPTION =
|
|
"Convert MP3 & audio files into YouTube videos instantly without heavy editing.";
|
|
const TWITTER_DESCRIPTION = "Convert MP3 & audio files into YouTube videos instantly.";
|
|
|
|
export const metadata: Metadata = {
|
|
metadataBase: new URL(SITE_URL),
|
|
title: {
|
|
default: DEFAULT_TITLE,
|
|
template: `%s | ${SITE_NAME}`,
|
|
},
|
|
description: DEFAULT_DESCRIPTION,
|
|
keywords: [
|
|
"mp3 to youtube",
|
|
"audio to video converter",
|
|
"upload audio to youtube",
|
|
"tunestotube alternative",
|
|
"song to video",
|
|
"podcast to youtube",
|
|
"convert mp3 to mp4",
|
|
],
|
|
authors: [{ name: SITE_NAME, url: SITE_URL }],
|
|
creator: SITE_NAME,
|
|
publisher: SITE_NAME,
|
|
applicationName: SITE_NAME,
|
|
alternates: {
|
|
canonical: SITE_URL,
|
|
},
|
|
openGraph: {
|
|
title: OG_TITLE,
|
|
description: OG_DESCRIPTION,
|
|
url: SITE_URL,
|
|
siteName: SITE_NAME,
|
|
type: "website",
|
|
locale: "en_US",
|
|
images: [
|
|
{
|
|
url: "/logo.png",
|
|
width: 512,
|
|
height: 512,
|
|
alt: SITE_NAME,
|
|
},
|
|
],
|
|
},
|
|
twitter: {
|
|
card: "summary_large_image",
|
|
title: OG_TITLE,
|
|
description: TWITTER_DESCRIPTION,
|
|
images: ["/logo.png"],
|
|
},
|
|
robots: {
|
|
index: true,
|
|
follow: true,
|
|
googleBot: {
|
|
index: true,
|
|
follow: true,
|
|
},
|
|
},
|
|
icons: {
|
|
icon: "/favicon.png",
|
|
},
|
|
};
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: Readonly<{
|
|
children: React.ReactNode;
|
|
}>) {
|
|
return (
|
|
<html lang="en" suppressHydrationWarning>
|
|
<body className={inter.className} suppressHydrationWarning>
|
|
<JsonLd />
|
|
<Providers>{children}</Providers>
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|