Strip Songs2VID to a payment-free self-hosted OSS core.
Remove Stripe/billing/pricing/marketing, simplify schema and entitlements for unlimited self-host use, and keep auth, encode, and YouTube upload. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
co-authored by
Cursor
parent
935abfb22e
commit
925aadae75
@@ -1,90 +1,88 @@
|
||||
-- CreateEnum
|
||||
CREATE TYPE "Plan" AS ENUM ('FREE', 'PREMIUM');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "Privacy" AS ENUM ('PUBLIC', 'PRIVATE', 'UNLISTED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "JobStatus" AS ENUM ('PENDING', 'PROCESSING', 'COMPLETED', 'FAILED', 'PARTIAL');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "JobItemStatus" AS ENUM ('PENDING', 'ENCODING', 'UPLOADING', 'COMPLETED', 'FAILED');
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "User" (
|
||||
"id" TEXT NOT NULL,
|
||||
"email" TEXT NOT NULL,
|
||||
"name" TEXT,
|
||||
"image" TEXT,
|
||||
"plan" "Plan" NOT NULL DEFAULT 'FREE',
|
||||
"videosUsed" INTEGER NOT NULL DEFAULT 0,
|
||||
"quotaResetAt" TIMESTAMP(3) NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
||||
"id" TEXT NOT NULL,
|
||||
"email" TEXT NOT NULL,
|
||||
"name" TEXT,
|
||||
"image" TEXT,
|
||||
"createdVideoCount" INTEGER NOT NULL DEFAULT 0,
|
||||
"apiKeyHash" TEXT,
|
||||
"apiKeyPrefix" TEXT,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "YouTubeConnection" (
|
||||
"id" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"accessToken" TEXT NOT NULL,
|
||||
"refreshToken" TEXT NOT NULL,
|
||||
"expiresAt" TIMESTAMP(3) NOT NULL,
|
||||
"channelId" TEXT NOT NULL,
|
||||
"channelTitle" TEXT NOT NULL,
|
||||
|
||||
CONSTRAINT "YouTubeConnection_pkey" PRIMARY KEY ("id")
|
||||
"id" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"accessToken" TEXT NOT NULL,
|
||||
"refreshToken" TEXT NOT NULL,
|
||||
"expiresAt" TIMESTAMP(3) NOT NULL,
|
||||
"channelId" TEXT NOT NULL,
|
||||
"channelTitle" TEXT NOT NULL,
|
||||
CONSTRAINT "YouTubeConnection_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Job" (
|
||||
"id" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"status" "JobStatus" NOT NULL DEFAULT 'PENDING',
|
||||
"imagePath" TEXT NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"completedAt" TIMESTAMP(3),
|
||||
|
||||
CONSTRAINT "Job_pkey" PRIMARY KEY ("id")
|
||||
"id" TEXT NOT NULL,
|
||||
"userId" TEXT NOT NULL,
|
||||
"status" "JobStatus" NOT NULL DEFAULT 'PENDING',
|
||||
"imagePath" TEXT NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"completedAt" TIMESTAMP(3),
|
||||
CONSTRAINT "Job_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "JobItem" (
|
||||
"id" TEXT NOT NULL,
|
||||
"jobId" TEXT NOT NULL,
|
||||
"audioPath" TEXT NOT NULL,
|
||||
"audioFilename" TEXT NOT NULL,
|
||||
"title" TEXT NOT NULL,
|
||||
"description" TEXT NOT NULL DEFAULT '',
|
||||
"tags" TEXT NOT NULL DEFAULT '',
|
||||
"privacy" "Privacy" NOT NULL DEFAULT 'PUBLIC',
|
||||
"categoryId" TEXT NOT NULL DEFAULT '10',
|
||||
"resolution" TEXT NOT NULL DEFAULT '1280x720',
|
||||
"notifySubscribers" BOOLEAN NOT NULL DEFAULT true,
|
||||
"madeForKids" BOOLEAN NOT NULL DEFAULT false,
|
||||
"embeddable" BOOLEAN NOT NULL DEFAULT true,
|
||||
"creativeCommons" BOOLEAN NOT NULL DEFAULT false,
|
||||
"includeWatermark" BOOLEAN NOT NULL DEFAULT true,
|
||||
"status" "JobItemStatus" NOT NULL DEFAULT 'PENDING',
|
||||
"outputPath" TEXT,
|
||||
"youtubeVideoId" TEXT,
|
||||
"error" TEXT,
|
||||
|
||||
CONSTRAINT "JobItem_pkey" PRIMARY KEY ("id")
|
||||
"id" TEXT NOT NULL,
|
||||
"jobId" TEXT NOT NULL,
|
||||
"audioPath" TEXT NOT NULL,
|
||||
"audioFilename" TEXT NOT NULL,
|
||||
"title" TEXT NOT NULL,
|
||||
"description" TEXT NOT NULL DEFAULT '',
|
||||
"tags" TEXT NOT NULL DEFAULT '',
|
||||
"privacy" "Privacy" NOT NULL DEFAULT 'PUBLIC',
|
||||
"categoryId" TEXT NOT NULL DEFAULT '10',
|
||||
"resolution" TEXT NOT NULL DEFAULT '1280x720',
|
||||
"notifySubscribers" BOOLEAN NOT NULL DEFAULT true,
|
||||
"madeForKids" BOOLEAN NOT NULL DEFAULT false,
|
||||
"embeddable" BOOLEAN NOT NULL DEFAULT true,
|
||||
"creativeCommons" BOOLEAN NOT NULL DEFAULT false,
|
||||
"includeWatermark" BOOLEAN NOT NULL DEFAULT false,
|
||||
"itemImagePath" TEXT,
|
||||
"watermarkMode" TEXT NOT NULL DEFAULT 'none',
|
||||
"watermarkText" TEXT,
|
||||
"watermarkLogoPath" TEXT,
|
||||
"watermarkFontKey" TEXT,
|
||||
"watermarkFontPath" TEXT,
|
||||
"watermarkPosition" TEXT NOT NULL DEFAULT 'bottom-right',
|
||||
"watermarkOffsetX" INTEGER NOT NULL DEFAULT 20,
|
||||
"watermarkOffsetY" INTEGER NOT NULL DEFAULT 20,
|
||||
"artist" TEXT,
|
||||
"songTitle" TEXT,
|
||||
"layoutTemplate" TEXT,
|
||||
"blurAmount" INTEGER NOT NULL DEFAULT 55,
|
||||
"blurOpacity" INTEGER NOT NULL DEFAULT 100,
|
||||
"textPadding" INTEGER NOT NULL DEFAULT 48,
|
||||
"titleArtistGap" INTEGER NOT NULL DEFAULT 10,
|
||||
"textOffsetX" INTEGER NOT NULL DEFAULT 0,
|
||||
"textOffsetY" INTEGER NOT NULL DEFAULT 0,
|
||||
"playlistId" TEXT,
|
||||
"status" "JobItemStatus" NOT NULL DEFAULT 'PENDING',
|
||||
"outputPath" TEXT,
|
||||
"youtubeVideoId" TEXT,
|
||||
"error" TEXT,
|
||||
CONSTRAINT "JobItem_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "User_apiKeyHash_key" ON "User"("apiKeyHash");
|
||||
CREATE UNIQUE INDEX "YouTubeConnection_userId_key" ON "YouTubeConnection"("userId");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "YouTubeConnection" ADD CONSTRAINT "YouTubeConnection_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Job" ADD CONSTRAINT "Job_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "JobItem" ADD CONSTRAINT "JobItem_jobId_fkey" FOREIGN KEY ("jobId") REFERENCES "Job"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
ALTER TABLE "YouTubeConnection" ADD CONSTRAINT "YouTubeConnection_userId_fkey"
|
||||
FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
ALTER TABLE "Job" ADD CONSTRAINT "Job_userId_fkey"
|
||||
FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
ALTER TABLE "JobItem" ADD CONSTRAINT "JobItem_jobId_fkey"
|
||||
FOREIGN KEY ("jobId") REFERENCES "Job"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
Reference in New Issue
Block a user