feat: PrivateHD watcher ve item tabanli scraper entegrasyonunu ekle

This commit is contained in:
2026-03-13 02:08:17 +03:00
parent baad2b3e96
commit bf278ad786
9 changed files with 355 additions and 93 deletions

View File

@@ -104,7 +104,9 @@ export const WatcherPage = () => {
const pushAlert = useUiStore((s) => s.pushAlert);
const [selectedWatcherId, setSelectedWatcherId] = useState<string | null>(null);
const [isCreatingNew, setIsCreatingNew] = useState(false);
const [tracker, setTracker] = useState("happyfappy");
const [wishlistUrl, setWishlistUrl] = useState("");
const [cookie, setCookie] = useState("");
const [category, setCategory] = useState("__none__");
const [showCookie, setShowCookie] = useState(false);
@@ -152,7 +154,7 @@ export const WatcherPage = () => {
}
if (watchersLoaded) {
setWatchers(watchersLoaded);
if (!selectedWatcherId && watchersLoaded[0]?.id) {
if (!selectedWatcherId && !isCreatingNew && watchersLoaded[0]?.id) {
setSelectedWatcherId(watchersLoaded[0].id);
}
}
@@ -168,13 +170,15 @@ export const WatcherPage = () => {
load();
const interval = setInterval(load, 15000);
return () => clearInterval(interval);
}, []);
}, [selectedWatcherId, isCreatingNew]);
useEffect(() => {
if (!selectedWatcher) {
return;
}
setIsCreatingNew(false);
setTracker(selectedWatcher.tracker);
setWishlistUrl(selectedWatcher.wishlistUrl ?? "");
setCategory(selectedWatcher.category ?? "__none__");
setCookie("");
setShowCookie(false);
@@ -194,8 +198,10 @@ export const WatcherPage = () => {
}, [intervalUnit, intervalValue]);
const resetForm = () => {
setIsCreatingNew(true);
setSelectedWatcherId(null);
setTracker(watcherTrackers[0]?.key ?? "happyfappy");
setWishlistUrl("");
setCategory("__none__");
setCookie("");
setShowCookie(false);
@@ -204,6 +210,8 @@ export const WatcherPage = () => {
setEnabled(true);
};
const requiresWishlistUrl = tracker === "privatehd";
const submit = async () => {
if (!cookie.trim() && !selectedWatcher) {
pushAlert({
@@ -213,12 +221,21 @@ export const WatcherPage = () => {
});
return;
}
if (requiresWishlistUrl && !wishlistUrl.trim()) {
pushAlert({
title: "Wishlist URL gerekli",
description: "PrivateHD watcher icin wishlist URL girin.",
variant: "warn",
});
return;
}
setSaving(true);
try {
if (selectedWatcher) {
await api.patch(`/api/watchers/${selectedWatcher.id}`, {
tracker,
category: category === "__none__" ? "" : category,
wishlistUrl,
intervalMinutes,
enabled,
...(cookie.trim() ? { cookie } : {}),
@@ -232,11 +249,13 @@ export const WatcherPage = () => {
const response = await api.post("/api/watchers", {
tracker,
category: category === "__none__" ? "" : category,
wishlistUrl,
cookie,
intervalMinutes,
enabled,
});
setWatchers([response.data, ...watchers]);
setIsCreatingNew(false);
setSelectedWatcherId(response.data.id);
pushAlert({
title: "Watcher eklendi",
@@ -499,7 +518,16 @@ export const WatcherPage = () => {
<span className="text-xs font-semibold uppercase tracking-[0.18em] text-slate-500">
Tracker
</span>
<Select value={tracker} onValueChange={setTracker} disabled={Boolean(selectedWatcher)}>
<Select
value={tracker}
onValueChange={(value) => {
setTracker(value);
if (!selectedWatcher) {
setIsCreatingNew(true);
}
}}
disabled={Boolean(selectedWatcher)}
>
<SelectTrigger className="w-full rounded-xl">
<SelectValue placeholder="Tracker sec" />
</SelectTrigger>
@@ -513,6 +541,28 @@ export const WatcherPage = () => {
</Select>
</label>
<label className="block space-y-2">
<span className="text-xs font-semibold uppercase tracking-[0.18em] text-slate-500">
Wishlist URL
</span>
<Input
type="text"
value={wishlistUrl}
onChange={(event) => setWishlistUrl(event.target.value)}
placeholder={
requiresWishlistUrl
? "https://privatehd.to/profile/kullanici/wishlist"
: "Bu tracker icin bos birakilabilir"
}
className="rounded-xl"
/>
<div className="text-xs text-slate-500">
{requiresWishlistUrl
? "PrivateHD icin bookmark kaynaginin tam URL'si zorunlu."
: "HappyFappy gibi tracker'larda bu alan opsiyoneldir."}
</div>
</label>
<label className="block space-y-2">
<div className="flex items-center justify-between">
<span className="text-xs font-semibold uppercase tracking-[0.18em] text-slate-500">

View File

@@ -91,6 +91,7 @@ export interface Watcher {
id: string;
tracker: string;
trackerLabel: string;
wishlistUrl?: string;
category?: string;
cookieHint: string;
hasCookie: boolean;
@@ -115,6 +116,8 @@ export interface WatcherItem {
pageUrl: string;
title: string;
imageUrl?: string;
downloadUrl?: string;
removeToken?: string;
status: string;
statusLabel: string;
qbitHash?: string;