AlterMantle commited on
Commit
bc14e89
·
verified ·
1 Parent(s): 06748c1

undefined - Initial Deployment

Browse files
Files changed (2) hide show
  1. README.md +6 -4
  2. index.html +258 -19
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Uuttdrop
3
- emoji: 🐢
4
  colorFrom: green
5
- colorTo: yellow
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: uuttdrop
3
+ emoji: 🐳
4
  colorFrom: green
5
+ colorTo: red
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,258 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Titty Drop GIF Wall</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9
+ <style>
10
+ .gif-item {
11
+ transition: all 0.3s ease;
12
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
13
+ }
14
+ .gif-item:hover {
15
+ transform: scale(1.03);
16
+ box-shadow: 0 10px 15px rgba(0, 0, 0, 0.2);
17
+ z-index: 10;
18
+ }
19
+ .loading-spinner {
20
+ border: 4px solid rgba(255, 255, 255, 0.3);
21
+ border-radius: 50%;
22
+ border-top: 4px solid #ec4899;
23
+ width: 40px;
24
+ height: 40px;
25
+ animation: spin 1s linear infinite;
26
+ }
27
+ @keyframes spin {
28
+ 0% { transform: rotate(0deg); }
29
+ 100% { transform: rotate(360deg); }
30
+ }
31
+ .nsfw-overlay {
32
+ position: absolute;
33
+ top: 0;
34
+ left: 0;
35
+ right: 0;
36
+ bottom: 0;
37
+ background: rgba(0, 0, 0, 0.7);
38
+ display: flex;
39
+ align-items: center;
40
+ justify-content: center;
41
+ opacity: 1;
42
+ transition: opacity 0.3s ease;
43
+ }
44
+ .nsfw-overlay:hover {
45
+ opacity: 0;
46
+ }
47
+ </style>
48
+ </head>
49
+ <body class="bg-gray-900 text-white min-h-screen">
50
+ <header class="bg-pink-900 py-6 shadow-lg">
51
+ <div class="container mx-auto px-4">
52
+ <div class="flex flex-col md:flex-row justify-between items-center">
53
+ <h1 class="text-3xl font-bold text-center md:text-left mb-4 md:mb-0">
54
+ <i class="fas fa-film mr-2"></i> Titty Drop GIF Wall
55
+ </h1>
56
+ <div class="flex items-center space-x-4">
57
+ <div class="relative">
58
+ <select id="sort-select" class="bg-pink-800 text-white px-4 py-2 rounded-lg focus:outline-none focus:ring-2 focus:ring-pink-500">
59
+ <option value="top">Top</option>
60
+ <option value="hot">Hot</option>
61
+ <option value="new">New</option>
62
+ </select>
63
+ </div>
64
+ <button id="refresh-btn" class="bg-pink-600 hover:bg-pink-700 text-white px-4 py-2 rounded-lg transition duration-200">
65
+ <i class="fas fa-sync-alt mr-2"></i> Refresh
66
+ </button>
67
+ </div>
68
+ </div>
69
+ <p class="mt-4 text-pink-200 text-center md:text-left">
70
+ The hottest titty drop GIFs from Reddit, updated regularly
71
+ </p>
72
+ </div>
73
+ </header>
74
+
75
+ <main class="container mx-auto px-4 py-8">
76
+ <div id="loading" class="flex justify-center items-center py-20">
77
+ <div class="loading-spinner"></div>
78
+ <span class="ml-3 text-xl">Loading the hottest drops...</span>
79
+ </div>
80
+
81
+ <div id="gif-wall" class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6 hidden">
82
+ <!-- GIFs will be inserted here -->
83
+ </div>
84
+
85
+ <div id="error-message" class="hidden text-center py-20">
86
+ <i class="fas fa-exclamation-triangle text-5xl text-red-500 mb-4"></i>
87
+ <h2 class="text-2xl font-bold mb-2">Oops! Something went wrong</h2>
88
+ <p class="text-gray-400 mb-6">We couldn't load the titty drops. Please try again later.</p>
89
+ <button id="retry-btn" class="bg-pink-600 hover:bg-pink-700 text-white px-6 py-3 rounded-lg transition duration-200">
90
+ <i class="fas fa-redo mr-2"></i> Try Again
91
+ </button>
92
+ </div>
93
+ </main>
94
+
95
+ <footer class="bg-gray-800 py-6 mt-12">
96
+ <div class="container mx-auto px-4 text-center text-gray-400">
97
+ <p>This content is NSFW. You must be 18+ to view.</p>
98
+ <p class="mt-2">Data fetched from Reddit's API. All content belongs to their respective owners.</p>
99
+ <div class="mt-4 flex justify-center space-x-4">
100
+ <a href="#" class="hover:text-pink-400 transition duration-200"><i class="fab fa-reddit text-xl"></i></a>
101
+ <a href="#" class="hover:text-pink-400 transition duration-200"><i class="fas fa-question-circle text-xl"></i></a>
102
+ <a href="#" class="hover:text-pink-400 transition duration-200"><i class="fas fa-shield-alt text-xl"></i></a>
103
+ </div>
104
+ </div>
105
+ </footer>
106
+
107
+ <script>
108
+ document.addEventListener('DOMContentLoaded', function() {
109
+ const gifWall = document.getElementById('gif-wall');
110
+ const loadingElement = document.getElementById('loading');
111
+ const errorElement = document.getElementById('error-message');
112
+ const refreshBtn = document.getElementById('refresh-btn');
113
+ const retryBtn = document.getElementById('retry-btn');
114
+ const sortSelect = document.getElementById('sort-select');
115
+
116
+ // Age verification modal
117
+ const ageVerified = localStorage.getItem('ageVerified');
118
+ if (!ageVerified) {
119
+ showAgeModal();
120
+ } else {
121
+ fetchGIFs();
122
+ }
123
+
124
+ function showAgeModal() {
125
+ const modal = document.createElement('div');
126
+ modal.className = 'fixed inset-0 bg-black bg-opacity-90 flex items-center justify-center z-50 p-4';
127
+ modal.innerHTML = `
128
+ <div class="bg-gray-800 rounded-xl max-w-md w-full p-6 text-center">
129
+ <i class="fas fa-exclamation-circle text-5xl text-pink-500 mb-4"></i>
130
+ <h2 class="text-2xl font-bold mb-4">Age Verification</h2>
131
+ <p class="mb-6 text-gray-300">This website contains adult content and is only suitable for those who are 18 years or older.</p>
132
+ <div class="flex flex-col space-y-3">
133
+ <button id="verify-btn" class="bg-pink-600 hover:bg-pink-700 text-white py-3 rounded-lg transition duration-200">
134
+ I am 18 or older - Enter
135
+ </button>
136
+ <a href="https://www.reddit.com/" class="bg-gray-700 hover:bg-gray-600 text-white py-3 rounded-lg transition duration-200">
137
+ I am under 18 - Exit
138
+ </a>
139
+ </div>
140
+ </div>
141
+ `;
142
+ document.body.appendChild(modal);
143
+
144
+ document.getElementById('verify-btn').addEventListener('click', function() {
145
+ localStorage.setItem('ageVerified', 'true');
146
+ document.body.removeChild(modal);
147
+ fetchGIFs();
148
+ });
149
+ }
150
+
151
+ async function fetchGIFs() {
152
+ try {
153
+ loadingElement.classList.remove('hidden');
154
+ gifWall.classList.add('hidden');
155
+ errorElement.classList.add('hidden');
156
+
157
+ const sortBy = sortSelect.value;
158
+ const response = await fetch(`https://www.reddit.com/r/tittydrop/${sortBy}/.json?limit=30`);
159
+ const data = await response.json();
160
+
161
+ if (!response.ok) throw new Error(data.message || 'Failed to fetch');
162
+
163
+ const posts = data.data.children
164
+ .filter(post => !post.data.over_18 === false) // Ensure NSFW
165
+ .filter(post => post.data.url.match(/\.(gif|gifv|mp4|webm)$/i)) // Only media posts
166
+ .slice(0, 24); // Limit to 24 posts
167
+
168
+ displayGIFs(posts);
169
+ } catch (error) {
170
+ console.error('Error fetching GIFs:', error);
171
+ loadingElement.classList.add('hidden');
172
+ errorElement.classList.remove('hidden');
173
+ }
174
+ }
175
+
176
+ function displayGIFs(posts) {
177
+ gifWall.innerHTML = '';
178
+
179
+ if (posts.length === 0) {
180
+ gifWall.innerHTML = `
181
+ <div class="col-span-full text-center py-12">
182
+ <i class="fas fa-frown text-4xl text-pink-500 mb-4"></i>
183
+ <h3 class="text-xl font-semibold">No GIFs found</h3>
184
+ <p class="text-gray-400">Try refreshing or changing the sort option</p>
185
+ </div>
186
+ `;
187
+ } else {
188
+ posts.forEach(post => {
189
+ const mediaUrl = post.data.url.replace('.gifv', '.mp4');
190
+ const isVideo = mediaUrl.match(/\.(mp4|webm)$/i);
191
+
192
+ const gifItem = document.createElement('div');
193
+ gifItem.className = 'gif-item bg-gray-800 rounded-xl overflow-hidden relative';
194
+
195
+ if (isVideo) {
196
+ gifItem.innerHTML = `
197
+ <div class="relative pb-[100%]">
198
+ <video
199
+ autoplay loop muted playsinline
200
+ class="absolute h-full w-full object-cover"
201
+ src="${mediaUrl}"
202
+ alt="${post.data.title}"
203
+ ></video>
204
+ <div class="nsfw-overlay">
205
+ <span class="bg-pink-600 text-white px-3 py-1 rounded-full text-sm font-bold">NSFW</span>
206
+ </div>
207
+ </div>
208
+ <div class="p-3">
209
+ <h3 class="text-sm font-semibold truncate">${post.data.title}</h3>
210
+ <div class="flex justify-between items-center mt-2 text-xs text-gray-400">
211
+ <span><i class="fas fa-arrow-up mr-1"></i> ${post.data.ups.toLocaleString()}</span>
212
+ <span><i class="fas fa-comment mr-1"></i> ${post.data.num_comments.toLocaleString()}</span>
213
+ </div>
214
+ </div>
215
+ `;
216
+ } else {
217
+ gifItem.innerHTML = `
218
+ <div class="relative pb-[100%]">
219
+ <img
220
+ class="absolute h-full w-full object-cover"
221
+ src="${mediaUrl}"
222
+ alt="${post.data.title}"
223
+ loading="lazy"
224
+ />
225
+ <div class="nsfw-overlay">
226
+ <span class="bg-pink-600 text-white px-3 py-1 rounded-full text-sm font-bold">NSFW</span>
227
+ </div>
228
+ </div>
229
+ <div class="p-3">
230
+ <h3 class="text-sm font-semibold truncate">${post.data.title}</h3>
231
+ <div class="flex justify-between items-center mt-2 text-xs text-gray-400">
232
+ <span><i class="fas fa-arrow-up mr-1"></i> ${post.data.ups.toLocaleString()}</span>
233
+ <span><i class="fas fa-comment mr-1"></i> ${post.data.num_comments.toLocaleString()}</span>
234
+ </div>
235
+ </div>
236
+ `;
237
+ }
238
+
239
+ gifItem.addEventListener('click', () => {
240
+ window.open(`https://reddit.com${post.data.permalink}`, '_blank');
241
+ });
242
+
243
+ gifWall.appendChild(gifItem);
244
+ });
245
+ }
246
+
247
+ loadingElement.classList.add('hidden');
248
+ gifWall.classList.remove('hidden');
249
+ }
250
+
251
+ // Event listeners
252
+ refreshBtn.addEventListener('click', fetchGIFs);
253
+ retryBtn.addEventListener('click', fetchGIFs);
254
+ sortSelect.addEventListener('change', fetchGIFs);
255
+ });
256
+ </script>
257
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=AlterMantle/uuttdrop" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
258
+ </html>