PageSourceSearch

https://clip.cafe/login/

html clip.cafe collected 2026-10-02 03:58:54 UTC 186,097 bytes, 2,042 lines download raw bytes

1<!doctype html>
2    <html lang="en" dir="ltr">
3      <head>
4
5     
6
7      <base href="https://clip.cafe/">
8      <link rel="canonical" href="https://clip.cafe/login/">
9      <meta name="robots" content="noindex, follow">
10
11        <meta charset="utf-8">
12        <meta name="viewport" content="width=device-width, initial-scale=1">
13        
14        <title>Login or Create Account - ClipCafe</title>
15
16        <link rel="apple-touch-icon" sizes="57x57" href="favicons/apple-icon-57x57.png">
17        <link rel="apple-touch-icon" sizes="60x60" href="favicons/apple-icon-60x60.png">
18        <link rel="apple-touch-icon" sizes="72x72" href="favicons/apple-icon-72x72.png">
19        <link rel="apple-touch-icon" sizes="76x76" href="favicons/apple-icon-76x76.png">
20        <link rel="apple-touch-icon" sizes="114x114" href="favicons/apple-icon-114x114.png">
21        <link rel="apple-touch-icon" sizes="120x120" href="favicons/apple-icon-120x120.png">
22        <link rel="apple-touch-icon" sizes="144x144" href="favicons/apple-icon-144x144.png">
23        <link rel="apple-touch-icon" sizes="152x152" href="favicons/apple-icon-152x152.png">
24        <link rel="apple-touch-icon" sizes="180x180" href="favicons/apple-icon-180x180.png">
25        <link rel="icon" type="image/png" sizes="192x192"  href="favicons/android-icon-192x192.png">
26        <link rel="icon" type="image/png" sizes="32x32" href="favicons/favicon-32x32.png">
27        <link rel="icon" type="image/png" sizes="96x96" href="favicons/favicon-96x96.png">
28        <link rel="icon" type="image/png" sizes="16x16" href="favicons/favicon-16x16.png">
29      
30        <link rel="search" type="application/opensearchdescription+xml" title="Clip.Cafe" href="/opensearch.xml">
31    
32        <!-- Preconnect to HLS server for faster video streaming startup -->
33        <link rel="preconnect" href="https://clip.cafe" crossorigin>
34        <link rel="dns-prefetch" href="https://clip.cafe">
35        <!-- Preconnect to CDN for faster HLS.js and resource loading -->
36        <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin>
37        
38        <link rel="preload" href="img/bg.svg" type="image/svg+xml" as="image">
39        
40        <meta name="msapplication-TileColor" content="#ffffff">
41        <meta name="msapplication-TileImage" content="/favicons/ms-icon-144x144.png">
42        <meta name="theme-color" content="#ffffff">
43
44        <meta name="apple-mobile-web-app-status-bar" content="#216aa0">
45        <link rel="manifest" href="manifest.json">
46
47        
48
49	<meta property="og:locale" content="en_GB">
50    <meta property="fb:app_id" content="422835821953323">
51	<meta property="og:type" content="website">
52    <meta property="og:image" content="https://clip.cafe/img/clipcafebig.jpg">
53    <meta property="og:image:height" content="506">
54    <meta property="og:image:width" content="2000">
55    <meta property="og:image" content="https://clip.cafe/img/clipcafecup.png">
56    <meta property="og:image:height" content="199">
57    <meta property="og:image:width" content="177">
58
59	<meta property="og:url" content="https://clip.cafe/">
60	<meta property="og:site_name" content="Clip.Cafe">	
61    <link rel="image_src" href="https://clip.cafe/img/clipcafebig.jpg">
62    <meta name="description" content="Awesome Movie Clip & Quote Database with over 5 million movie clips. It will take you 200+ days to watch them all">
63    
64
65
66        
67
68        <style>
69
70        html {
71            background-color: #000; /* Fallback for mobile toolbar hide */
72        }
73
74        html::before {
75            content: ' ';
76            position: fixed;
77            width: 100%;
78            height: 100vh;
79            height: 100dvh; /* Dynamic viewport for mobile toolbar */
80            top: 0;
81            left: 0;
82            bottom: 0;
83            right: 0;
84            z-index: -1;
85            will-change: transform;
86            background: url(img/bg.svg) no-repeat top center / cover, linear-gradient(180deg, #0a2b44 0%, #051420 80%, #000000 100%);
87
88          }
89
90
91        html,body{
92            height: 100%;
93            min-height:100%;
94            width:100%;
95            margin: 0;
96            padding:0;
97            
98        }
99        body {
100
101            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
102            text-shadow:rgba(0,0,0,.3) 0 0 1px;
103            color:#313131;
104            transition: background-image 1s ease-in-out;
105            overflow-x: hidden;
106          }
107
108        header{
109            width:100%;
110            display: contents;
111            overflow:hidden;
112        }
113        
114
115        .lang-switcher{position:relative;display:inline-block;vertical-align:middle;margin-right:8px;}
116        .lang-trigger{background:none;border:1px solid rgba(255,255,255,.25);color:#fff;padding:4px 10px;border-radius:4px;cursor:pointer;font-size:13px;display:flex;align-items:center;gap:5px;}
117        .lang-trigger:hover{border-color:rgba(255,255,255,.5);}
118        .lang-trigger img{vertical-align:middle;}
119        .lang-dropdown{display:none;position:absolute;top:100%;left:0;background:#1a2a3a;border:1px solid rgba(255,255,255,.15);border-radius:6px;min-width:140px;z-index:999;margin-top:4px;box-shadow:0 4px 12px rgba(0,0,0,.4);}
120        .lang-switcher:hover .lang-dropdown{display:block;}
121        .lang-dropdown a{display:flex;align-items:center;gap:8px;padding:8px 12px;color:#ccc;text-decoration:none;font-size:13px;}
122        .lang-dropdown a:hover{background:rgba(255,255,255,.1);color:#fff;}
123        .lang-dropdown a.active{color:#4fc3f7;}
124        .lang-dropdown a img{flex-shrink:0;}
125
126        #playerWrap .plyr--video .plyr__controls{
127            z-index: 99;
128            padding: 0 12px 21px;
129            bottom: 0px;
130        }
131
132        @media (max-width: 1000px) {
133
134   
135
136            #playerWrap .plyr--video .plyr__controls{
137                padding: 0 2px 14px;
138            }
139
140        }
141
142        /* WalkStreet Banner Styles — floating branded card */
143        #walkstreet-banner {
144            position: fixed;
145            bottom: 16px;
146            left: 50%;
147            width: min(620px, calc(100% - 24px));
148            box-sizing: border-box;
149            transform: translateX(-50%) translateY(160%);
150            opacity: 0;
151            background: linear-gradient(135deg, rgba(18,92,44,0.98) 0%, rgba(12,68,33,0.98) 55%, rgba(6,51,26,0.98) 100%);
152            backdrop-filter: blur(10px);
153            -webkit-backdrop-filter: blur(10px);
154            color: #fff;
155            z-index: 10000;
156            padding: 11px 44px 11px 14px;
157            font-size: 15px;
158            border: 1px solid rgba(255,255,255,0.18);
159            border-radius: 14px;
160            box-shadow: inset 0 1px 0 rgba(255,255,255,0.25), 0 12px 32px rgba(0,0,0,0.45);
161            display: flex;
162            align-items: center;
163            transition: transform 0.55s cubic-bezier(0.16,1,0.3,1), opacity 0.45s ease;
164        }
165        #walkstreet-banner.ws-show {
166            transform: translateX(-50%) translateY(0);
167            opacity: 1;
168        }
169        #walkstreet-banner a {
170            display: flex;
171            align-items: center;
172            gap: 12px;
173            flex: 1;
174            min-width: 0;
175            color: #fff;
176            text-decoration: none;
177            text-align: left;
178        }
179        .ws-banner-icon {
180            flex-shrink: 0;
181            width: 46px;
182            height: 46px;
183            border-radius: 11px;
184            box-shadow: 0 3px 8px rgba(0,0,0,0.4);
185        }
186        .ws-banner-body {
187            display: flex;
188            flex-direction: column;
189            align-items: flex-start;
190            gap: 9px;
191            flex: 1;
192            min-width: 0;
193        }
194        .ws-banner-text {
195            line-height: 1.32;
196        }
197        .banner-cta {
198            align-self: flex-start;
199            background: linear-gradient(to bottom, #fccd4d, #f8b500);
200            color: #000;
201            padding: 7px 18px;
202            border-radius: 8px;
203            font-weight: 800;
204            text-transform: uppercase;
205            font-size: 12.5px;
206            letter-spacing: 0.03em;
207            white-space: nowrap;
208            box-shadow: 0 3px 0 #c98a00, 0 5px 10px rgba(0,0,0,0.3);
209            border: none;
210            text-shadow: 0 1px 0 rgba(255,255,255,0.45);
211            display: inline-block;
212            transition: transform 0.12s ease, box-shadow 0.12s ease, background 0.2s ease;
213        }
214        .banner-cta:hover {
215            transform: translateY(-1px);
216            box-shadow: 0 4px 0 #c98a00, 0 7px 14px rgba(0,0,0,0.35);
217            background: linear-gradient(to bottom, #ffe082, #ffca28);
218        }
219        .banner-cta:active {
220            transform: translateY(2px);
221            box-shadow: 0 1px 0 #c98a00, 0 2px 5px rgba(0,0,0,0.3);
222        }
223        #walkstreet-close {
224            position: absolute;
225            right: 6px;
226            top: 6px;
227            background: none;
228            border: none;
229            color: rgba(255,255,255,0.75);
230            font-size: 18px;
231            cursor: pointer;
232            padding: 6px 10px;
233            line-height: 1;
234            border-radius: 8px;
235        }
236        #walkstreet-close:hover {
237            color: #fff;
238            background: rgba(255,255,255,0.12);
239        }
240        body.has-banner {
241            padding-bottom: 100px; /* space so the floating card never hides footer content */
242        }
243        @media (prefers-reduced-motion: reduce) {
244            #walkstreet-banner { transition: none; }
245        }
246        @media (max-width: 600px) {
247            #walkstreet-banner {
248                bottom: 10px;
249                width: calc(100% - 16px);
250                padding: 10px 38px 10px 12px;
251                font-size: 13px;
252            }
253            #walkstreet-banner a { gap: 10px; }
254            .ws-banner-icon { width: 40px; height: 40px; border-radius: 9px; }
255            body.has-banner {
256                padding-bottom: 128px;
257            }
258        }
259        </style>
260
261        <link rel="stylesheet" href="css/style_min.css?i=1790426701">
262        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.css">
263
264        <!-- Google tag (gtag.js) -->
vendor: 64 bytes, lines 264-265
264
265<script async src="https://www.googletagmanager.com/gtag/js?id=
265G-F67NFJ4Z8K
vendor: 12 bytes, line 265
265"></script>
266<script>
vendor: 127 bytes, lines 267-270
267window.dataLayer = window.dataLayer || [];
268function gtag(){dataLayer.push(arguments);}
269gtag('js', new Date());
270gtag('config', '
270G-F67NFJ4Z8K
vendor: 4 bytes, line 270
270');
271</script>
271
272
273      
273<script>window.I18N = {"site.name":"ClipCafe","site.tagline":"Movie Quote Database with Video clips","site.description":"Awesome Movie Clip & Quote Database with over 5 million movie clips. It will take you 200+ days to watch them all","find.page_title":"Clip Finder — find the exact movie clip by quote | Clip.Cafe","find.meta_description":"Type a line of dialogue and instantly play the exact movie clip from that spot. A fast, phrase-anchored clip finder for video editors.","find.heading":"Clip Finder","find.subheading":"Type a line of dialogue — the exact clip plays from that spot.","find.placeholder":"Type an exact line… e.g. \"do or do not, there is no try\"","find.empty_player":"Your matching clip will play here.","find.hint":"Type a line of dialogue to find the exact clip.","find.no_results":"No clips found for","find.matches":"matches","find.scope_scene":"Scene match","find.scope_transcript":"Transcript match","find.scope_mixed":"Scene/Transcript","find.prev":"Previous match","find.next":"Next match","find.results_label":"Matching clips","find.movie_matches":"Movies named like this","find.view_label":"View","find.view_player":"Player","find.view_grid":"Grid","find.download":"Download","find.open_clip":"Open clip","find.autoplay":"Autoplay","find.autoplay_on":"Autoplay is on — clips advance automatically","find.autoplay_off":"Autoplay is off — clips stop when finished","find.autoplay_paused":"clips played in a row — tap play to keep watching.","find.filters":"Filters","find.reset":"Reset","find.show_results":"Show results","find.any":"Any","find.facet_scope":"Search in","find.facet_people":"Title & people","find.facet_year":"Year","find.length_s":"Length (s)","find.sort_relevance":"Relevance","find.sort_views":"Most viewed","find.sort_newest":"Newest","find.sort_shortest":"Shortest first","find.sort_longest":"Longest first","find.chip_genre":"Genre","find.clear_filters":"Clear all","find.rescue_lead":"Try without","find.scope_dialog":"Quotes & subtitles","find.scope_scene_ai":"Scene descriptions (AI)","find.scope_both":"Both","find.scene_group":"What's on screen","find.scene_tags_label":"What the AI sees in this clip","find.scene_emotion":"Mood","find.scene_emotion_any":"Any mood","find.scene_situation":"People","find.scene_situation_any":"Any grouping","find.scene_shot":"Framing","find.scene_shot_any":"Any framing","find.scene_motion":"Camera","find.scene_motion_any":"Any camera move","find.scene_light":"Lighting","find.scene_light_any":"Any lighting","find.scene_theme":"Theme","find.scene_setting":"Place","find.scene_coverage":"AI-described: {clips} clips so far ({percent}% of the library).","find.scene_group_hint":"AI-described clips in these results","find.exact_match":"Exact match","find.exact_hint":"Off: clips containing every word, in any order. On: clips saying the words together, exactly as typed.","find.syntax_title":"Advanced search","find.syntax_broad":"Clips containing every word, in any order — anywhere in the clip.","find.syntax_exact":"Only clips that say the whole line, exactly like that.","find.syntax_exclude":"Leaves out any clip that mentions this word.","find.syntax_combine":"Mix them freely: an exact line, plus words to avoid.","find.syntax_foot":"Ticking “Exact match” adds the quotes for you.","find.parsed_phrase":"Exact line:","find.parsed_words":"Words:","find.parsed_excluded":"Excluding:","find.relaxed_notice":"No exact match — showing the closest lines.","find.range_from":"from","find.range_to":"to","find.range_min":"min","find.range_max":"max","nav.login":"Login","nav.logout":"Logout","nav.my_profile":"My Profile","nav.recently_viewed":"Recently Viewed","nav.settings":"Settings","nav.subscription":"Subscription","nav.liked_clips":"Liked Clips","nav.favorited_movies":"Favorited Movies","nav.browse":"Browse","nav.browse.spotlight":"Spotlight","nav.browse.spotlight_desc":"Curated highlights","nav.browse.genres":"Genres","nav.browse.genres_desc":"Browse by category","nav.browse.years":"Years","nav.browse.years_desc":"Browse by year","nav.games":"Games","nav.games.guess":"Guess The Movie","nav.games.guess_desc":"The classic movie quiz","nav.games.party":"Party Game","nav.games.party_desc":"Multiplayer fun!","nav.games.daily":"The Daily Clip","nav.games.daily_desc":"New puzzle every day!","nav.upgrade":"Upgrade","nav.upgrade_desc":"Unlock HD downloads and premium features","nav.pro":"PRO","nav.your_subscription":"Your subscription","nav.discord":"Discord","nav.discord_desc":"Chat, requests & support","nav.community":"Community","nav.open_menu":"Open Menu","nav.home":"Home","frontpage.try_quotes":"Try:","nav.menu":"Menu","nav.search":"Search","nav.close":"Close","nav.go_to_homepage":"Go to homepage","nav.language":"Language","search.placeholder_movie":"Movie","search.placeholder_actor":"Actor","search.placeholder_character":"Character","search.placeholder_director":"Director","search.placeholder_writer":"Writer","search.scene_description":"Scene Description","search.transcript":"Transcript","search.langs_audio":"Audio: {langs}","search.langs_subtitles":"Subtitles: {langs}","search.all_movies":"All Movies","search.year_from":"Year (from)","search.year_to":"Year (to)","search.length_seconds":"Length (seconds)","search.type_label":"Movies or TV series","search.type_all":"Movies & TV","search.type_movies":"Movies only","search.type_tv":"TV series only","search.rating_label":"Content rating","search.rating_any":"Any Rating","search.audio_label":"Audio language","search.audio_any":"Any audio language","search.subs_label":"Subtitle language","search.subs_any":"Any subtitle language","search.sl_label":"Search in","search.sl_auto":"Search in: any language","find.searched_in":"Searching the {language} subtitles.","find.matched_in":"Matched in {language}","find.no_results_in_lang":"No {language} subtitles found for","search.rating_family":"Family (G · PG)","search.rating_teen":"Teen (PG-13)","search.rating_mature":"Mature (R · TV-MA)","search.sort_label":"Sort results","search.sort_relevance":"Sort: Relevance","search.sort_views":"Sort: Most viewed","search.sort_newest":"Sort: Newest","search.sort_shortest":"Sort: Shortest first","search.sort_longest":"Sort: Longest first","search.helper_text":"Just type any quote, movie line, or phrase you remember","search.advanced_filters":"Advanced Filters (optional)","search.no_results":"No Results","search.movies_in_genre":"mov
273ies with quotes, in {genre} genre","search.no_movies_found":"No Movies Found","search.no_clips_found":"No clips found","search.quotes_with_word":"quotes, with {word} in movies","search.did_you_mean":"Did you mean?","search.did_you_mean_subtitle":"We couldn't find exact matches, but these movies might be what you're looking for:","footer.quote_database":"Movie Quote Database with Video Clips","footer.about_us":"About Us","footer.privacy_policy":"Privacy Policy","footer.refund_policy":"Refund Policy","footer.terms":"Terms & Conditions","footer.sitemap":"Sitemap","footer.dmca":"DMCA","footer.report_bug":"Report a bug","footer.copyright_notice":"All movie names, images, videos are registered trademarks and/or copyrights of their respective holders","footer.recaptcha_notice":"Site is protected by reCAPTCHA.","footer.excellent":"Excellent","collection.not_found":"Collection not found","collection.all_genres":"All Genres","collection.newest_first":"Newest First","collection.oldest_first":"Oldest First","collection.a_to_z":"A → Z","collection.z_to_a":"Z → A","collection.year_newest":"Year (Newest)","collection.year_oldest":"Year (Oldest)","collection.shuffle":"Shuffle","collection.filters":"Filters","collection.select":"Select","collection.grid":"Grid","collection.list":"List","collection.export":"Export","collection.share":"Share","collection.rename":"Rename","collection.privacy":"Privacy","collection.delete":"Delete","collection.items":"items","collection.type_movie":"Movie","collection.type_clip":"Clip","collection.my_collection":"My Collection","collection.public":"Public","collection.private":"Private","collection.private_notice":"This collection is private","collection.no_permission":"You do not have permission to view its contents.","collection.search_items":"Search items...","collection.search_favorites":"Search favorites...","collection.search_likes":"Search likes...","collection.add_to_collection":"Add to Collection","collection.remove_from_collection":"Remove from Collection","collection.cancel":"Cancel","collection.no_items_selected":"No items selected","collection.login_to_add":"Please log in to add to your collections","collection.share_link_copied":"Share link copied","collection.all_favorites":"All Favorites","collection.all_likes":"All Likes","collection.new_collection":"New Collection","collection.search_clips":"Search clips...","collection.name_required":"Collection name is required","collection.type_required":"Collection type must be movie or clip","collection.create_failed":"Failed to create collection","collection.create_error":"Error creating collection","collection.delete_failed":"Failed to delete collection","collection.delete_error":"Error deleting collection","collection.update_failed":"Failed to update collection","collection.update_error":"Error updating collection","collection.load_error":"Error loading collection","collection.empty_title":"This collection is empty","collection.empty_message":"Add items from your favorites or likes","collection.add_failed":"Failed to add to collection","collection.add_error":"Error adding to collection","collection.remove_confirm":"Remove this item from the collection?","collection.remove_failed":"Failed to remove from collection","collection.remove_error":"Error removing from collection","collection.bulk_add_failed":"Failed to add items","collection.bulk_add_error":"Error adding items","collection.bulk_remove_confirm":"Are you sure you want to remove {count} items?","collection.bulk_remove_failed":"Failed to remove items","collection.bulk_remove_error":"Error removing items","collection.note_failed":"Failed to save note","collection.note_error":"Error saving note","collection.tag_add_failed":"Failed to add tag","collection.tag_add_error":"Error adding tag","collection.tag_remove_failed":"Failed to remove tag","collection.items_selected":"{count} item(s) selected","collection.showing_items":"Showing {visible} of {total} items","collection.load_failed":"Failed to load collections","collection.rename_unavailable":"Rename not available here. Open Collections to edit.","collection.rename_title":"Rename collection","collection.privacy_unavailable":"Change privacy not available here. Open Collections to edit.","collection.delete_confirm":"Delete this collection? This cannot be undone.","collection.delete_unavailable":"Delete not available here. Open Collections to manage.","collection.select_to_share":"Select a custom collection to share","collection.share_unavailable":"Share link unavailable","collection.get_failed":"Failed to get collection","collection.copy_failed":"Failed to copy link","collection.export_json":"Export as JSON","collection.export_
273csv":"Export as CSV","collection.export_md":"Export as Markdown","collection.add_note":"Add Note","collection.edit_note":"Edit Note","collection.note_unavailable":"Note editor not available here.","collection.remove_from_favorites":"Remove from Favorites","collection.remove_from_likes":"Remove from Likes","trial.started":"Your 7-day trial has started :)","error.title":"Oops! Something went wrong","error.message":"The page you're looking for might have been moved, deleted, or doesn't exist.","error.go_home":"Go Home","error.go_back":"Go Back","error.404.title":"Page Not Found","error.404.message":"The page you are looking for does not exist.","error.check_new_clips":"Check out new movie clips","error.csrf":"Invalid CSRF token","error.passwords_mismatch":"Passwords do not match","error.loading_collections":"Error loading collections","categories.page_title":"Movie Quote Categories","categories.title":"Categories","movie.season_n":"Season {n}","movie.episode_n":"Episode {n}","movie.all_seasons":"All seasons","movie.all_episodes":"All episodes","movie.cast":"Cast","movie.all_cast":"All Cast","movie.also_watch":"Also watch","movie.reviews":"Reviews","movie.all_reviews":"All Reviews","movie.user_score":"User Score","movie.no_reviews_yet":"No reviews yet","movie.be_first_to_review":"Be the first to review this movie!","movie.go_to_movie_page":"Go to Movie Page","movie.back_to":"Back to {name}","movie.view_all_reviews":"View All {count} Reviews","movie.review.one":"review","movie.review.other":"reviews","movie.rating.overall":"Overall","movie.rating.story":"Story","movie.rating.aesthetics":"Aesthetics","movie.rating.acting":"Acting","movie.rating.sound":"Sound","movie.not_found":"Movie not found","movie.data_unavailable":"Movie data unavailable","movie.tab_about":"About","movie.tab_cast":"Cast","movie.director":"Director","movie.writer":"Writer","movie.year":"Year","movie.genre":"Genre","movie.box_office":"Box Office","movie.production":"Production","movie.awards":"Awards","movie.homepage":"Homepage","movie.part_of_collection":"Part of Collection","movie.you_might_like":"You Might Also Like","movie.watch_full":"Watch Full Movie","movie.add_to_favorites":"Add to Favorites","movie.remove_from_favorites":"Remove from Favorites","movie.added_to_favorites":"Movie added to <a href=\"favs\">favourites</a>","movie.removed_from_favorites":"Movie removed from favourites","movie.share":"Share","movie.be_first_review":"Be the first to share your thoughts on this movie","movie.view_all_cast":"View All Cast","movie.search_dialogue":"Search dialogue or scene...","movie.clear_filters":"Clear all filters","movie.reset":"Reset","movie.sort_timeline_asc":"Timeline Order →","movie.sort_timeline_desc":"Timeline Order ←","movie.sort_most_popular":"Most Popular","movie.sort_least_popular":"Least Popular","movie.sort_longest":"Longest First","movie.sort_shortest":"Shortest First","movie.bulk_download_page":"Bulk Download Page","movie.bulk_download":"Bulk Download","movie.your_review":"Your review (optional)","movie.write_your_thoughts":"Write your thoughts about the movie...","movie.save_rating":"Save Rating","movie.login_to_rate":"Please <a href=\"login\">login</a> to rate movies","movie.login_to_rate_short":"Login to rate","movie.cast_not_available":"Cast information not available.","movie.login_to_favorite":"<a href=\"login\">Log-in</a> to add movie to favourites","movie.explore_clips":"Explore <span>{count}</span> Clips","movie.player_prev":"Previous clip","movie.player_next":"Next clip","movie.player_empty":"Pick a clip below — it plays here. Swipe for the next one.","clip.like":"Like","clip.give_like":"Give Like","clip.comment_placeholder":"What do you think?","clip.download":"Download","clip.download_clip":"Download Clip","clip.watch_full_movie":"Watch Full Movie","clip.find_where_to_watch":"Find where to watch","clip.full_movie":"Full Movie","clip.share":"Share","clip.embed":"Embed","clip.get_embed_code":"Get Embed Code","collection.in_collection":"In \"{name}\"","error.generic":"Error","frontpage.search_title":"Search your favourite movie scene","frontpage.value.title":"Find the exact scene, not just the quote","frontpage.value.lead":"Clip.Cafe indexes every line spoken in movies and TV shows. Search a phrase, watch the moment it's s
273aid, and download the clip in seconds.","frontpage.value.fans.title":"For film lovers","frontpage.value.fans.text":"Track down that line stuck in your head and see it in context, with the scene around it.","frontpage.value.creators.title":"For creators","frontpage.value.creators.text":"Pull clips and GIFs for your video, edit or presentation — HD and subtitle options with PRO.","frontpage.value.filters.title":"Search like a pro","frontpage.value.filters.text":"Narrow results by movie, actor, character, director, writer, genre, year or clip length.","frontpage.popular_clips_title":"Today's Popular Clips","frontpage.spotlight_title":"In the spotlight","frontpage.new_comments":"New comments","frontpage.new_scenes":"New Scenes","frontpage.popular_clips":"Popular clips","frontpage.stats.clips":"clips","frontpage.stats.clips_tooltip":"That's one more than 4 999 999. Crazy ikr","frontpage.stats.phrases":"phrases","frontpage.stats.phrases_tooltip":"Probably more","frontpage.stats.creators":"content creators","frontpage.stats.creators_tooltip":"More than 320 000 accounts in ClipCafe","frontpage.stats.movies":"movies","frontpage.stats.movies_tooltip":"Movies with at least 1 clip","pagination.page":"Page","content.movies_by_year":"Movies by Year","content.movie_quotes_by_year":"Movie quotes by the Year","content.movies_released_from":"All Movies with quotes that were released from year","content.movie_quotes_in_year":"Movie Quotes in {year}","content.movie_quotes_from_year":"Movie Quotes from {year}","content.movies_with_quotes_in_year":"{count} movies with quotes, released in {year}","content.years":"Years","content.statistics":"Statistics","user.recently_viewed":"Recently Viewed","user.watch_history":"Your Watch History","user.login_to_view_history":"Log in to see your recently viewed clips and movies","user.sign_in_google":"Sign in with Google","user.no_clips_viewed":"No clips viewed yet. Start browsing!","user.browse_clips":"Browse Clips","user.no_movies_viewed":"No movies viewed yet.","user.pick_up_where_left":"Pick up where you left off","user.recent_clips":"Recent Clips","user.recent_movies":"Recent Movies","user.page_of":"Page {current} of {total}","user.prev":"Prev","user.next":"Next","user.favorites":"Favorites","user.likes":"Likes","user.profile":"Profile","user.settings":"Settings","user.login_required":"Authentication required","user.your_favorite_movies":"Your Favorite Movies","user.login_to_save_favorites":"Log in to save your favorite movies and create custom collections","user.your_liked_clips":"Your Liked Clips","user.login_to_save_likes":"Log in to save your favorite clips and create custom collections","user.no_liked_clips_yet":"No liked clips yet","user.start_liking_clips":"Start liking clips to build your collection!","user.free_user":"Free User","user.account_settings":"Account Settings","user.view_profile":"View Profile","user.start_watching":"Start watching and reviewing movies!","user.member_since":"Member since","user.comments":"Comments","user.collections":"Collections","user.loading_collection":"Loading collection...","user.no_reviews_yet":"No reviews yet.","user.no_favorite_movies_yet":"No favorite movies yet.","user.no_recent_activity":"No recent activity.","user.payment_successful":"Payment Successful","user.payment_thank_you":"Thank you for your payment! Your transaction has been successfully completed.","user.joined":"Joined","user.days_ago":"{n} days ago","comments.latest":"Latest Comments","comments.anon":"Anon","comments.heading":"Comments","comments.add_comment":"Add a comment","auth.login_create_account":"Login or Create Account","auth.reset_password":"Reset Your Password","auth.set_new_password":"Set New Password","auth.invalid_reset_link":"Invalid or expired reset link. Please request a new password reset.","auth.social_login_only":"This email uses social login only. Please use the Google sign-in button, or click \"Forgot your password?\" to add a password to your account.","auth.google_cancelled":"Google login cancelled or failed.","auth.facebook_cancelled":"Facebook login cancelled or failed.","auth.login_failed_retry":"Login failed. Please try again or c
273ontact support.","auth.google_failed":"Google login failed. Please try again.","auth.facebook_failed":"Facebook login failed. Please try again.","auth.linkedin_failed":"LinkedIn login failed. Please try again.","auth.social_login_failed":"Couldn't login, try other social or email us","video.play":"Play","video.pause":"Pause","video.mute":"Mute","video.unmute":"Unmute","video.enter_fullscreen":"Enter fullscreen","video.exit_fullscreen":"Exit fullscreen","video.audio_subtitles":"Audio / Subtitles","video.current_time":"Current time","video.duration":"Duration","video.seek":"Seek","video.buffered":"buffered","video.embed_share_codes":"Embed & Share Codes","video.share_this_clip":"Share this clip","video.full_transcript":"Full Transcript","video.copy_paste_codes":"Copy and paste these codes to share this clip","video.bbcode_label":"BBCode (for forums)","video.embed_code_label":"Embed Code (HTML iframe)","video.direct_link":"Direct Link","video.click_to_copy":"Click any field to copy to clipboard","payment.thank_you":"Thank you :) Payment was successful","payment.successful":"Payment was Successful!","payment.something_wrong":"Something went wrong","payment.not_received":"Payment not received","payment.pro_plans":"ClipCafe PRO Plans & Pricing","payment.secure_stripe":"Secure payment via Stripe","payment.cancel_anytime":"Cancel anytime","payment.fair_use_link":"<a href=\"https://medium.com/@clipdotcafe/avoid-copyright-strikes-how-to-use-small-movie-clips-legally-on-social-media-like-youtube-and-6888798256da\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color:#ff892e;text-decoration:underline;\">Fair-use guide</a>","payment.try_pro_free":"Try PRO for 7 days for free","payment.get_pro_crypto":"Get PRO with Crypto","payment.welcome_to_pro":"Welcome to PRO!","payment.welcome_message":"Welcome to {plan}, {name}!","payment.success_message":"Your payment was successful and your premium features are now active.","payment.unlocked":"You've unlocked:","payment.what_next":"What would you like to do next?","payment.continue_watching":"Continue Watching","payment.continue_watching_desc":"Pick up where you left off with your recently viewed clips","payment.browse_clips":"Browse Clips","payment.browse_clips_desc":"Explore our collection of movie clips and quotes","payment.popular_clips":"Popular Clips","payment.popular_clips_desc":"See what other users are watching and downloading","payment.view_profile":"View Profile","payment.view_profile_desc":"Check your account, downloads, and collections","upload.page_title":"Upload a Movie Clip","utility.offer_completed":"Offer completed :)","activity.commented_on":"commented on","activity.liked":"liked","activity.reviewed":"reviewed","activity.favourited":"favourited","modal.confirm":"Confirm","modal.cancel":"Cancel","modal.continue":"Continue","modal.login_required":"Login Required","modal.login":"Log in","modal.enter_text":"Enter text...","modal.submit":"Submit","modal.write_note":"Write a note...","modal.save":"Save","modal.success":"Success!","modal.error":"Error","modal.ok":"OK","modal.collection_options":"Collection Options","modal.rename_collection":"Rename Collection","modal.change_privacy":"Change Privacy","modal.delete_collection":"Delete Collection","modal.collection_privacy":"Collection Privacy","modal.privacy_choose":"Choose who can see this collection","modal.privacy_private":"Private","modal.privacy_private_desc":"Only you can see this collection","modal.privacy_public":"Public","modal.privacy_public_desc":"Anyone with the link can view and share","modal.add":"Add","modal.remove":"Remove","modal.create":"Create","modal.new_collection":"New collection","modal.search_collections":"Search collections...","modal.no_collections_yet":"You don't have any {type} collections yet.","modal.create_collection":"Create {type} Collection","modal.new_collection_name":"New {type} collection name","modal.collections":"Collections","user.start_favoriting_movies":"Start favoriting movies to build your collection!","user.browse_movies":"Browse Movies","user.favorite_movies":"Favorite Movies","user.recent_activity":"Recent Activity","collection.remove_selected":"Remove Selected","collection.remove_from_favorites_confirm":"Remove this movie from favorites?","collection.removed_from_favorites":"Removed from favorites","collection.note_clip":"Add a note about this clip","collection.note_movie":"Add a note about this movie","collection.remove_from_likes_confirm":"Remove this clip from likes?","collection.removed_from_likes":"Removed from likes","collection.filtering_by_tag":"Filtering by #{tag}","collection.back_to_collections":"Back to Collections","activity.liked_clip_from":"Liked a clip from","activity.commented_clip_from":"Commented on a clip from","settings.login_required":"Please log in to access this page","settings.subscription":"Subscription","settings.active_subscription_renews":"Active subscription (renews {date})","settings.active_subscription_monthly":"Active subscription (renews monthly)","settings.manage_subscriptions":"Manage Subscriptions","settings.payment_history":"Payment History","settings.date":"Date","settings.package":"Package","settings.price":"Price","settings.invoice":"Invoice","settings.payment_issue":"Payment Issue","settings.payment_failed_message":"Your last payment failed. We're retrying, but please update your payment method to avoid losing access.","settings.update_payment_method":"Update Payment Method","settings.subscription_status":"Subscription Status","settings.current_plan":"Current Plan","settings.status":"Status","settings.upgrade_for_hd":"Upgrade for HD downloads and more features!","settings.patreon_connection":"Patreon Connection","settings.patreon_id":"Patreon ID","settings.patreon_active":"Active Patron","settings.patreon_inactive":"Inactive","settings.manage_on_patreon":"Manage on Patreon","settings.disconnect_patreon":"Disconnect Patreon","settings.disconnect_patreon_confirm":"Are you sure you want to disconnect your Patreon account? You will lose PRO access if it was provided through Patreon.","patreon.thanks_title":"Thanks for being an awesome Patron!","patreon.your_id":"Your Patreon ID","patreon.our_patreon":"Our Patreon","patreon.status_not_active":"Not active","patreon.get_pro_message":"Get PRO by supporting us on Patreon","patreon.subscribe_button":"Subscribe on Patreon","patreon.recheck_hint":"Already pledging on Patreon? Re-check your pledge to activate PRO right away.","patreon.recheck_button":"Re-check my pledge","settings.preferences":"Preferences","settings.playback_controls":"Playback Controls","settings.autoplay_video":"Autoplay Video","settings.autoplay_tooltip":"Automatically play the video when you visit a clip page.","settings.mute_on_hover":"Mute on Hover","settings.mute_tooltip":"Mute audio when hovering over video thumbnails.","settings.loop_playback":"Loop Playback","settings.loop_tooltip":"Automatically replay the video when it ends.","settings.preferred_language":"Preferred Language","settings.language_description":"Set
273s the default audio and subtitle language for clips (where available).","settings.ui_language":"Website Language","settings.ui_language_description":"Choose the language for the website interface.","settings.api_keys":"API Keys","settings.documentation":"Documentation","settings.api_key":"API Key","settings.created":"Created","settings.requests":"Requests","settings.downloads":"Downloads","settings.delete_api_key_confirm":"Are you sure you want to delete this API Key?","payment.continue_to_clip":"Continue to the clip","payment.contact_support":"If all of the transactions got confirmed and PRO is still not activated, then contact us through <a href=\"https://discord.gg/kyKmte9CPp\">Discord</a> or email us: [email protected]","payment.login_required":"Login Required","payment.login_to_download":"Sign in or create an account to unlock downloads","payment.login_signup":"LOGIN / SIGN UP","payment.limit_reached":"Daily Download Limit Reached","payment.limit_reached_message":"You've used all {limit} free downloads for today. Your limit resets at midnight — or upgrade to PRO for {prolimit} HD downloads a day.","payment.unlock_hd":"Unlock HD Downloads","payment.unlock_hd_message":"You're one step away from downloading unlimited HD clips with advanced editing features","payment.what_you_get":"What You Get with PRO","payment.hd_quality":"HD Quality","payment.downloads_high_quality":"downloads in high quality","payment.convert_to":"Convert to","payment.edit_videos":"Edit videos","payment.edit_features":"Crop, cut, change speed, add subtitles","payment.bulk_download":"Bulk download","payment.multiple_clips":"multiple clips at once","payment.view_all_plans":"VIEW ALL PLANS & PRICING","payment.subscribed_to":"You are subscribed to <span style=\"color: #ff892e;\">{plan}</span>","payment.manage_subscription_desc":"Update payment method, download invoices, or cancel anytime securely via Stripe.","payment.monthly":"Monthly","payment.yearly":"Yearly","payment.save_percent":"Save {percent}%","payment.no_questions":"no questions asked","payment.immediate_access":"All plans include immediate access","auth.welcome_back":"Welcome Back","auth.sign_in_continue":"Sign in to continue to Clip.Cafe","auth.checkout_title":"Complete your {plan} purchase","auth.checkout_subtitle":"Sign in or create your account — you'll go straight to secure checkout.","auth.continue_with_google":"Continue with Google","auth.or":"or","auth.email_address":"Email Address","auth.password":"Password","auth.enter_password":"Enter your password","auth.password_requirements":"Password requirements","auth.req_length":"8+ characters","auth.req_uppercase":"Uppercase letter","auth.req_lowercase":"Lowercase letter","auth.req_number":"Number","auth.tos_notice":"By continuing, you agree to our <a href=\"termsandconditions/\" target=\"_blank\">Terms of Service</a> and <a href=\"privacypolicy/\" target=\"_blank\">Privacy Policy</a>.","auth.password_required":"Please enter your password","auth.session_expired":"Your session expired while this page was open. Refreshing…","auth.network_error":"Connection problem. Check your internet and try again.","auth.login_success_redirecting":"Login successful! Redirecting…","auth.incorrect_password":"Incorrect password. Try again, or use the “Forgot your password?” link below.","auth.activate_account_first":"Please check your email and activate your account before logging in.","auth.too_many_attempts":"Too many failed attempts. Please try again in {minutes} minutes.","auth.too_many_registrations":"Too many new accounts have been created from your network recently. Please try again later, or continue with Google.","auth.captcha_failed":"We could not verify that you are human. Please complete the check and try again, or continue with Google.","auth.password_policy":"Your password needs at least 8 characters, including an uppercase letter, a lowercase letter and a number.","auth.password_policy_new_account":"There's no account for this email yet, so signing in here will create one. Pick a password with at least 8 characters, including an uppercase letter, a lowercase letter and a number.","auth.social_login_set_password":"This email was registered with {provider}. Click “Forgot your password?” below to set a password you can sign in with.","auth.continue":"Continue","auth.sign_in":"Sign in","auth.create_account":"Create account","auth.step_returning":"Welcome back — enter your password to sign in.","auth.step_new":"No account for this email yet. Pick a password and we'll create one.","auth.step_social_google":"This email signs in with Google — use the Continue with Google button above.","auth.use_password_instead":"I have a password","auth.sign_in_create":"Sign In / Create Account","auth.forgot_password":"Forgot your password?","auth.invalid_email":"Please enter a valid email address","auth.toggle_password":"Toggle password visibility","auth.enter_new_password":"Enter your new password","auth.reenter_password":"Re-enter your password","auth.new_password":"New Password","auth.confirm_password":"Confirm Password","auth.password_must_have":"Password must have:","game.guess_the_movie":"Guess The Movie","game.your_name":"Your Name","gtm.meta_desc":"Watch a clip and Guess The Movie! Great way to discover new movies","gtm.hero_lead":"A real mov
273ie clip plays, with sound. Name the film, and see how far your three Oscars take you.","gtm.cta_play":"Play now","gtm.cta_discord":"Add to Discord","gtm.how_title":"How it works","gtm.how_watch_h":"Watch","gtm.how_watch_p":"A real clip from one of {n} films plays, with sound. Famous films come first; it gets harder the longer you last.","gtm.how_type_h":"Type","gtm.how_type_p":"Type the title and pick it from the list. A film never repeats in a run. A miss, or a skip, costs one of your three Oscars.","gtm.how_score_h":"How you score","gtm.how_score_p":"A right answer scores up to {base} points, and a little more the sooner you get it. Answer within {fast} seconds after a miss and you win an Oscar back.","gtm.stat_films":"Films","gtm.stat_clips":"Clips","gtm.stat_servers":"Servers","gtm.stats_aria":"Numbers","gtm.hints_title":"Seven hints, one use each","gtm.hints_p":"You start with three at random. Tapping one spends it. A right answer with fewer than three in hand earns a new one.","gtm.hint_director":"Director","gtm.hint_summary":"Summary","gtm.hint_writer":"Writer","gtm.hint_released":"Released","gtm.hint_poster":"Poster","gtm.hint_poster_long":"Poster (blurred)","gtm.hint_genres":"Genres","gtm.hint_first":"First letter","gtm.hint_open":"Open the {name} hint","gtm.scores_title":"High scores","gtm.scores_all":"All high scores","gtm.discord_h":"Play it in your Discord","gtm.discord_p":"Run /gtm play: real scenes as GIFs, four title buttons and a clock. Lobbies, scheduled screenings, levels 1–99 with badges from Super 8 to Golden Reel, and server leaderboards.","gtm.discord_running":"Running in {n} servers","gtm.daily_h":"The Daily Clip","gtm.daily_p":"One movie puzzle a day, the same for everyone. Keep a streak, climb the leaderboard, come back tomorrow.","gtm.daily_cta":"Play today’s puzzle","gtm.faq_title":"Questions","gtm.faq_q1":"Is it free?","gtm.faq_a1":"Yes. No account, no signup.","gtm.faq_q2":"Where do the clips come from?","gtm.faq_a2":"Clip.Cafe’s library of {clips} clips from {films} films.","gtm.faq_q3":"How is my score worked out?","gtm.faq_a3":"Up to {base} points for a right answer; the sooner you get it, the more it is worth.","gtm.faq_q4":"Can I play with friends?","gtm.faq_a4":"Yes: add the Discord bot and run /gtm play in your server.","gtm.faq_q5":"Do films repeat?","gtm.faq_a5":"Never within one run.","gtm.video_aria":"The clip","gtm.play_clip":"Play clip","gtm.exit":"Exit game","gtm.sheet_aria":"Your answer","gtm.hud_aria":"{alive} of {max} Oscars, clip {clip}, score {score}","gtm.skip_label":"Skip this clip (costs an Oscar)","gtm.oscar_lost":"Oscar lost","gtm.input_label":"Type the film’s title","gtm.input_ph":"Type the film’s title…","gtm.go":"Answer","gtm.suggest_aria":"Matching films","gtm.no_matches":"No matching films","gtm.hints_group":"Hints","gtm.close":"Close","gtm.skip_note":"Tap an Oscar to skip this clip. It costs one.","gtm.unmute":"Sound is off. Tap to unmute","gtm.copied":"Link copied","gtm.err_generic":"Something went wrong. Please try again.","gtm.err_session":"This run has expired.","gtm.err_no_clips":"No clips are available right now.","gtm.video_failed":"This clip didn't load. Tap the picture to retry, or skip it.","gtm.hint_empty":"There's nothing to show for this film, so you keep the hint.","gtm.right":"That’s right","gtm.wrong":"Nope!","gtm.skipped":"You used your Oscar.","gtm.oscars_left.one":"One Oscar left.","gtm.oscars_left.other":"{n} Oscars left.","gtm.you_typed":"You typed {answer}","gtm.right_answer_is":"Right answer is","gtm.fast_bonus":"Fast answer: Oscar back","gtm.new_hint":"New hint unlocked","gtm.score":"Score","gtm.next_clip":"Next clip","gtm.watch_clip":"Watch this clip","gtm.share":"Share","gtm.with_cast":"with {names}","gtm.and":"and","gtm.f_writers":"Writers","gtm.f_released":"Released","gtm.f_imdb":"IMDb","gtm.f_metascore":"Metascore","gtm.the_end":"The End","gtm.clips_solved.one":"{n} clip solved · your score","gtm.clips_solved.other":"{n} clips solved · your score","gtm.name_label":"Your name for the high scores","gtm.name_ph":"Your name","gtm.submit_score":"Submit your score","gtm.submit_note":"Submit to join the top {n}","gtm.new_game":"New game","gtm.last_clip":"The one that ended it","gtm.hs_page_title":"Guess The Movie - HighScores","gtm.hs_title":"High scores","gtm.hs_order":"Order","gtm.hs_best":"Best score","gtm.hs_newest":"Newest","gtm.hs_empty":"No scores yet. Be the first.","gtm.hs_note":"Top {n} of all time. Play a run and submit yours at The End.","gtm.hs_note_newest":"The {n} newest runs. Play a run and submit yours at The End.","daily.media_label":"Mystery movie clip","daily.play_pause":"Play or pause the clip","daily.type_movie":"Type a movie title…","daily.skip":"Skip","daily.archive":"Archive","daily.stats":"Statistics","daily.how_to_play":"How to play","daily.archive_title":"Past Daily Clips","daily.play_today":"Play today's clip","daily.you_got_it":"You got it!","daily.it_was":"It was","daily.lost_title":"So close!","daily.share":"Share","daily.copied":"Copied!","daily.watch_scene":"Watch the full scene","daily.try_hard":"Try Hard Mode","daily.hard_mode":"Hard Mode","daily.hard_label":"HARD","daily.hard_
273intro":"A different movie, revealed the slow way: the frame sharpens, then the scene plays, and a dossier fills in with a fact every miss. 6 guesses.","daily.back_to_normal":"Back","daily.next_clip_in":"Next clip in","daily.stats_played":"Played","daily.stats_win_pct":"Win %","daily.stats_streak":"Streak","daily.stats_max_streak":"Max streak","daily.stats_distribution":"Guess distribution","daily.earlier":"earlier","daily.later":"later","daily.higher":"higher","daily.lower":"lower","daily.pct_tail":"of players solved it in {n} or fewer","daily.col_rating":"Rating","daily.col_box":"Box office","daily.col_studio":"Studio","daily.col_director":"Director","daily.col_cast":"Cast","daily.exact":"Exact","daily.partial":"Partial","daily.no_match":"No match","daily.different":"Different","daily.none":"None","daily.n_shared":"{n} shared","daily.new_clue":"New clue","daily.with_sound":"Full scene, with sound","daily.feed_label":"Your guesses and unlocked clues","daily.correct_label":"Correct","daily.skipped_label":"Skipped","daily.skip_desc":"You traded a guess for a clip and an extra fact","daily.clue_year_genre":"Year & genres","daily.clue_clip":"2-second clip","daily.clue_quote":"A line from the scene","daily.board_label":"What we know so far","daily.board_title":"What we know about the film","daily.lbl_year":"Release year","daily.lbl_genre":"Genres","daily.lbl_rated":"Certificate","daily.lbl_runtime":"Runtime","daily.lbl_country":"Country","daily.lbl_character":"Characters","daily.lbl_cast":"Cast member","daily.lbl_director":"Director","daily.objective":"Guess the movie. Every miss unlocks another clip and another fact.","daily.guess_n_of_m":"Guess {n} of {m}","daily.n_wins":"{n} wins","daily.n_played":"{n} played","daily.board_pending":"The leaderboard switches on once the first puzzles are generated.","daily.board_empty_today":"Nobody has finished today's clip yet. Be the first.","daily.board_empty":"No ranked players yet.","daily.board_avg_min":"Minimum 5 wins to be ranked.","daily.board_error":"Could not load the leaderboard.","daily.clue_barcode":"The scene’s colour signature","daily.clue_barcode_alt":"A strip of colour, one band per moment of the scene","daily.clue_barcode_desc":"Every band is one moment of the scene, averaged to a single colour.","daily.clue_scene2":"A different scene","daily.clue_scene2_desc":"Another moment from the same film — not the one you are guessing.","daily.clue_cast":"One cast member","daily.leaderboard":"Leaderboard","daily.rank":"Rank","daily.avg_guesses":"Avg guesses","daily.sign_in":"Sign in","daily.signin_pitch":"Sign in to save your streak and join the leaderboard.","daily.synced":"{n} past games added to your account","daily.streak_milestone":"{n}-day streak!","daily.yesterday_was":"Yesterday was","daily.yesterday_unplayed":"You haven't played yesterday's clip.","daily.play_it":"Play it","daily.more_puzzles":"Play past clips","daily.play_next":"Play next clip","daily.clips_left":"Clips left to play: {n}","daily.all_caught_up":"You've played every clip so far.","xp.level":"Level {n}","xp.to_next":"{xp} XP to level {n}","xp.max_level":"Max level","xp.level_up":"Level up!","xp.signin_keep":"Sign in to keep {xp}","xp.saved":"{xp} saved to your account","daily.profile":"Profile","daily.profile_title":"Your Daily Clip","daily.profile_guest":"Sign in to keep your XP, earn medals and see every answer you've given.","daily.xp_total":"{xp} XP earned","daily.play_streak":"Play streak: {n}","daily.xp_bonus":"+{pct}% XP","daily.medals":"Medals","daily.medals_earned":"{n} of {m} earned","daily.tier_bronze":"Bronze","daily.tier_silver":"Silver","daily.tier_gold":"Gold","daily.medal_maxed":"Every tier earned","daily.medal_next":"Next: {tier}","daily.badges":"Badges","daily.history":"Your answers","daily.history_empty":"No finished clips yet. Your answers will collect here.","daily.your_guesses":"Your guesses","daily.newer":"Newer","daily.older":"Older","daily.medal_level":"Rising star","daily.medal_level_desc":"Account level","daily.medal_finished":"Regular","daily.medal_finished_desc":"Clips finished","daily.medal_days":"Devoted","daily.medal_days_desc":"Different days played","daily.medal_win_streak":"On a roll","daily.medal_win_streak_desc":"Best winning streak, in days","daily.medal_first_guess":"Sharpshooter","daily.medal_first_guess_desc":"Solved on the first guess","daily.medal_clutch":"Clutch","daily.medal_clutch_desc":"Solved on the last guess","daily.medal_hard_wins":"Hard boiled","daily.medal_hard_wins_desc":"Hard Mode clips solved","daily.medal_binge":"Binge watcher","daily.medal_binge_desc":"Most clips finished in one day","daily.medal_archive":"Archivist","daily.medal_archive_desc":"Archive clips finished","daily.badge_founder":"Founder","daily.badge_founder_desc":"Played in The Daily Clip's first two months","daily.badge_double_feature":"Double feature","daily.badge_double_feature_desc":"Finished Easy and Hard on the same day","daily.badge_completionist":"C
273ompletionist","daily.badge_completionist_desc":"Finished every Easy clip published so far","xp.tier_1":"Super 8","xp.tier_2":"16mm","xp.tier_3":"35mm","xp.tier_4":"70mm","xp.tier_5":"IMAX","xp.tier_6":"Golden Reel","daily.lets_play":"Let's play","daily.board_today":"Today","daily.board_streak":"Streaks","daily.board_wins":"Wins","daily.board_avg":"Best average","daily.mode_normal":"Easy","daily.funnel_pitch":"Try The Daily Clip — one new movie puzzle every day, with streaks and a leaderboard.","daily.funnel_cta":"Play today's clip","daily.offline_retry":"Connection problem — try again","daily.new_puzzle":"A new clip is ready!","daily.play":"Play","daily.help_html":"<h2>How to play</h2><p>Guess the movie in <b>7</b> tries.</p><p>You start with one clip playing &mdash; a scene almost nobody has watched. Every guess or skip unlocks another clip from the same film, and they arrive in order of how well known they are &mdash; so the scene everyone remembers comes last. Swipe or use the arrows to go back to any clip you have already unlocked.</p><p>The panel under the clip is what we know about the film. It opens with the genres and the year, and gains one more fact every time you miss &mdash; the characters, then the director, then one of the cast, and last the runtime, certificate and country. Skipping adds an extra one from the bottom of that list, so a skip buys a fact instead of the comparison a named guess would have given you.</p><p>Every wrong guess also tells you how your film compares with the answer on five things: <b>IMDb rating</b> (higher or lower), <b>box office</b> (bigger or smaller), <b>studio</b>, <b>director</b>, and any <b>cast</b> the two films share.</p><p>A new clip drops every day at midnight UTC. Solved it? Try <b>Hard Mode</b>: a different film, revealed the slow way &mdash; a frame that sharpens, then the scene itself, and a dossier that fills in with one fact per miss. 6 guesses.</p>","upload.search_for_movie":"Search for a movie...","aria.search_box":"Search box","aria.search_button":"Search button","aria.user_menu":"User menu","aria.close":"Close","aria.close_window":"Close window","aria.share":"Share","aria.search_in_collection":"Search in collection","aria.subtitle_languages":"Subtitle Languages","collection.options":"Collection options","movie.find_where_to_watch":"Find where to watch","movie.find_where_to_watch_full":"Find out where to watch this movie","pricing.vat_year":"+ VAT / year","pricing.vat_month":"+ VAT / month","pricing.reviews_source":"Read all reviews on Trustpilot →","pricing.hero_subtitle":"HD & 4K downloads from 5M+ clips across 20,000 movies & shows","pricing.reviews_emphasis":"Emphasis ours — reviews are quoted in full.","unsubscribe.title":"Unsubscribe","unsubscribe.done_title":"You're unsubscribed","unsubscribe.done_body":"We won't send you marketing emails again. You'll still get essential account and payment messages.","unsubscribe.failed_title":"That link didn't work","unsubscribe.failed_body":"The unsubscribe link looks incomplete or expired. Email [email protected] and we'll take you off the list by hand.","pricing.months_free_saving":"{months} months free — save ${saved}","pricing.months_free_badge":"{months} MONTHS FREE","pricing.switch_to_annual":"or pay yearly and get {months} months free →","pricing.refund_promise":"Haven't used it? Full refund, no argument. 14 days to ask.","pricing.refund_link":"Read the refund policy","pricing.fair_use_link":"<a href=\"https://medium.com/@clipdotcafe/fair-use-vs-copyright-strikes-a-survival-guide-for-youtubers-in-2026-5315af6d70bc\" target=\"_blank\" rel=\"noopener noreferrer\">Fair-use guide for creators</a>","pricing.equivalent_to":"Equivalent to ${price}/mo","survey.subscribe_question":"One quick question — what made you upgrade?","survey.subscribe_thanks":"Thanks — that genuinely helps us decide what to build next.","survey.opt_hd_quality":"HD / 4K download quality","survey.opt_editing_trim":"Trimming and editing clips","survey.opt_bulk_download":"Bulk downloading","survey.opt_daily_limit":"The free daily limit was too low","survey.opt_support_site":"To support the site","survey.opt_other":"Something else","pricing.per_mo_suffix":"/mo","pricing.billed_yearly":"Billed ${price}/year + VAT","pricing.order_now":"ORDER NOW","pricing.ready_to_upgrade":"Ready to upgrade?","pricing.join_thousands":"Join thousands of users enjoying PRO features","pricing.choose_your_plan":"Cho
273ose Your Plan","faq.title":"Frequently Asked Questions","faq.q1":"What is ClipCafe PRO?","faq.a1":"ClipCafe PRO unlocks advanced features including <span class=\"pro-highlight\">HD/4K downloads</span>, <span class=\"pro-highlight\">format conversion</span>, advanced editing tools, and bulk downloads. Choose your plan: <span class=\"pro-highlight\">PRO</span> for regular use or <span class=\"pro-highlight\">Creator</span> for unlimited access.","faq.q2":"What's the difference between PRO and Creator?","faq.a2_intro":"All plans include HD/4K downloads, editing tools, and format conversion. The difference is limits:","faq.a2_pro":"<strong>PRO ($5/month):</strong> 100 HD/4K clips per day - great for regular content creators","faq.a2_creator":"<strong>Creator ($10/month):</strong> <span class=\"pro-highlight\">Unlimited</span> HD/4K clips + bulk ZIP downloads + priority support","faq.q3":"Do I get immediate access after subscribing?","faq.a3":"Yes! Your PRO features activate <span class=\"pro-highlight\">immediately</span> after payment confirmation. You can start downloading and editing HD/4K clips right away.","faq.q4":"How do daily download limits work?","faq.a4":"Your download limit resets <span class=\"pro-highlight\">daily at midnight UTC</span>. For example, if you have PRO ($5/month) and download 50 clips today, you'll have 50 remaining today and a fresh 100 tomorrow. <span class=\"pro-highlight\">Unused downloads do not roll over</span>.","faq.q5":"What happens if I reach my daily limit?","faq.a5":"Once you reach your daily limit, you'll need to wait until the next day for your limit to reset, or you can upgrade to a higher tier for more downloads. You can still browse, search, and stream clips without limits.","faq.q6":"What quality are the downloads?","faq.a6_intro":"PRO members can download clips in multiple quality levels:","faq.a6_4k":"<strong><span class=\"pro-highlight\">4K (2160p)</span>:</strong> Available on select premium videos","faq.a6_1080p":"<strong>Full HD (1080p):</strong> Available on most videos","faq.a6_720p":"<strong>HD (720p):</strong> Standard HD quality","faq.a6_free":"Free users get <span class=\"pro-highlight\">3 SD downloads per day</span> (426p standard definition). All downloads include <span class=\"pro-highlight\">high-quality audio</span>.","faq.q7":"Can I download multiple clips at once?","faq.a7":"Yes! PRO members have access to bulk download features, allowing you to queue and download multiple clips simultaneously. This saves significant time when working on projects.","faq.q8":"What formats can I convert clips to?","faq.a8_intro":"PRO members can convert clips to multiple formats:","faq.a8_video":"<strong>Video:</strong> MP4, WEBP, AV1, GIF","faq.a8_audio":"<strong>Audio:</strong> MP3, WAV (extract audio from clips)","faq.a8_subtitles":"<strong>Subtitles:</strong> SRT, VTT (download subtitle files separately)","faq.q9":"What editing features are included?","faq.a9_intro":"PRO members have access to advanced editing tools:","faq.a9_crop":"<strong>Crop & Trim:</strong> Cut clips to exact lengths and dimensions","faq.a9_speed":"<strong>Speed Control:</strong> Change playback speed (slow motion or fast forward)","faq.a9_subtitles":"<strong>Subtitle Embedding:</strong> Add or remove subtitles from clips","faq.a9_quality":"<strong>Quality Selection:</strong> Choose your preferred resolution before download","faq.q11":"Do clips include subtitles?","faq.a11":"Most clips include accurate subtitles/transcripts. You can view them while streaming, embed them in downloads, or download subtitle files separately in SRT or VTT format.","faq.q12":"How does billing work?","faq.a12":"PRO and Creator are available monthly or annually. Monthly plans renew on the same day each month; annual plans renew once a year and work out cheaper. Your card is charged automatically and you get an email receipt after each payment.","faq.q13":"What payment methods do you accept?","faq.a13":"We use <strong><span class=\"pro-highlight\">Stripe</span></strong> for secure payment processing - the same payment system trusted by companies like <span class=\"pro-highlight\">Amazon, Google, and Shopify</span>. Stripe accepts all major credit and debit cards (Visa, Mastercard, American Express, Discover), as well as digital wallets like Apple Pay and Google Pay.","faq.a13_badge":"Bank-level encryption & PCI-DSS certified","faq.q14":"Is my payment information secure?","faq.a14":"Absolutely. We use <strong><span class=\"pro-highlight\">Stripe</span></strong>, a <span class=\"pro-highlight\">PCI-DSS Level 1 certified</span> payment processor - the highest level of security in the payment industry. Your credit card information is <span class=\"pro-highlight\">never stored on our servers</span>. All payment data is encrypted and handled directly by Stripe's secure infrastru
273cture, giving you the same level of protection used by major enterprises worldwide.","faq.q15":"Is VAT included in the price?","faq.a15":"The displayed prices ($5 or $48/year for PRO, $10 or $96/year for Creator) are base prices. VAT will be added at checkout based on your location as required by local tax laws. The final amount is shown before you confirm payment.","faq.q16":"Can I cancel anytime?","faq.a16":"Yes, you can cancel your subscription at <span class=\"pro-highlight\">any time</span> with <span class=\"pro-highlight\">no questions asked</span> and <span class=\"pro-highlight\">no cancellation fees</span>. After canceling, you'll retain PRO access until the end of your current billing period.","faq.q17":"How do I manage or cancel my subscription?","faq.a17":"You can manage your subscription by clicking the <strong><span class=\"pro-highlight\">\"Manage Subscription\"</span></strong> button in your account settings (Settings > Subscription tab). Alternatively, use the secure link provided in your subscription confirmation email to access your Stripe billing portal where you can update payment methods, view invoices, or cancel your subscription.","faq.q18":"Can I upgrade my plan?","faq.a18":"Yes! You can upgrade from PRO to Creator at any time. The upgrade takes effect <span class=\"pro-highlight\">immediately</span> and you'll be charged a <span class=\"pro-highlight\">prorated amount</span> for the remaining days in your billing cycle.","faq.q19":"What happens if my payment fails?","faq.a19":"If a payment fails, we'll retry the charge and send you an email notification. You'll have a <span class=\"pro-highlight\">grace period</span> to update your payment method via the \"Manage Subscription\" link. If payment isn't resolved, your subscription will be canceled, but you can resubscribe at any time.","faq.q20":"Do you offer refunds?","faq.a20":"We offer refunds on a case-by-case basis <span class=\"pro-highlight\">within 14 days</span> of purchase if you're not satisfied with the service. Please contact our support team at [email protected] with your account details and reason for the refund request.","faq.q21":"Can I use my subscription on multiple devices?","faq.a21":"Yes! Your PRO subscription is tied to your <span class=\"pro-highlight\">account, not a specific device</span>. You can log in and use all PRO features on <span class=\"pro-highlight\">any device</span> (desktop, tablet, mobile) as long as you're signed into your account.","faq.q22":"Are there any file size limits for downloads?","faq.a22":"<span class=\"pro-highlight\">No file size limits</span> for PRO downloads. Clips can range from a few MB to several hundred MB depending on length and quality (4K files will be larger). Your only limit is the daily download count for your tier.","faq.q23":"Can I share downloaded clips?","faq.a23":"You can use downloaded clips for personal, educational, or fair use purposes. For commercial use or public distribution, please ensure you have proper rights to the content. PRO subscriptions are for individual use and accounts should not be shared. Not sure what counts as fair use? See our guide on <a href=\"https://medium.com/@clipdotcafe/avoid-copyright-strikes-how-to-use-small-movie-clips-legally-on-social-media-like-youtube-and-6888798256da\" target=\"_blank\" rel=\"noopener noreferrer\">using small movie clips legally on social media</a>.","faq.q24":"What kind of support do I get?","faq.a24":"All PRO members receive email support. PRO+ members get priority support with faster response times. PRO++ members receive premium support with the highest priority and dedicated assistance.","faq.q25":"How do I contact support?","faq.a25":"You can reach our support team at <a href=\"mailto:[email protected]\">[email protected]</a> or join our Discord community at <a href=\"https://rebrand.ly/clipcafediscord2\" target=\"_blank\">discord.gg/clipcafe</a> for community support and updates.","faq.q26":"Still have questions?","faq.a26":"If you have any other questions not covered here, please don't hesitate to contact us at <a href=\"mailto:[email protected]\">[email protected]</a>. We're happy to help you choose the right plan and answer any concerns!","download.preview_not_available":"Preview not available","download.can_still_download":"You can still configure and download the clip","download.start":"Start","download.end":"End","download.duration":"Duration","download.full_clip":"Full Clip","download.format":"Format","download.format_mp4":"MP4 (Video)","download.format_hevc":"MP4 HEVC (Smaller)","download.format_webm":"WebM (Small)","download.format_gif":"GIF (Animation)","download.format_mp3":"MP3 (Audio)","download.format_wav":"WAV (Audio)","download.format_srt":"SRT (Subtitles)","download.format_vtt":"VTT (Subtitles)","download.requires_pro":"Requires ClipCafe Pro","download.gif_options":"GIF Options","download.gif_loop":"Lo
273op","download.gif_loop_forever":"Loop Forever","download.gif_colors_max":"Max (256)","download.gif_colors_high":"High (128)","download.gif_colors_med":"Med (64)","download.gif_colors_low":"Low (32)","download.gif_style_smooth":"Smooth","download.gif_style_retro":"Retro","download.gif_style_clean":"Clean","download.quality":"Quality","download.quality_original":"Original","download.aspect":"Aspect / Crop","download.aspect_original":"Original framing","download.aspect_9x16":"Vertical 9:16","download.aspect_4x5":"Portrait 4:5","download.aspect_1x1":"Square 1:1","download.aspect_16x9":"Widescreen 16:9","download.aspect_4x3":"Classic 4:3","download.quality_sd":"SD (426p)","download.speed":"Speed","download.speed_slow":"0.5x (Slow)","download.speed_normal":"1x (Normal)","download.speed_fast":"2x (Fast)","download.speed_custom":"Custom...","download.burn_subtitles":"Burn Subtitles","download.burn_into_video":"Burn into video","download.subtitle_language":"Subtitle Language","download.audio_track":"Audio Track","download.language":"Language","download.button":"Download","download.daily_downloads":"Daily downloads:","download.pro_features":"PRO Features:","download.upgrade_unlock":"Upgrade to unlock all features.","download.shortcuts":"Shortcuts","download.keyboard_shortcuts":"Keyboard Shortcuts","download.video_playback":"Video Playback","download.play_pause":"Play/Pause","download.seek":"Seek","download.jump_start_end":"Jump to start/end","download.reset_clip":"Reset clip","download.mute_unmute":"Mute/Unmute","download.toggle_subtitles":"Toggle subtitles","download.timeline_editing":"Timeline Editing","download.set_in_out":"Set In/Out points","download.jump_in_out":"Jump to In/Out","download.adjust_start":"Adjust start","download.adjust_end":"Adjust end","download.format_quality":"Format & Quality","download.select_quality":"Select quality","download.cycle_formats":"Cycle formats","download.audio_mode":"Audio mode","download.subtitle_mode":"Subtitle mode","download.actions":"Actions","download.close_dialog":"Close dialog","download.show_help":"Show this help","report.title":"Report Issue","report.subtitle":"Found something wrong with this clip?","report.description":"Help us maintain quality content. Report issues such as:","report.issue_subtitles":"Incorrect or missing subtitles","report.issue_info":"Wrong movie or scene information","report.issue_quality":"Video quality issues","report.issue_inappropriate":"Inappropriate content","report.issue_copyright":"Copyright violations","report.submit":"Report to Moderators","package.feature_100_clips":"100 HD/4K clips per day","package.feature_unlimited_clips":"<strong>Unlimited</strong> HD/4K clips","package.feature_editing":"All editing features","package.feature_conversion":"Format conversion — GIF, MP3, SRT + 4 more","package.feature_bulk":"Bulk downloads","package.feature_bulk_zip":"Bulk ZIP downloads","package.feature_email_support":"Email support","package.feature_priority_support":"Priority support","package.cta_start_pro":"START WITH PRO","package.cta_get_creator":"GET CREATOR","package.badge_best_value":"BEST VALUE","clip.about_this_clip":"About this clip","clip.more_from":"More from {movie}","clip.duration":"Duration","clip.duration_seconds":"{duration} seconds","clip.views":"Views","clip.timestamp_in_movie":"Timestamp in Movie","clip.uploaded":"Uploaded","clip.season":"Season","clip.episode":"Episode","clip.genres":"Genres","clip.production":"Production","clip.hd_strip_text":"Better quality available for this clip.","clip.hd_strip_cta":"Get PRO","clip.hd_strip_dismiss":"Dismiss","clip.movie_summary":"Movie Summary","clip.actors":"Actors","clip.available_in_languages":"Available in <strong>{count} languages</strong>","clip.watch_hd_get_pro":"To watch in HD, get","comments.add_comment_placeholder":"Add a comment...","comments.submit":"Comment","comments.join_conversation":"Join the conversation","comments.login_to_comment":"Log in or create an account to leave a comment","comments.login":"Log In","comments.login_to_collections":"Please <a href=\"login/\" class=\"whiteLink\">log in</a> to add to collections.","report.submitted":"Report Submitted","report.thank_you_message":"Thank y
273ou for helping us maintain quality content. Our moderation team will review your report shortly.","report.return_home":"Return to Home","error.review_spam":"Review contains spam content","error.rating_saved":"Rating saved successfully","error.database_error":"Database error","error.too_many_requests":"Too many requests","error.trial_used":"You already used your trial. <a href=\"/order\">Get PRO</a>","upload.missing_fields":"Missing required fields","upload.upload_failed":"Failed to upload file","upload.upload_success":"Clip uploaded successfully","upload.file_too_large":"File size exceeds maximum limit of 100MB","payment.banner_issue":"Payment Issue:","payment.banner_message":"Your last payment failed. Your subscription is still active while we retry.","user.anonymous":"Anonymous","auth.no_account_found":"No account found with that email address","auth.too_many_resets":"Too many reset requests. Please try again later.","auth.database_error":"Database error occurred","auth.email_sent_set_password":"We've sent you an email to set your password","auth.email_sent_reset":"Password reset email sent successfully","auth.email_send_failed":"Failed to send email","auth.invalid_or_expired_token":"Invalid or expired reset token","auth.password_too_short":"Password must be at least 8 characters long","auth.password_updated":"Password updated successfully","auth.password_update_failed":"Failed to update password","collection.untitled":"Collection","search.placeholder":"Search a quote or a movie","nav.new_badge":"NEW","nav.search_tooltip":"Search for Movie quote","player.audio":"Audio","player.subtitles":"Subtitles","player.subtitles_off":"Off","player.preferred_lang_set":"Preferred language set to {lang}","player.audio_language":"Audio language","player.subtitle_language":"Subtitle language","player.audio_label":"Audio: {lang}","download.preparing":"Preparing download...","download.download_started":"Download started!","download.processing_video":"Processing video...","download.processing_video_time":"Processing video... {seconds}s","download.starting_download":"Starting download...","download.downloading_progress":"Downloading {size} MB ({percent}%)","download.downloading_size":"Downloading {size} MB...","download.download_complete":"Download complete!","download.error_retry":"Error - Click to retry","limit.title":"Daily Download Limit Reached","limit.reached":"You have reached your daily download limit of {limit} downloads.","limit.current_today":"Current downloads today:","limit.reset_in":"Your limit will reset in:","limit.calculating":"Calculating...","limit.upgrade_prompt":"Upgrade for higher daily limits:","limit.plan_limit":"{plan}: {count} downloads per day","limit.plan_unlimited":"{plan}: unlimited downloads per day","limit.upgrade_now":"Upgrade Now","limit.refresh":"Refresh Limits","limit.refreshing":"Refreshing...","limit.refreshed":"Limits Refreshed!","limit.downloads_available":"Great! You now have {count} downloads available. You can close this dialog and continue downloading.","limit.still_at_limit":"Limits refreshed, but you are still at your daily limit. Your subscription may need time to process.","limit.refresh_failed":"Failed to refresh limits. Please try again.","limit.reset_now":"Now! You can try downloading again.","bulk.already_in_progress":"Bulk download already in progress. Please wait for it to complete or cancel it first.","bulk.confirm_page":"This will download all clips on this page from \"{movie}\"{details}.","bulk.confirm_all":"This will download all {count} clips from \"{movie}\" one by one.","bulk.each_counts":"Each clip counts towards your daily download limit.","bulk.pause_resume_cancel":"You can pause/resume or cancel at any time.","bulk.continue_confirm":"Continue with bulk download?","bulk.title":"Bulk Download in Progress","bulk.downloading_from":"Downloading clips from \"{movie}\"","bulk.loading_list":"Loading clip list... ({current} / {total})","bulk.stats":"Downloaded: {downloaded} | Failed: {failed} | Remaining: {remaining}","bulk.pause":"Pause","bulk.resume":"Resume","bulk.cancel":"Cancel","bulk.background_note":"Downloads continue in background. Keep tab open for best results.","bulk.status_paused":"Paused","bulk.status_rate_limit":"Rate limit reached","bulk.status_downloading":"Downloading","bulk.partial_warning":"You can only download {count} more clips today.","bulk.partial_confirm":"Continue with partial download?","bulk.error_starting":"Error starting bulk download: {error}","bulk.button_text":"Bulk Download","bulk.loading":"Loading...","bulk.resuming":"Resuming...","pro.required_title":"PRO Subscription Required","pro.bulk_premium":"Bulk download is a premium feature available to PRO subscribers only.","pro.benefits_title":"PRO Benefits:","pro.benefit_plan_limit":"{plan}: {count} HD/4K downloads per day + bulk downloads","pro.benefit_plan_unlimited":"{plan}: unlimited HD/4K downloads + bulk ZIP downloads","pro.benefit_bulk_included":"Bulk downloads on every paid plan","pro.benefit_hd":"HD Quality downloads","pro.get_pro":"Get PRO","common.close":"Close","movie.rating_submitted":"Rating Submitted!","movie.thank_you_rating":"Thank y
273ou for rating this movie","movie.your_review_label":"Your Review:","clip.screenshot":"Screenshot","download.audio_muted":"Audio muted","download.audio_unmuted":"Audio unmuted","video.formats_require_pro":"Some formats require PRO","video.speed_requires_pro":"Speed options require PRO","bulk.all_completed":"All downloads completed!","bulk.complete_title":"Bulk Download Complete!","bulk.successfully_downloaded":"Successfully downloaded:","bulk.failed_downloads":"Failed downloads:","bulk.close_dialog":"You can close this dialog now.","apikeys.login_required":"Log in to see your API-Keys","apikeys.closed_title":"The Clip.Cafe API is closed","apikeys.closed_body":"The API is no longer offered and new keys are not issued. No subscription includes API access.","apikeys.title":"Your API-Keys","apikeys.generate":"Generate new key","apikeys.documentation":"Documentation","apikeys.col_key":"API-Key","apikeys.col_date":"Date created","apikeys.col_tier":"Tier","apikeys.col_requests":"Requests","apikeys.col_downloads":"Downloads","apikeys.col_delete":"Delete","apikeys.confirm_generate":"Generate a new API key?","apikeys.confirm_delete":"Are you sure you want to delete this API key? This action cannot be undone.","collection.login_to_search":"+ Login to search in your collections","collection.create_collection":"+ Create movie collection","collection.create_to_search":"+ Create movie collection to search within","collection.movies_count":"{count} movies","movie.unknown_movie":"Unknown Movie","comment.login_required":"Please log in to comment.","comment.clip_not_found":"Clip not found.","comment.rate_limited":"Too many comment attempts. Please wait before posting again.","comment.spam_blocked":"Comment contains spam content and was blocked.","comment.too_short":"Comment is too short (minimum 4 characters).","comment.fields_required":"Comment and clip ID are required.","video.pro_required_hd":"Need PRO account for HD quality","video.pro_feature_required":"PRO Feature Required","video.pro_subtitle_burn":"Burning non-English subtitles into video requires a PRO subscription.","video.pro_subtitle_download":"Downloading subtitles in languages other than English requires a PRO subscription.","video.upgrade_to_pro":"Upgrade to PRO","video.go_back":"Go Back","video.file_not_found":"Video File Not Found","video.file_unavailable":"The video file is temporarily unavailable. This issue has been logged.","video.download_link_expired":"This download link has expired. Please refresh the page and try again.","lang_detect.title":"Language Detected","lang_detect.message":"We noticed your browser is set to {language}. The site has been switched to match your preference.","lang_detect.continue":"Continue in {language}","lang_detect.switch_english":"Switch to English","daily.board_next":"Next miss reveals","daily.lbl_quote":"A line from the scene","daily.about":"About the same","daily.clue_scene3_desc":"The most-watched scene from this film.","daily.frame_alt":"A frame from the mystery movie clip","daily.seo_desc_today":"Guess the movie from one clip. You start with a scene almost nobody knows, and every miss unlocks another clip from the same film. Free, new every day.","daily.seo_desc_dated":"Play The Daily Clip #{no} from {date}. Guess the movie in {n} tries: you start with a scene almost nobody knows, and every miss unlocks another clip from the same film. Free, no sign-up.","daily.seo_desc_dated_stats":"The Daily Clip #{no} from {date}: {players} players took it on, {pct}% solved it, and the winners needed {avg} guesses on average. Play it yourself in {n} tries.","daily.seo_desc_archive":"Every past Daily Clip puzzle — {n} movie clips to guess, one per day. Pick any date and play it in full, free and with no sign-up.","daily.seo_desc_leaderboard":"The Daily Clip leaderboard — longest streaks, most wins, best average and today's fastest solvers in the daily movie guessing game.","daily.seo_stats_line":"{players} players have tried this one. {pct}% got it, in {avg} guesses on average.","daily.archive_intro":"Every Daily Clip published so far — {n} puzzles. Each one plays exactly like today's: {g} guesses, and every miss reveals a little more of the film.","daily.about_h2":"About The Daily Clip","daily.about_p1":"One movie scene, seven guesses, a new puzzle every day at midnight UTC. The clip is drawn from the Clip.Cafe library of film scenes, so the answer is always a real film with a real scene behind it — and when you finish you can watch that scene in full.","daily.about_p2":"C
273ome back tomorrow to build a streak, or dig into the archive and play every puzzle you have missed. Sign in and your streak, wins and average follow you across devices and onto the leaderboard.","daily.reel_label":"Clips unlocked so far","daily.reel_slide":"Clip {n} of {m}","daily.reel_prev":"Previous clip","daily.reel_next":"Next clip","search.name_fallback_notice":"clips from movies, cast and characters matching &ldquo;{word}&rdquo; &mdash; no exact match in the dialogue.","find.name_fallback_notice":"No exact match for what you typed — showing clips from movies, cast and characters with a matching or similar name.","search.fuzzy_fallback_notice":"clips matching a close spelling of &ldquo;{word}&rdquo; &mdash; nothing says it exactly as typed.","search.mixed_fallback_notice":"clips matching &ldquo;{word}&rdquo; read as a quote plus a movie, cast or character name — nothing says all of it.","search.title_fallback_notice":"clips from the movie &ldquo;{word}&rdquo;.","find.title_fallback_notice":"Showing clips from the movie {name}.","find.mixed_fallback_notice":"No clip says all of that — read as a quote plus a movie, cast or character name.","find.rate_limited":"Too many searches — please wait {secs}s and try again.","daily.give_up":"Give up","daily.give_up_confirm":"Give up and see the answer?","daily.give_up_yes":"Show me the answer","daily.give_up_no":"Keep playing","daily.streak_chip":"Current streak: {n}","daily.coach_guess":"Recognise it? Type the movie here.","daily.coach_skip":"No idea yet? Skip — it buys the next clip and an extra fact.","daily.coach_dismiss":"Dismiss","daily.pct_lost":"of players also missed this one","review.prompt_title":"Like what we're doing?","review.prompt_stars_hint":"Opens Trustpilot","review.prompt_star_label":"Rate {count} out of 5","review.prompt_later":"Maybe later","review.prompt_close":"Close","review.prompt_thanks":"Thank you! Opening Trustpilot…","review.prompt_body":"A star rating helps us keep improving Clip.Cafe.","lang.en":"English","lang.fr":"French","lang.es":"Spanish","lang.de":"German","lang.it":"Italian","lang.pt":"Portuguese","lang.nl":"Dutch","lang.pl":"Polish","lang.ro":"Romanian","lang.hu":"Hungarian","lang.bg":"Bulgarian","lang.cs":"Czech","lang.sk":"Slovak","lang.sl":"Slovenian","lang.hr":"Croatian","lang.sr":"Serbian","lang.bs":"Bosnian","lang.mk":"Macedonian","lang.sq":"Albanian","lang.el":"Greek","lang.tr":"Turkish","lang.uk":"Ukrainian","lang.ru":"Russian","lang.be":"Belarusian","lang.sv":"Swedish","lang.da":"Danish","lang.no":"Norwegian","lang.fi":"Finnish","lang.is":"Icelandic","lang.ja":"Japanese","lang.ko":"Korean","lang.zh":"Chinese","lang.th":"Thai","lang.vi":"Vietnamese","lang.id":"Indonesian","lang.ms":"Malay","lang.tl":"Filipino","lang.my":"Burmese","lang.km":"Khmer","lang.lo":"Lao","lang.hi":"Hindi","lang.ta":"Tamil","lang.te":"Telugu","lang.bn":"Bengali","lang.mr":"Marathi","lang.gu":"Gujarati","lang.kn":"Kannada","lang.ml":"Malayalam","lang.pa":"Punjabi","lang.or":"Odia","lang.as":"Assamese","lang.ur":"Urdu","lang.ne":"Nepali","lang.si":"Sinhala","lang.ar":"Arabic","lang.fa":"Persian","lang.he":"Hebrew","lang.ku":"Kurdish","lang.sw":"Swahili","lang.af":"Afrikaans","lang.am":"Amharic","lang.zu":"Zulu","lang.ca":"Catalan","lang.eu":"Basque","lang.gl":"Galician","lang.cy":"Welsh","lang.ga":"Irish","lang.gd":"Scottish Gaelic","lang.et":"Estonian","lang.lv":"Latvian","lang.lt":"Lithuanian","lang.ka":"Georgian","lang.hy":"Armenian","lang.az":"Azerbaijani","lang.kk":"Kazakh","lang.uz":"Uzbek","lang.tg":"Tajik","lang.mn":"Mongolian"};window.CURRENT_LANG = "en";window.LANG_AUTO_DETECTED=false;window.I18N_LANGUAGES={"en":{"name":"English","nativeName":"English","flag":"gb","dir":"ltr"},"es":{"name":"Spanish","nativeName":"Español","flag":"es","dir":"ltr"},"pt":{"name":"Portuguese","nativeName":"Português","flag":"br","dir":"ltr"},"fr":{"name":"French","nativeName":"Français","flag":"fr","dir":"ltr"},"de":{"name":"German","nativeName":"Deutsch","flag":"de","dir":"ltr"},"it":{"name":"Italian","nativeName":"Italiano","flag":"it","dir":"ltr"},"tr":{"name":"Turkish","nativeName":"Türkçe","flag":"tr","dir":"ltr"},"zh":{"name":"Chinese","nativeName":"中文","flag":"cn","dir":"ltr"},"ja":{"name":"Japanese","nativeName":"日本語","flag":"jp","dir":"ltr"},"ko":{"name":"Korean","nativeName":"한국어","flag":"kr","dir":"ltr"},"id":{"name":"Indonesian","nativeName":"Bahasa Indonesia","flag":"id","dir":"ltr"}
273,"ar":{"name":"Arabic","nativeName":"العربية","flag":"sa","dir":"ltr"}};(function(){try{var ls=localStorage.getItem("preferred_lang");if(!ls||ls===CURRENT_LANG){if(CURRENT_LANG)localStorage.setItem("preferred_lang",CURRENT_LANG);return}if(/[?&]lang=/.test(location.search)){localStorage.setItem("preferred_lang",CURRENT_LANG);return}if(sessionStorage.getItem("_lr"))return;sessionStorage.setItem("_lr","1");document.cookie="preferred_lang="+ls+";path=/;max-age=31536000;SameSite=Lax"+(location.protocol==="https:"?";Secure":"");location.reload()}catch(e){}})();</script>
273<script src="js/i18n.js?i=1770154920" defer></script>
273<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/hls.min.js" defer></script>
273<script>window.LANG_CONFIG = {"labels":{"en":"English","fr":"French","es":"Spanish","de":"German","it":"Italian","pt":"Portuguese","nl":"Dutch","pl":"Polish","ro":"Romanian","hu":"Hungarian","bg":"Bulgarian","cs":"Czech","sk":"Slovak","sl":"Slovenian","hr":"Croatian","sr":"Serbian","bs":"Bosnian","mk":"Macedonian","sq":"Albanian","el":"Greek","tr":"Turkish","uk":"Ukrainian","ru":"Russian","be":"Belarusian","sv":"Swedish","da":"Danish","no":"Norwegian","fi":"Finnish","is":"Icelandic","ja":"Japanese","ko":"Korean","zh":"Chinese","th":"Thai","vi":"Vietnamese","id":"Indonesian","ms":"Malay","tl":"Filipino","my":"Burmese","km":"Khmer","lo":"Lao","hi":"Hindi","ta":"Tamil","te":"Telugu","bn":"Bengali","mr":"Marathi","gu":"Gujarati","kn":"Kannada","ml":"Malayalam","pa":"Punjabi","or":"Odia","as":"Assamese","ur":"Urdu","ne":"Nepali","si":"Sinhala","ar":"Arabic","fa":"Persian","he":"Hebrew","ku":"Kurdish","sw":"Swahili","af":"Afrikaans","am":"Amharic","zu":"Zulu","ca":"Catalan","eu":"Basque","gl":"Galician","cy":"Welsh","ga":"Irish","gd":"Scottish Gaelic","et":"Estonian","lv":"Latvian","lt":"Lithuanian","ka":"Georgian","hy":"Armenian","az":"Azerbaijani","kk":"Kazakh","uz":"Uzbek","tg":"Tajik","mn":"Mongolian"},"aliases":{"eng":"en","enu":"en","fra":"fr","fre":"fr","spa":"es","spn":"es","esp":"es","deu":"de","ger":"de","ita":"it","por":"pt","pob":"pt","ptu":"pt","rus":"ru","jpn":"ja","jap":"ja","kor":"ko","zho":"zh","chi":"zh","cmn":"zh","yue":"zh","ara":"ar","hin":"hi","nld":"nl","dut":"nl","pol":"pl","tur":"tr","swe":"sv","dan":"da","nor":"no","nob":"no","nno":"no","nn":"no","nb":"no","fin":"fi","ces":"cs","cze":"cs","ell":"el","gre":"el","heb":"he","tha":"th","vie":"vi","ind":"id","msa":"ms","may":"ms","ukr":"uk","ron":"ro","rum":"ro","hun":"hu","bul":"bg","srp":"sr","hrv":"hr","bos":"bs","slv":"sl","slk":"sk","fil":"tl","tgl":"tl","lao":"lo","tam":"ta","tel":"te","mar":"mr","ben":"bn","nep":"ne","sin":"si","fas":"fa","per":"fa","cat":"ca","glg":"gl","eus":"eu","baq":"eu","cym":"cy","gle":"ga","gla":"gd","mkd":"mk","mac":"mk","sqi":"sq","alb":"sq","bel":"be","isl":"is","ice":"is","mya":"my","bur":"my","khm":"km","guj":"gu","kan":"kn","mal":"ml","pan":"pa","ori":"or","asm":"as","urd":"ur","kur":"ku","swa":"sw","afr":"af","amh":"am","zul":"zu","est":"et","lav":"lv","lit":"lt","kat":"ka","geo":"ka","hye":"hy","arm":"hy","aze":"az","kaz":"kk","uzb":"uz","tgk":"tg","mon":"mn"},"flags":{"en":"gb","fr":"fr","es":"es","de":"de","it":"it","pt":"pt","nl":"nl","pl":"pl","ro":"ro","hu":"hu","bg":"bg","cs":"cz","sk":"sk","sl":"si","hr":"hr","sr":"rs","bs":"ba","mk":"mk","sq":"al","el":"gr","tr":"tr","uk":"ua","ru":"ru","be":"by","sv":"se","da":"dk","no":"no","fi":"fi","is":"is","ja":"jp","ko":"kr","zh":"cn","th":"th","vi":"vn","id":"id","ms":"my","tl":"ph","my":"mm","km":"kh","lo":"la","hi":"in","ta":"in","te":"in","bn":"in","mr":"in","gu":"in","kn":"in","ml":"in","pa":"in","or":"in","as":"in","ur":"pk","ne":"np","si":"lk","ar":"sa","fa":"ir","he":"il","ku":"iq","sw":"ke","af":"za","am":"et","zu":"za","ca":"es","eu":"es","gl":"es","cy":"gb","ga":"ie","gd":"gb","et":"ee","lv":"lv","lt":"lt","ka":"ge","hy":"am","az":"az","kk":"kz","uz":"uz","tg":"tj","mn":"mn"}};window.PRO_PLANS = [{"name":"PRO","downloads":100,"unlimited":false},{"name":"Creator","downloads":9999,"unlimited":true}];window.isLoggedIn = false;window.USER_PREFERRED_LANG = "";</script>
273<script src="js/autocomplete-unified.js?i=1780551707" defer></script>
273<script src="js/search-select.js?i=1769240009" defer></script>
273<script src="js/player-ui.js?i=1789148030" defer></script>
273<script src="js/ui-telemetry.js?i=1790426671" defer></script>
273<script onload="initMain();" src="js/main_min.js?i=1790426701" defer></script>
273
274      
275      
275<script>
276	if (typeof startunder !== 'function') { var startunder = function() { return true; }	}
277	if (typeof initAds !== 'function') { var initAds = function() { return true; }	}
278	</script>
278
279      
280        
280<script>
281            function initMain(){
282                var lazyLoadInstance = new LazyLoad({
283                    elements_selector: ".lazyImg",
284                    threshold: 700,
285                    class_error: "lazyImgError"
286                });
287
288                if(getCookie('floater')){
289                    
290                }
291
292                
293
294                if(typeof showLangDetectedDialog==='function')showLangDetectedDialog();
295            }
296          
297            window.addEventListener('load', () => {
298                registerSW();
299              });
300           
301              // Register the Service Worker
302              async function registerSW() {
303                if ('serviceWorker' in navigator) {
304                  try {
305                    await navigator.serviceWorker.register('/serviceworker.js');
306                  }
307                  catch (e) {
308                    // Silent fail - SW is optional for functionality
309                  }
310                }
311              }
312
313
314        </script>
314
315
316
317      
317<script>
318
319      function toggleNavDropdown(event, id) {
320          event.preventDefault();
321          event.stopPropagation();
322          
323          var dropdown = document.getElementById(id);
324          var allDropdowns = document.getElementsByClassName('nav-dropdown');
325          var isCurrentlyOpen = dropdown.classList.contains('show');
326
327          // Close all dropdowns first
328          for (var i = 0; i < allDropdowns.length; i++) {
329              allDropdowns[i].classList.remove('show');
330          }
331          
332          // Re-open if it wasn't open
333          if (!isCurrentlyOpen && dropdown) {
334              dropdown.classList.add('show');
335          }
336      }
337
338      // Close dropdowns when clicking outside
339      document.addEventListener('click', function(e) {
340          if (!e.target.closest('.nav-dropdown-wrapper')) {
341              var dropdowns = document.getElementsByClassName('nav-dropdown');
342              for (var i = 0; i < dropdowns.length; i++) {
343                  dropdowns[i].classList.remove('show');
344              }
345          }
346      });
347
348      // Toggle mobile language menu
349      function toggleMobileLangMenu() {
350          var switcher = document.querySelector('.mobile-lang-switcher');
351          if (switcher) {
352              switcher.classList.toggle('open');
353          }
354      }
355
356      // Switch language by setting cookie + localStorage and reloading
357      function switchLanguage(lang) {
358          // Fired BEFORE the cookie is rewritten, and it is the only signal that separates a
359          // deliberate choice from Accept-Language detection: I18n::init() writes the DETECTED
360          // language into preferred_lang on the very first request, so from then on the cookie
361          // proves only that the visitor has been here, never that anyone picked anything.
362          // CCTrack.event() sends keepalive, which is what survives the reload two lines down.
363          try {
364              var from = window.CURRENT_LANG || '';
365              if (window.CCTrack && from !== lang) {
366                  window.CCTrack.event('ui_language_switched', { from: from, to: lang });
367              }
368          } catch(e) {}
369          document.cookie = 'preferred_lang=' + lang + ';path=/;max-age=31536000;SameSite=Lax' + (location.protocol === 'https:' ? ';Secure' : '');
370          try { localStorage.setItem('preferred_lang', lang); } catch(e) {}
371          window.location.reload();
372      }
373      </script>
373
374      </head>
375      <body class="preload"><a href="https://clip.cafe/cdn-cgi/content?id=4snpvcUq5TNUAGlOlNRXFFhy39r896Qty7krE4vSIpM-1790913533.8056014-1.2.1.1-7IXDOkfur1sgHC6JeW84oi_zGxvhTXJAi06aaINtsvOInu7nOvWJWvNBghJ8ZLx1" aria-hidden="true" rel="nofollow noopener" style="display: none !important; visibility: hidden !important"></a>
376        <!-- WalkStreet Banner -->
377        <div id="walkstreet-banner" style="display:none;">
378            <a href="https://walkstreetgame.com/?utm_source=clipcafe&utm_medium=banner&utm_campaign=topbar&utm_content=battery_friendly" target="_blank" rel="noopener" id="walkstreet-link">
379                <img class="ws-banner-icon" src="img/walkstreet-icon.png" width="46" height="46" alt="WalkStreet">
380                <span class="ws-banner-body">
381                    <span class="ws-banner-text"><b>A GPS game that won't kill your battery.</b> WalkStreet plays in your pocket with the screen off — walk real streets, claim real buildings, and build an empire without draining your phone or your attention.</span>
382                    <span class="banner-cta">Play WalkStreet</span>
383                </span>
384            </a>
385            <button id="walkstreet-close" aria-label="Close banner">×</button>
386        </div>
387        
387<script>
388            (function(){
389                // Check if banner was dismissed
390                try {
391                if(!localStorage.getItem('hide_walkstreet_banner')){
392                    var banner = document.getElementById('walkstreet-banner');
393                    if(banner){
394                        banner.style.display = 'flex';
395                        // Delayed slide-up entrance
396                        setTimeout(function(){
397                            banner.classList.add('ws-show');
398                            document.body.classList.add('has-banner');
399                        }, 1200);
400
401                        // Close handler — slide out, then hide
402                        document.getElementById('walkstreet-close').addEventListener('click', function(e){
403                            e.preventDefault();
404                            banner.classList.remove('ws-show');
405                            document.body.classList.remove('has-banner');
406                            setTimeout(function(){ banner.style.display = 'none'; }, 400);
407                            localStorage.setItem('hide_walkstreet_banner', '1');
408                        });
409                    }
410                }
411                } catch(e) {}
412            })();
413        </script>
413
414
415
416      
417      
417<script>
418        // Remove preload class after page loads to enable transitions
419        window.addEventListener('load', function() {
420          document.body.classList.remove('preload');
421          try { sessionStorage.removeItem('_lr'); } catch(e) {}
422        });
423      </script>
423
424      
425      <form id="searchForm" name="searchForm" onsubmit="event.preventDefault(); searchNow(event);" action="/" method="GET">
426
427      <header class="page-header">
428      <nav>
429        <div class="trigger-menu-wrapper">
430         
431                <a class="logo" href="/" title="Go to homepage"><img src="img/clipcafe-logo.svg" alt="Clip Cafe logo" height="30" width="35"> <span>ClipCafe</span></a>
432                <a href="https://www.help99.co/our-initiatives#active-campaigns" rel="noopener nofollow" title="Help Ukraine" class="uaflag"></a>
433                
434                <div class="hidefrommobile">
435
436                     <a class="glowwhite login-link" href="login/" aria-label="Login" title="Login">
437            <i class="bi bi-person-circle login-icon" aria-hidden="true"></i><span class="login-text">Login</span>
438        </a>
439
440                    <div class="nav-dropdown-wrapper">
441                        <span class="nav-link glowwhite" style="cursor:pointer" onclick="toggleNavDropdown(event, 'browse-dropdown')">Browse <span class="user-dropdown-arrow" style="font-size: 10px;">▼</span></span>
442                        <div class="nav-dropdown" id="browse-dropdown">
443                            <a href="spotlight/" class="nav-dropdown-item">
444                                <span class="nav-dropdown-icon"><i class="bi bi-camera-reels-fill"></i></span>
445                                <div class="nav-dropdown-info">
446                                    <span class="nav-dropdown-title">Spotlight</span>
447                                    <span class="nav-dropdown-desc">Curated highlights</span>
448                                </div>
449                            </a><a href="categories/" class="nav-dropdown-item">
450                                <span class="nav-dropdown-icon"><i class="bi bi-grid-fill"></i></span>
451                                <div class="nav-dropdown-info">
452                                    <span class="nav-dropdown-title">Genres</span>
453                                    <span class="nav-dropdown-desc">Browse by category</span>
454                                </div>
455                            </a><a href="movies-by-year" class="nav-dropdown-item">
456                                <span class="nav-dropdown-icon"><i class="bi bi-calendar-event-fill"></i></span>
457                                <div class="nav-dropdown-info">
458                                    <span class="nav-dropdown-title">Years</span>
459                                    <span class="nav-dropdown-desc">Browse by year</span>
460                                </div>
461                            </a>
462                        </div>
463                    </div>
464
465                    <a class="glowwhite" href="https://discord.gg/kyKmte9CPp" target="_blank" rel="noopener" title="Discord">
466                        Discord
467                    </a>
468
469                    <div class="nav-dropdown-wrapper">
470                        <span class="nav-link glowwhite" style="cursor:pointer;position:relative" onclick="toggleNavDropdown(event, 'games-dropdown')">Games<span class="badge-new-pulse">NEW</span></span>
471                        <div class="nav-dropdown" id="games-dropdown">
472                            <a href="https://gtm.clip.cafe/" class="nav-dropdown-item">
473                                <span class="nav-dropdown-icon">🎬</span>
474                                <div class="nav-dropdown-info">
475                                    <span class="nav-dropdown-title">Guess The Movie</span>
476                                    <span class="nav-dropdown-desc">The classic movie quiz</span>
477                                </div>
478                            </a><a href="https://daily.clip.cafe/" class="nav-dropdown-item">
479                                <span class="nav-dropdown-icon">🍿</span>
480                                <div class="nav-dropdown-info">
481                                    <span class="nav-dropdown-title nav-dropdown-title-new">The Daily Clip<span class="badge-new-pulse">NEW</span></span>
482                                    <span class="nav-dropdown-desc">New puzzle every day!</span>
483                                </div>
484                            </a><a href="https://clipcafe.games/" class="nav-dropdown-item" target="_blank" rel="noopener">
485                                <span class="nav-dropdown-icon">🚀</span>
486                                <div class="nav-dropdown-info">
487                                    <span class="nav-dropdown-title">Party Game</span>
488                                    <span class="nav-dropdown-desc">Multiplayer fun!</span>
489                                </div>
490                            </a>
491                        </div>
492                    </div>
493
494                    <a class="get-pro-btn" href="pro" title="Unlock HD downloads and premium features"><i class="bi bi-star-fill"></i> Upgrade</a>
495
496                </div>
497
498                <!-- Mobile top bar: Upgrade pill + user menu. Search and the drawer toggle live in the bottom dock. -->
499                <a class="get-pro-btn get-pro-btn-top hidefrompc" href="pro" title="Unlock HD downloads and premium features"><i class="bi bi-star-fill"></i> Upgrade</a>
500                <div class="hidefrompc">
501                     <a class="glowwhite login-link" href="login/" aria-label="Login" title="Login">
502            <i class="bi bi-person-circle login-icon" aria-hidden="true"></i><span class="login-text">Login</span>
503        </a>
504                </div>
505           
506            
507            <input type="checkbox" id="searchToggle">
508            <div class="search-bar" id="nav">
509
510
511                <label for="searchToggle" class="searchButtonClose">
512                    <img src="img/close.svg" height="35" width="35" alt="Close">
513                </label>
514
515                    
516                <div id="searchbox">
517                    
518                        <input type="search" class="buttonWhite searchField" id="searchinclips" name="s" value="" aria-label="Search box" dir="ltr" spellcheck=false autocomplete="off" autocapitalize="off" maxlength="2048" tabindex="1">
519                        <input type="hidden" name="usersearch" value="1">
520                        <button type="submit" aria-label="Search button"><img src="img/search.svg" height="25" width="25" alt="Search button"></button>
521                </div>
522
523
524        
525
526            </div>
527
528            
529        </div>
530
531    
532    <div class="mobile-dock" role="navigation" aria-label="Menu">
533        <div class="dock-sheet" id="dockGamesSheet">
534            <a href="https://gtm.clip.cafe/" class="nav-dropdown-item">
535                                <span class="nav-dropdown-icon">🎬</span>
536                                <div class="nav-dropdown-info">
537                                    <span class="nav-dropdown-title">Guess The Movie</span>
538                                    <span class="nav-dropdown-desc">The classic movie quiz</span>
539                                </div>
540                            </a><a href="https://daily.clip.cafe/" class="nav-dropdown-item">
541                                <span class="nav-dropdown-icon">🍿</span>
542                                <div class="nav-dropdown-info">
543                                    <span class="nav-dropdown-title nav-dropdown-title-new">The Daily Clip<span class="badge-new-pulse">NEW</span></span>
544                                    <span class="nav-dropdown-desc">New puzzle every day!</span>
545                                </div>
546                            </a><a href="https://clipcafe.games/" class="nav-dropdown-item" target="_blank" rel="noopener">
547                                <span class="nav-dropdown-icon">🚀</span>
548                                <div class="nav-dropdown-info">
549                                    <span class="nav-dropdown-title">Party Game</span>
550                                    <span class="nav-dropdown-desc">Multiplayer fun!</span>
551                                </div>
552                            </a>
553        </div>
554        <a class="dock-item" id="dockHome" href="/">
555            <i class="bi bi-house-door-fill dock-icon" aria-hidden="true"></i>
556            <span class="dock-label">Home</span>
557        </a>
558        <label class="dock-item" id="dockSearch" for="searchToggle" title="Search for Movie quote" onclick="setTimeout(() => { document.getElementById('searchinclips').focus();}, 100);">
559            <span class="dock-count" id="dockSearchCount" hidden></span>
560            <i class="bi bi-search dock-icon" aria-hidden="true"></i>
561            <span class="dock-label">Search</span>
562        </label>
563        <button type="button" class="dock-item" id="dockGames" data-new-games="daily" aria-expanded="false" aria-controls="dockGamesSheet">
564            <span class="dock-icon-wrap"><span class="dock-new-dot"></span><i class="bi bi-controller dock-icon" aria-hidden="true"></i></span>
565            <span class="dock-label">Games</span>
566        </button>
567        <button type="button" class="dock-item dock-menu" aria-label="Open Menu">
568            <i class="bi bi-list dock-icon" aria-hidden="true"></i>
569            <span class="dock-label">Menu</span>
570        </button>
571    </div>
572
573    <div class="menu">
574        <div class="menu-inner">
575
576            <li class="mobile-lang-switcher"><div class="mobile-lang-current" onclick="toggleMobileLangMenu()"><span class="mobile-lang-label"><i class="bi bi-globe2"></i> Language</span><span class="mobile-lang-value"><img src="https://flagcdn.com/w40/gb.png" width="20" height="15" alt="" style="border-radius: 2px; vertical-align: middle;"> English <span class="mobile-lang-arrow">▼</span></span></div><div class="mobile-lang-options" id="mobile-lang-options"><a href="#" onclick="switchLanguage('en'); return false;" class="mobile-lang-option active"><img src="https://flagcdn.com/w40/gb.png" width="20" height="15" alt="" style="border-radius: 2px;"> English <span style="color: #ff892e;">✓</span></a><a href="#" onclick="switchLanguage('es'); return false;" class="mobile-lang-option"><img src="https://flagcdn.com/w40/es.png" width="20" height="15" alt="" style="border-radius: 2px;"> Español</a><a href="#" onclick="switchLanguage('pt'); return false;" class="mobile-lang-option"><img src="https://flagcdn.com/w40/br.png" width="20" height="15" alt="" style="border-radius: 2px;"> Português</a><a href="#" onclick="switchLanguage('fr'); return false;" class="mobile-lang-option"><img src="https://flagcdn.com/w40/fr.png" width="20" height="15" alt="" style="border-radius: 2px;"> Français</a><a href="#" onclick="switchLanguage('de'); return false;" class="mobile-lang-option"><img src="https://flagcdn.com/w40/de.png" width="20" height="15" alt="" style="border-radius: 2px;"> Deutsch</a><a href="#" onclick="switchLanguage('it'); return false;" class="mobile-lang-option"><img src="https://flagcdn.com/w40/it.png" width="20" height="15" alt="" style="border-radius: 2px;"> Italiano</a><a href="#" onclick="switchLanguage('tr'); return false;" class="mobile-lang-option"><img src="https://flagcdn.com/w40/tr.png" width="20" height="15" alt="" style="border-radius: 2px;"> Türkçe</a><a href="#" onclick="switchLanguage('zh'); return false;" class="mobile-lang-option"><img src="https://flagcdn.com/w40/cn.png" width="20" height="15" alt="" style="border-radius: 2px;"> 中文</a><a href="#" onclick="switchLanguage('ja'); return false;" class="mobile-lang-option"><img src="https://flagcdn.com/w40/jp.png" width="20" height="15" alt="" style="border-radius: 2px;"> 日本語</a><a href="#" onclick="switchLanguage('ko'); return false;" class="mobile-lang-option"><img src="https://flagcdn.com/w40/kr.png" width="20" height="15" alt="" style="border-radius: 2px;"> 한국어</a><a href="#" onclick="switchLanguage('id'); return false;" class="mobile-lang-option"><img src="https://flagcdn.com/w40/id.png" width="20" height="15" alt="" style="border-radius: 2px;"> Bahasa Indonesia</a><a href="#" onclick="switchLanguage('ar'); return false;" class="mobile-lang-option"><img src="https://flagcdn.com/w40/sa.png" width="20" height="15" alt="" style="border-radius: 2px;"> العربية</a></div></li>
577
578            <div class="menu-section">
579                <div class="menu-sec-title">Browse</div>
580                <a href="spotlight/" class="nav-dropdown-item">
581                                <span class="nav-dropdown-icon"><i class="bi bi-camera-reels-fill"></i></span>
582                                <div class="nav-dropdown-info">
583                                    <span class="nav-dropdown-title">Spotlight</span>
584                                    <span class="nav-dropdown-desc">Curated highlights</span>
585                                </div>
586                            </a><a href="categories/" class="nav-dropdown-item">
587                                <span class="nav-dropdown-icon"><i class="bi bi-grid-fill"></i></span>
588                                <div class="nav-dropdown-info">
589                                    <span class="nav-dropdown-title">Genres</span>
590                                    <span class="nav-dropdown-desc">Browse by category</span>
591                                </div>
592                            </a><a href="movies-by-year" class="nav-dropdown-item">
593                                <span class="nav-dropdown-icon"><i class="bi bi-calendar-event-fill"></i></span>
594                                <div class="nav-dropdown-info">
595                                    <span class="nav-dropdown-title">Years</span>
596                                    <span class="nav-dropdown-desc">Browse by year</span>
597                                </div>
598                            </a>
599            </div>
600
601            <div class="menu-section">
602                <div class="menu-sec-title">Games</div>
603                <a href="https://gtm.clip.cafe/" class="nav-dropdown-item">
604                                <span class="nav-dropdown-icon">🎬</span>
605                                <div class="nav-dropdown-info">
606                                    <span class="nav-dropdown-title">Guess The Movie</span>
607                                    <span class="nav-dropdown-desc">The classic movie quiz</span>
608                                </div>
609                            </a><a href="https://daily.clip.cafe/" class="nav-dropdown-item">
610                                <span class="nav-dropdown-icon">🍿</span>
611                                <div class="nav-dropdown-info">
612                                    <span class="nav-dropdown-title nav-dropdown-title-new">The Daily Clip<span class="badge-new-pulse">NEW</span></span>
613                                    <span class="nav-dropdown-desc">New puzzle every day!</span>
614                                </div>
615                            </a><a href="https://clipcafe.games/" class="nav-dropdown-item" target="_blank" rel="noopener">
616                                <span class="nav-dropdown-icon">🚀</span>
617                                <div class="nav-dropdown-info">
618                                    <span class="nav-dropdown-title">Party Game</span>
619                                    <span class="nav-dropdown-desc">Multiplayer fun!</span>
620                                </div>
621                            </a>
622            </div>
623
624            <div class="menu-section">
625                <div class="menu-sec-title">Community</div>
626                <a href="https://discord.gg/kyKmte9CPp" target="_blank" rel="noopener" class="nav-dropdown-item">
627                                <span class="nav-dropdown-icon"><i class="bi bi-discord"></i></span>
628                                <div class="nav-dropdown-info">
629                                    <span class="nav-dropdown-title">Discord</span>
630                                    <span class="nav-dropdown-desc">Chat, requests & support</span>
631                                </div>
632                            </a>
633            </div>
634
635            <a class="get-pro-btn-mobile" href="pro" title="Unlock HD downloads and premium features"><i class="bi bi-star-fill"></i> Upgrade</a>
636
637            <div class="trustpilot-badge m-33-a">
638                <a href="https://www.trustpilot.com/review/clip.cafe" target="_blank">
639                    <div class="badge-content">
640                        <div class="badge-score">4.6</div>
641                        <div class="badge-rating">Excellent</div>
642                        <div class="badge-stars">★★★★☆</div>
643                    </div>
644                </a>
645            </div>
646
647        </div>
648    </div>
649
650
651    
652    <div class="searchFilters">
653
654
655        <label for="onlyCaption">
656            <input name="onlyCaption" type="checkbox" id="onlyCaption" checked>
657            Scene Description
658        </label>
659        
660
661        <label for="onlyTranscript">
662            <input name="onlyTranscript" type="checkbox" id="onlyTranscript" checked>
663            Transcript
664        </label>
665
666
667
668        <input name="title" data-query="send/frontpagefilter=1&movie=1" class="searchFilter searchField" type="text" placeholder="Movie" value="" aria-label="Movie" autocomplete="off">
669
670        <input name="actor" data-query="send/frontpagefilter=1&actor=1" class="searchFilter searchField" type="text" placeholder="Actor" value="" aria-label="Actor" autocomplete="off">
671
672        <input name="character" data-query="send/frontpagefilter=1&character=1" class="searchFilter searchField" type="text" placeholder="Character" value="" aria-label="Character" autocomplete="off">
673
674        <input name="director" data-query="send/frontpagefilter=1&director=1" class="searchFilter searchField" type="text" placeholder="Director" value="" aria-label="Director" autocomplete="off">
675
676        <input name="writer" data-query="send/frontpagefilter=1&writer=1" class="searchFilter searchField" type="text" placeholder="Writer" value="" aria-label="Writer" autocomplete="off">
677
678        <select name="genre" class="searchFilter searchField" aria-label="Genre"><option value="">All Genres</option><option value="action">Action</option><option value="adult">Adult</option><option value="adventure">Adventure</option><option value="animation">Animation</option><option value="biography">Biography</option><option value="comedy">Comedy</option><option value="crime">
678Crime</option><option value="documentary">Documentary</option><option value="drama">Drama</option><option value="family">Family</option><option value="fantasy">Fantasy</option><option value="film-noir">Film-Noir</option><option value="history">History</option><option value="horror">Horror</option><option value="music">Music</option><option value="musical">Musical</option><option value="mystery">Mystery</option><option value="news">News</option><option value="reality-tv">Reality-TV</option><option value="romance">Romance</option><option value="sci-fi">Sci-Fi</option><option value="short">Short</option><option value="sport">Sport</option><option value="talk-show">Talk-Show</option><option value="thriller">Thriller</option><option value="war">War</option><option value="western">Western</option></select>
679
680        <select name="type" class="searchFilter searchField" aria-label="Movies or TV series"><option value="" selected>Movies & TV</option><option value="movie">Movies only</option><option value="tv">TV series only</option></select><select name="rated" class="searchFilter searchField" aria-label="Content rating"><option value="" selected>Any Rating</option><option value="family">Family (G · PG)</option><option value="teen">Teen (PG-13)</option><option value="mature">Mature (R · TV-MA)</option></select><select name="audio" class="searchFilter searchField" aria-label="Audio language"><option value="">Any audio language</option><option value="ar">🇸🇦 Arabic</option><option value="hy">🇦🇲 Armenian</option><option value="az">🇦🇿 Azerbaijani</option><option value="eu">🇪🇸 Basque</option><option value="be">🇧🇾 Belarusian</option><option value="bn">🇮🇳 Bengali</option><option value="bs">🇧🇦 Bosnian</option><option value="bg">🇧🇬 Bulgarian</option><option value="my">🇲🇲 Burmese</option><option value="ca">🇪🇸 Catalan</option><option value="zh">🇨🇳 Chinese</option><option value="hr">🇭🇷 Croatian</option><option value="cs">🇨🇿 Czech</option><option value="da">🇩🇰 Danish</option><option value="nl">🇳🇱 Dutch</option><option value="en">🇬🇧 English</option><option value="et">🇪🇪 Estonian</option><option value="tl">🇵🇭 Filipino</option><option value="fi">🇫🇮 Finnish</option><option value="fr">🇫🇷 French</option><option value="gl">🇪🇸 Galician</option><option value="ka">🇬🇪 Georgian</option><option value="de">🇩🇪 German</option><option value="el">🇬🇷 Greek</option><option value="gu">🇮🇳 Gujarati</option><option value="he">🇮🇱 Hebrew</option><option value="hi">🇮🇳 Hindi</option><option value="hu">🇭🇺 Hungarian</option><option value="id">🇮🇩 Indonesian</option><option value="it">🇮🇹 Italian</option><option value="ja">🇯🇵 Japanese</option><option value="kn">🇮🇳 Kannada</option><option value="kk">🇰🇿 Kazakh</option><option value="km">🇰🇭 Khmer</option><option value="ko">🇰🇷 Korean</option><option value="lv">🇱🇻 Latvian</option><option value="lt">🇱🇹 Lithuanian</option><option value="ms">🇲🇾 Malay</option><option value="ml">🇮🇳 Malayalam</option><option value="mr">🇮🇳 Marathi</option><option value="ne">🇳🇵 Nepali</option><option value="no">🇳🇴 Norwegian</option><option value="or">🇮🇳 Odia</option><option value="fa">🇮🇷 Persian</option><option value="pl">🇵🇱 Polish</option><option value="pt">🇵🇹 Portuguese</option><option value="pa">🇮🇳 Punjabi</option><option value="ro">🇷🇴 Romanian</option><option value="ru">🇷🇺 Russian</option><option value="sr">🇷🇸 Serbian</option><option value="si">🇱🇰 Sinhala</option><option value="sk">🇸🇰 Slovak</option><option value="sl">🇸🇮 Slovenian</option><option value="es">🇪🇸 Spanish</option><option value="sv">🇸🇪 Swedish</option><option value="ta">🇮🇳 Tamil</option><option value="te">🇮🇳 Telugu</option><option value="th">🇹🇭 Thai</option><option value="tr">🇹🇷 Turkish</option><option value="uk">🇺🇦 Ukrainian</option><option value="ur">🇵🇰 Urdu</option><option value="uz">🇺🇿 Uzbek</option><option value="vi">🇻🇳 Vietnamese</option></select><select name="subs" class="searchFilter searchField" aria-label="Subtitle language"><option value="">Any subtitle language</option><option value="ar">🇸🇦 Arabic</option><option value="hy">🇦🇲 Armenian</option><option value="az">🇦🇿 Azerbaijani</option><option value="eu">🇪🇸 Basque</option><option value="be">🇧🇾 Belarusian</option><option value="bn">🇮🇳 Bengali</option><option value="bs">🇧🇦 Bosnian</option><option value="bg">🇧🇬 Bulgarian</option><option value="my">🇲🇲 Burmese</option><option value="ca">🇪🇸 Catalan</option><option value="zh">🇨🇳 Chinese</option><option value="hr">🇭🇷 Croatian</option><option value="cs">🇨🇿 Czech</option><option value="da">🇩🇰 Danish</option><option value="nl">🇳🇱 Dutch</option><option value="en">🇬🇧 English</option><option value="et">🇪🇪 Estonian</option><option value="tl">🇵🇭 Filipino</option><option value="fi">🇫🇮 Finnish</option><option value="fr">🇫🇷 French</option><option value="gl">🇪🇸 Galician</option><option value="ka">🇬🇪 Georgian</option><option value="de">🇩🇪 German</option><option value="el">🇬🇷 Greek</option><option value="gu">🇮🇳 Gujarati</option><option value="he">🇮🇱 Hebrew</option><option value="hi">🇮🇳 Hindi</option><option value="hu">🇭🇺 Hungarian</option><option value="id">🇮🇩 Indonesian</option><option value="it">🇮🇹 Italian</option><option value="ja">🇯🇵 Japanese</option><option value="kn">
680🇮🇳 Kannada</option><option value="kk">🇰🇿 Kazakh</option><option value="km">🇰🇭 Khmer</option><option value="ko">🇰🇷 Korean</option><option value="lv">🇱🇻 Latvian</option><option value="lt">🇱🇹 Lithuanian</option><option value="ms">🇲🇾 Malay</option><option value="ml">🇮🇳 Malayalam</option><option value="mr">🇮🇳 Marathi</option><option value="ne">🇳🇵 Nepali</option><option value="no">🇳🇴 Norwegian</option><option value="or">🇮🇳 Odia</option><option value="fa">🇮🇷 Persian</option><option value="pl">🇵🇱 Polish</option><option value="pt">🇵🇹 Portuguese</option><option value="pa">🇮🇳 Punjabi</option><option value="ro">🇷🇴 Romanian</option><option value="ru">🇷🇺 Russian</option><option value="sr">🇷🇸 Serbian</option><option value="si">🇱🇰 Sinhala</option><option value="sk">🇸🇰 Slovak</option><option value="sl">🇸🇮 Slovenian</option><option value="es">🇪🇸 Spanish</option><option value="sv">🇸🇪 Swedish</option><option value="ta">🇮🇳 Tamil</option><option value="te">🇮🇳 Telugu</option><option value="th">🇹🇭 Thai</option><option value="tr">🇹🇷 Turkish</option><option value="uk">🇺🇦 Ukrainian</option><option value="ur">🇵🇰 Urdu</option><option value="uz">🇺🇿 Uzbek</option><option value="vi">🇻🇳 Vietnamese</option></select><select name="sl" class="searchFilter searchField" aria-label="Search in"><option value="">Search in: any language</option><option value="ar">🇸🇦 Arabic</option><option value="hy">🇦🇲 Armenian</option><option value="az">🇦🇿 Azerbaijani</option><option value="eu">🇪🇸 Basque</option><option value="be">🇧🇾 Belarusian</option><option value="bn">🇮🇳 Bengali</option><option value="bs">🇧🇦 Bosnian</option><option value="bg">🇧🇬 Bulgarian</option><option value="my">🇲🇲 Burmese</option><option value="ca">🇪🇸 Catalan</option><option value="zh">🇨🇳 Chinese</option><option value="hr">🇭🇷 Croatian</option><option value="cs">🇨🇿 Czech</option><option value="da">🇩🇰 Danish</option><option value="nl">🇳🇱 Dutch</option><option value="en">🇬🇧 English</option><option value="et">🇪🇪 Estonian</option><option value="tl">🇵🇭 Filipino</option><option value="fi">🇫🇮 Finnish</option><option value="fr">🇫🇷 French</option><option value="gl">🇪🇸 Galician</option><option value="ka">🇬🇪 Georgian</option><option value="de">🇩🇪 German</option><option value="el">🇬🇷 Greek</option><option value="gu">🇮🇳 Gujarati</option><option value="he">🇮🇱 Hebrew</option><option value="hi">🇮🇳 Hindi</option><option value="hu">🇭🇺 Hungarian</option><option value="id">🇮🇩 Indonesian</option><option value="it">🇮🇹 Italian</option><option value="ja">🇯🇵 Japanese</option><option value="kn">🇮🇳 Kannada</option><option value="kk">🇰🇿 Kazakh</option><option value="km">🇰🇭 Khmer</option><option value="ko">🇰🇷 Korean</option><option value="lv">🇱🇻 Latvian</option><option value="lt">🇱🇹 Lithuanian</option><option value="ms">🇲🇾 Malay</option><option value="ml">🇮🇳 Malayalam</option><option value="mr">🇮🇳 Marathi</option><option value="ne">🇳🇵 Nepali</option><option value="no">🇳🇴 Norwegian</option><option value="or">🇮🇳 Odia</option><option value="fa">🇮🇷 Persian</option><option value="pl">🇵🇱 Polish</option><option value="pt">🇵🇹 Portuguese</option><option value="pa">🇮🇳 Punjabi</option><option value="ro">🇷🇴 Romanian</option><option value="ru">🇷🇺 Russian</option><option value="sr">🇷🇸 Serbian</option><option value="si">🇱🇰 Sinhala</option><option value="sk">🇸🇰 Slovak</option><option value="sl">🇸🇮 Slovenian</option><option value="es">🇪🇸 Spanish</option><option value="sv">🇸🇪 Swedish</option><option value="ta">🇮🇳 Tamil</option><option value="te">🇮🇳 Telugu</option><option value="th">🇹🇭 Thai</option><option value="tr">🇹🇷 Turkish</option><option value="uk">🇺🇦 Ukrainian</option><option value="ur">🇵🇰 Urdu</option><option value="uz">🇺🇿 Uzbek</option><option value="vi">🇻🇳 Vietnamese</option></select><select name="sort" class="searchFilter searchField" aria-label="Sort results"><option value="" selected>Sort: Relevance</option><option value="views">Sort: Most viewed</option><option value="newest">Sort: Newest</option><option value="shortest">Sort: Shortest first</option><option value="longest">Sort: Longest first</option></select>
681
682        <select name="collection" id="searchFilterCollection" class="searchFilter searchField" aria-label="Search in collection" style="display:none;">
683            <option value="">All Movies</option>
684        </select>
685
686        <div class="inline-block">
687            <input name="yearStart" class="searchFilter searchField" type="text" placeholder="Year (from)" value="" aria-label="Year (from)" autocomplete="off">
688            -
689            <input name="yearEnd" class="searchFilter searchField" type="text" placeholder="Year (to)" value="" aria-label="Year (to)" autocomplete="off">
690        </div>
691
692        <div class="inline-block">
693            <input name="durationStart" class="searchFilter searchField" type="text" placeholder="Length (seconds)" value="" aria-label="Length (seconds)" autocomplete="off">
694            -
695            <input name="durationEnd" class="searchFilter searchField" type="text" placeholder="Length (seconds)" value="" aria-label="Length (seconds)" autocomplete="off">
696        </div>
697
698    </div>
699
700            </nav>
701        </header>
702        <input type="hidden" name="ss" value="s">
703    </form>
704     
705
706
707
708
709
710
711
712    
712<script>
713
714    var plyrloaded = false;
715    var plyrloadingstarted = false;
716
717
718    </script>
718
719    
720
721    
722    <main id="main-cont">
723
724
725
726
727    
728    <style>
729    /* Login Page Styles - Modern Glassmorphism */
730    .login-container {
731        min-height: 70vh;
732        display: flex;
733        align-items: center;
734        justify-content: center;
735        padding: 40px 20px;
736    }
737    
738    .login-wrapper {
739        width: 100%;
740        max-width: 420px;
741    }
742    
743    .login-card {
744        background: rgba(255, 255, 255, 0.05);
745        backdrop-filter: blur(20px);
746        -webkit-backdrop-filter: blur(20px);
747        border: 1px solid rgba(255, 255, 255, 0.1);
748        border-radius: 24px;
749        padding: 40px 32px;
750        box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
751    }
752    
753    .login-header {
754        text-align: center;
755        margin-bottom: 32px;
756    }
757    
758    .login-header h1 {
759        font-size: 28px;
760        font-weight: 600;
761        color: #fff;
762        margin: 0 0 8px 0;
763        padding: 0;
764        display: block;
765        grid-template-columns: none;
766        text-shadow: none;
767        -webkit-text-stroke: 0;
768    }
769    
770    .login-header h1::before,
771    .login-header h1::after {
772        display: none;
773    }
774    
775    .login-header p {
776        color: rgba(255, 255, 255, 0.6);
777        font-size: 14px;
778        margin: 0;
779    }
780    
781    /* Checkout context — only rendered when pendingCheckoutIntent() says a purchase is in
782       flight. It restates the plan and price the visitor just clicked so the account step
783       reads as part of the purchase rather than an unexplained detour. Mobile first: this is
784       a phone-majority site and the row must not wrap at 320px, so the name and price sit on
785       one flex line with the qualifier allowed to drop under the number. */
786    .checkout-intent {
787        display: flex;
788        align-items: baseline;
789        justify-content: space-between;
790        gap: 12px;
791        flex-wrap: wrap;
792        padding: 14px 16px;
793        margin-bottom: 24px;
794        border: 1px solid rgba(255, 152, 0, 0.35);
795        border-radius: 12px;
796        background: rgba(255, 152, 0, 0.08);
797    }
798
799    .checkout-intent-plan {
800        font-size: 15px;
801        font-weight: 600;
802        color: #fff;
803    }
804
805    .checkout-intent-price {
806        font-size: 18px;
807        font-weight: 700;
808        color: #ff9800;
809        white-space: nowrap;
810    }
811
812    .checkout-intent-price small {
813        display: block;
814        font-size: 11px;
815        font-weight: 400;
816        color: rgba(255, 255, 255, 0.55);
817        white-space: normal;
818    }
819
820    .checkout-intent-trust {
821        text-align: center;
822        font-size: 12px;
823        color: rgba(255, 255, 255, 0.5);
824        margin: -12px 0 24px 0;
825    }
826    
827    /* Global Alert Message */
828    .login-alert {
829        padding: 14px 16px;
830        border-radius: 12px;
831        margin-bottom: 24px;
832        font-size: 14px;
833        display: flex;
834        align-items: center;
835        gap: 10px;
836        animation: alertSlideIn 0.3s ease-out;
837    }
838    
839    .login-alert.error {
840        background: rgba(239, 68, 68, 0.15);
841        border: 1px solid rgba(239, 68, 68, 0.3);
842        color: #fca5a5;
843    }
844    
845    .login-alert.success {
846        background: rgba(34, 197, 94, 0.15);
847        border: 1px solid rgba(34, 197, 94, 0.3);
848        color: #86efac;
849    }
850    
851    .login-alert.hidden {
852        display: none;
853    }
854    
855    @keyframes alertSlideIn {
856        from {
857            opacity: 0;
858            transform: translateY(-10px);
859        }
860        to {
861            opacity: 1;
862            transform: translateY(0);
863        }
864    }
865    
866    /* Social Login Button (Google) */
867    .social-login-section {
868        margin-bottom: 24px;
869    }
870    
871    .google-btn {
872        width: 100%;
873        display: flex;
874        align-items: center;
875        justify-content: center;
876        gap: 12px;
877        padding: 14px 20px;
878        background: #fff;
879        border: none;
880        border-radius: 12px;
881        font-size: 15px;
882        font-weight: 500;
883        color: #333;
884        cursor: pointer;
885        transition: all 0.2s ease;
886        text-decoration: none;
887    }
888    
889    .google-btn:hover {
890        background: #f5f5f5;
891        transform: translateY(-1px);
892        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
893    }
894    
895    .google-btn:active {
896        transform: translateY(0);
897    }
898    
899    .google-btn img {
900        width: 20px;
901        height: 20px;
902    }
903    
904    /* Divider */
905    .login-divider {
906        display: flex;
907        align-items: center;
908        margin: 28px 0;
909        gap: 16px;
910    }
911    
912    .login-divider::before,
913    .login-divider::after {
914        content: "";
915        flex: 1;
916        height: 1px;
917        background: rgba(255, 255, 255, 0.15);
918    }
919    
920    .login-divider span {
921        color: rgba(255, 255, 255, 0.5);
922        font-size: 13px;
923        text-transform: uppercase;
924        letter-spacing: 1px;
925    }
926    
927    /* Form Styles */
928    .login-form {
929        display: flex;
930        flex-direction: column;
931        gap: 20px;
932    }
933    
934    .form-group {
935        position: relative;
936    }
937    
938    .form-group label {
939        display: block;
940        color: rgba(255, 255, 255, 0.8);
941        font-size: 13px;
942        font-weight: 500;
943        margin-bottom: 8px;
944        transition: color 0.2s ease;
945    }
946    
947    .form-group input {
948        width: 100%;
949        padding: 14px 16px;
950        background: rgba(255, 255, 255, 0.08);
951        border: 1px solid rgba(255, 255, 255, 0.12);
952        border-radius: 10px;
953        color: #fff;
954        font-size: 15px;
955        transition: all 0.2s ease;
956        outline: none;
957    }
958    
959    .form-group input::placeholder {
960        color: rgba(255, 255, 255, 0.35);
961    }
962    
963    .form-group input:focus {
964        background: rgba(255, 255, 255, 0.12);
965        border-color: rgba(255, 137, 46, 0.5);
966        box-shadow: 0 0 0 3px rgba(255, 137, 46, 0.1);
967    }
968    
969    .form-group input.input-error {
970        border-color: rgba(239, 68, 68, 0.5);
971    }
972    
973    .form-group input.input-success {
974        border-color: rgba(34, 197, 94, 0.5);
975    }
976    
977    .field-feedback {
978        font-size: 12px;
979        margin-top: 6px;
980        min-height: 18px;
981        transition: all 0.2s ease;
982    }
983    
984    .field-feedback.error {
985        color: #fca5a5;
986    }
987    
988    .field-feedback.success {
989        color: #86efac;
990    }
991
992    /* Says which branch the form is in — sign-in, sign-up, or "you signed up with Google" —
993       once api-account-check.php has resolved the address. */
994    .step-hint {
995        font-size: 13px;
996        line-height: 1.45;
997        color: rgba(255, 255, 255, 0.75);
998        background: rgba(255, 255, 255, 0.05);
999        border-left: 2px solid rgba(255, 255, 255, 0.25);
1000        border-radius: 8px;
1001        padding: 10px 12px;
1002        margin-bottom: 16px;
1003    }
1004
1005    .step-hint.social {
1006        border-left-color: #86efac;
1007    }
1008
1009    .link-btn {
1010        display: block;
1011        width: 100%;
1012        margin: -8px 0 16px;
1013        padding: 0;
1014        background: none;
1015        border: 0;
1016        color: rgba(255, 255, 255, 0.5);
1017        font-size: 13px;
1018        text-align: center;
1019        cursor: pointer;
1020    }
1021
1022    .link-btn:hover {
1023        color: rgba(255, 255, 255, 0.8);
1024    }
1025
1026    /* Password visibility toggle */
1027    .password-wrapper {
1028        position: relative;
1029    }
1030    
1031    .password-toggle {
1032        position: absolute;
1033        right: 14px;
1034        top: 50%;
1035        transform: translateY(-50%);
1036        background: none;
1037        border: none;
1038        color: rgba(255, 255, 255, 0.5);
1039        cursor: pointer;
1040        padding: 4px;
1041        display: flex;
1042        align-items: center;
1043        justify-content: center;
1044        transition: color 0.2s ease;
1045    }
1046    
1047    .password-toggle:hover {
1048        color: rgba(255, 255, 255, 0.8);
1049    }
1050    
1051    .password-wrapper input {
1052        padding-right: 48px;
1053    }
1054    
1055    /* Consent notice.
1056       Replaced a checkbox whose touch target was 18px, whose <label> was almost entirely
1057       target="_blank" links (so a tap aimed at the box usually opened a new tab), and whose
1058       "please accept" tooltip was position:absolute + white-space:nowrap — it overflowed a 320px
1059       viewport in every language whose phrasing is longer than English. Static text has no touch
1060       target and no positioning to get wrong. */
1061    .tos-notice {
1062        color: rgba(255, 255, 255, 0.45);
1063        font-size: 12px;
1064        line-height: 1.5;
1065        text-align: center;
1066        margin: 14px 0 0 0;
1067    }
1068
1069    .tos-notice a {
1070        color: rgba(255, 255, 255, 0.7);
1071        text-decoration: underline;
1072        /* The links sit inside 12px body text, so give them a comfortable tap slop without
1073           disturbing the line box. */
1074        padding: 2px 1px;
1075    }
1076
1077    .tos-notice a:hover {
1078        color: #ff892e;
1079    }
1080
1081
1082    /* Turnstile slot. No `display` in the base rule, and an explicit [hidden] guard, because
1083       css/style.css carries no global [hidden] override — only css/daily.css does, and that is
1084       not loaded here. Any display value set here would out-specify the UA rule and paint the
1085       widget on every sign-in. Same trap as .clip-hd-strip[hidden] in style.css. */
1086    .turnstile-slot {
1087        /* No margin of its own: with appearance:interaction-only the slot is usually populated by
1088           an invisible widget, and a fixed margin would open a phantom gap above the button on
1089           every create-account step. When Cloudflare does show the checkbox, the widget brings
1090           its own height. */
1091        margin: 0;
1092        min-height: 0;
1093    }
1094    .turnstile-slot[hidden] {
1095        display: none;
1096    }
1097
1098    /* Submit Button */
1099    .submit-btn {
1100        width: 100%;
1101        padding: 16px;
1102        background: linear-gradient(135deg, #ff892e 0%, #ff6b00 100%);
1103        border: none;
1104        border-radius: 12px;
1105        color: #fff;
1106        font-size: 16px;
1107        font-weight: 600;
1108        cursor: pointer;
1109        transition: all 0.3s ease;
1110        position: relative;
1111        overflow: hidden;
1112    }
1113    
1114    .submit-btn:hover:not(:disabled) {
1115        transform: translateY(-2px);
1116        box-shadow: 0 8px 24px rgba(255, 137, 46, 0.35);
1117    }
1118    
1119    .submit-btn:active:not(:disabled) {
1120        transform: translateY(0);
1121    }
1122    
1123    .submit-btn:disabled {
1124        opacity: 0.5;
1125        cursor: not-allowed;
1126    }
1127    
1128    .submit-btn.loading {
1129        pointer-events: none;
1130    }
1131    
1132    .submit-btn .btn-text {
1133        transition: opacity 0.2s ease;
1134    }
1135    
1136    .submit-btn.loading .btn-text {
1137        opacity: 0;
1138    }
1139    
1140    .submit-btn .btn-loader {
1141        position: absolute;
1142        top: 50%;
1143        left: 50%;
1144        transform: translate(-50%, -50%);
1145        width: 24px;
1146        height: 24px;
1147        border: 3px solid rgba(255, 255, 255, 0.3);
1148        border-top-color: #fff;
1149        border-radius: 50%;
1150        opacity: 0;
1151        transition: opacity 0.2s ease;
1152    }
1153    
1154    .submit-btn.loading .btn-loader {
1155        opacity: 1;
1156        animation: spin 0.8s linear infinite;
1157    }
1158    
1159    @keyframes spin {
1160        to { transform: translate(-50%, -50%) rotate(360deg); }
1161    }
1162    
1163    /* Forgot Password Link */
1164    .forgot-link {
1165        text-align: center;
1166        margin-top: 8px;
1167    }
1168    
1169    .forgot-link a {
1170        color: rgba(255, 255, 255, 0.5);
1171        font-size: 13px;
1172        text-decoration: none;
1173        transition: color 0.2s ease;
1174    }
1175    
1176    .forgot-link a:hover {
1177        color: rgba(255, 255, 255, 0.8);
1178    }
1179    
1180    /* Password Requirements */
1181    .password-requirements {
1182        background: rgba(255, 255, 255, 0.05);
1183        border-radius: 8px;
1184        padding: 12px;
1185        margin-top: 8px;
1186    }
1187    
1188    .password-requirements p {
1189        color: rgba(255, 255, 255, 0.5);
1190        font-size: 11px;
1191        margin: 0 0 8px 0;
1192        text-transform: uppercase;
1193        letter-spacing: 0.5px;
1194    }
1195    
1196    .password-requirements ul {
1197        list-style: none;
1198        padding: 0;
1199        margin: 0;
1200        display: grid;
1201        grid-template-columns: 1fr 1fr;
1202        gap: 6px 12px;
1203    }
1204    
1205    .password-requirements li {
1206        color: rgba(255, 255, 255, 0.4);
1207        font-size: 12px;
1208        display: flex;
1209        align-items: center;
1210        gap: 6px;
1211        transition: color 0.2s ease;
1212    }
1213    
1214    .password-requirements li.valid {
1215        color: #86efac;
1216    }
1217    
1218    .password-requirements li::before {
1219        content: "○";
1220        font-size: 8px;
1221    }
1222    
1223    .password-requirements li.valid::before {
1224        content: "●";
1225    }
1226    
1227    /* Mobile Responsive */
1228    @media (max-width: 480px) {
1229        .login-card {
1230            padding: 32px 24px;
1231            border-radius: 20px;
1232        }
1233        
1234        .login-header h1 {
1235            font-size: 24px;
1236        }
1237        
1238        .password-requirements ul {
1239            grid-template-columns: 1fr;
1240        }
1241    }
1242    </style>
1243    
1244    <div class="login-container">
1245        <div class="login-wrapper">
1246            <div class="login-card">
1247                <div class="login-header">
1248                    <h1>Welcome Back</h1>
1249                    <p>Sign in to continue to Clip.Cafe</p>
1250                </div>
1251                
1252
1253                <!-- Global Alert (for AJAX responses) -->
1254                <div id="loginAlert" class="login-alert hidden" role="alert"></div>
1255
1256                <!-- Legacy message support -->
1257                
1258
1259                <!-- Google Login Section -->
1260                <div class="social-login-section">
1261                    <button type="button" class="google-btn" id="googleLoginBtn">
1262                        <img src="img/social/googleIcon.jpg" alt="Google">
1263                        <span>Continue with Google</span>
1264                    </button>
1265                </div>
1266
1267                <!-- Divider -->
1268                <div class="login-divider">
1269                    <span>or</span>
1270                </div>
1271
1272                <!-- Email/Password Form -->
1273                <form id="loginForm" class="login-form" method="POST" action="https://clip.cafe/" novalidate>
1274                    <div class="form-group">
1275                        <label for="loginEmail">Email Address</label>
1276                        <input
1277                            type="email"
1278                            id="loginEmail"
1279                            name="email"
1280                            placeholder="[email protected]"
1281                            autocomplete="email"
1282                            required
1283                        >
1284                        <div id="emailFeedback" class="field-feedback"></div>
1285                    </div>
1286
1287                    <!-- Filled by the JS once the address is resolved. Empty and hidden in the
1288                         server response, so a browser with no JS simply never sees it. -->
1289                    <div id="stepHint" class="step-hint" style="display: none;"></div>
1290                    <button type="button" class="link-btn" id="usePasswordLink" style="display: none;">I have a password</button>
1291
1292                    <!-- NOT hidden server-side. The two-step flow is applied by the script below,
1293                         so a browser that never runs it gets the one-step form this page has always
1294                         been: email, password, submit, and the server decides. -->
1295                    <div class="form-group" id="passwordGroup">
1296                        <label for="loginPassword">Password</label>
1297                        <div class="password-wrapper">
1298                            <input
1299                                type="password"
1300                                id="loginPassword"
1301                                name="password"
1302                                placeholder="Enter your password"
1303                                autocomplete="current-password"
1304                                required
1305                            >
1306                            <button type="button" class="password-toggle" id="togglePassword" aria-label="Toggle password visibility">
1307                                <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1308                                    <path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z" id="eyePath"></path>
1309                                    <circle cx="12" cy="12" r="3" id="eyeCircle"></circle>
1310                                    <line x1="1" y1="1" x2="23" y2="23" id="eyeLine" style="display:none"></line>
1311                                </svg>
1312                            </button>
1313                        </div>
1314                        <div id="passwordFeedback" class="field-feedback"></div>
1315
1316                        <!-- Password Requirements (shown on focus for new users) -->
1317                        <div id="passwordReqs" class="password-requirements" style="display: none;">
1318                            <p>Password requirements</p>
1319                            <ul>
1320                                <li id="req-length">8+ characters</li>
1321                                <li id="req-upper">Uppercase letter</li>
1322                                <li id="req-lower">Lowercase letter</li>
1323                                <li id="req-number">Number</li>
1324                            </ul>
1325                        </div>
1326                    </div>
1327
1328                    <!-- Turnstile mounts here, and ONLY for someone about to create an account:
1329                         the probe has to have answered "new", or "unknown", which can still turn
1330                         out to be a registration once the server looks. A returning user signing
1331                         in never renders it, never fetches the Cloudflare script, and never waits
1332                         on it. Stays empty and inert unless TURNSTILE_SITE_KEY is set. -->
1333                    <div class="turnstile-slot" id="turnstileSlot" hidden></div>
1334
1335                    <!-- Submit Button.
1336                         Deliberately NOT `disabled`: a dead button cannot fire an event, so it can
1337                         never tell the user why it is dead. Every rejection now happens on submit
1338                         with a message attached. See the note above updatePasswordMeter() in the JS. -->
1339                    <button type="submit" class="submit-btn" id="submitBtn">
1340                        <span class="btn-text" id="submitBtnText">Sign In / Create Account</span>
1341                        <div class="btn-loader"></div>
1342                    </button>
1343
1344                    <!-- Consent by notice, not by checkbox. The checkbox this replaced gated the
1345                         Google button too, had an 18px touch target, and lived inside a <label>
1346                         that was almost entirely target="_blank" links — so most taps aimed at it
1347                         opened a new tab instead. Its value was never persisted (myusers has no
1348                         tos column and registerlogin() never read the posted tos field), so this notice
1349                         carries exactly the same legal weight with none of the failure modes. -->
1350                    <p class="tos-notice">By continuing, you agree to our <a href="termsandconditions/" target="_blank">Terms of Service</a> and <a href="privacypolicy/" target="_blank">Privacy Policy</a>.</p>
1351
1352                    <!-- Forgot Password -->
1353                    <div class="forgot-link">
1354                        <a href="https://clip.cafe/forgot-password" id="forgotPasswordLink">Forgot your password?</a>
1355                    </div>
1356                    
1357                    <!-- Hidden fields -->
1358                    <input type="hidden" name="registerlogin" value="1">
1359                    <input type="hidden" name="csrf" value="2e3a1e182ba5a85d1be6d87188c87851a8b7919bfa7beb494e8e8f1c009e23e6">
1360                    <input type="hidden" name="ajax" value="1">
1361                </form>
1362            </div>
1363        </div>
1364    </div>
1365    
1366    
1366<script>
1367    (function() {
1368        "use strict";
1369
1370        // Server-injected, so there is exactly one definition of each of these in the codebase.
1371        const POLICY  = {"minLength":8,"patterns":{"upper":"[A-Z]","lower":"[a-z]","number":"[0-9]"}};
1372        const STRINGS = {"invalidEmail":"Please enter a valid email address","passwordEmpty":"Please enter your password","sessionExpired":"Your session expired while this page was open. Refreshing…","networkError":"Connection problem. Check your internet and try again.","loginFailed":"Login failed. Please try again or contact support.","redirecting":"Login successful! Redirecting…","btnContinue":"Continue","btnSignIn":"Sign in","btnCreate":"Create account","btnDefault":"Sign In \/ Create Account","stepReturning":"Welcome back — enter your password to sign in.","stepNew":"No account for this email yet. Pick a password and we\u0027ll create one.","stepSocial":"This email signs in with Google — use the Continue with Google button above.","socialOther":"This email was registered with {provider}. Click “Forgot your password?” below to set a password you can sign in with.","captchaFailed":"We could not verify that you are human. Please complete the check and try again, or continue with Google."};
1373        const BASE    = "https://clip.cafe/";
1374        const TURNSTILE_KEY = "0x4AAAAAAE64kW9DFrt3pWA7";
1375        const TURNSTILE_ACTION = "register";
1376
1377        // DOM Elements
1378        const form = document.getElementById("loginForm");
1379        const emailInput = document.getElementById("loginEmail");
1380        const passwordInput = document.getElementById("loginPassword");
1381        const submitBtn = document.getElementById("submitBtn");
1382        const emailFeedback = document.getElementById("emailFeedback");
1383        const passwordFeedback = document.getElementById("passwordFeedback");
1384        const alertBox = document.getElementById("loginAlert");
1385        const passwordReqs = document.getElementById("passwordReqs");
1386        const togglePassword = document.getElementById("togglePassword");
1387        const googleBtn = document.getElementById("googleLoginBtn");
1388        const passwordGroup = document.getElementById("passwordGroup");
1389        const stepHint = document.getElementById("stepHint");
1390        const usePasswordLink = document.getElementById("usePasswordLink");
1391        const submitBtnText = document.getElementById("submitBtnText");
1392
1393        // Password requirement elements
1394        const reqLength = document.getElementById("req-length");
1395        const reqUpper = document.getElementById("req-upper");
1396        const reqLower = document.getElementById("req-lower");
1397        const reqNumber = document.getElementById("req-number");
1398
1399        const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
1400        const classPatterns = {
1401            upper: new RegExp(POLICY.patterns.upper),
1402            lower: new RegExp(POLICY.patterns.lower),
1403            number: new RegExp(POLICY.patterns.number)
1404        };
1405
1406        // Best-effort analytics. Analytics lives in js/main.js, which is deferred, so it is
1407        // undefined while this script parses but defined long before anyone can click anything.
1408        function track(eventName, data) {
1409            try {
1410                if (typeof Analytics !== "undefined") Analytics.track(eventName, data || {});
1411            } catch (e) { /* tracking must never block a login */ }
1412        }
1413
1414        // Validate Email
1415        function validateEmail() {
1416            const value = emailInput.value.trim();
1417            if (!value) {
1418                emailInput.classList.remove("input-error", "input-success");
1419                emailFeedback.textContent = "";
1420                emailFeedback.className = "field-feedback";
1421                return false;
1422            }
1423            if (!emailPattern.test(value)) {
1424                emailInput.classList.add("input-error");
1425                emailInput.classList.remove("input-success");
1426                emailFeedback.textContent = STRINGS.invalidEmail;
1427                emailFeedback.className = "field-feedback error";
1428                return false;
1429            }
1430            emailInput.classList.remove("input-error");
1431            emailInput.classList.add("input-success");
1432            emailFeedback.textContent = "";
1433            emailFeedback.className = "field-feedback success";
1434            return true;
1435        }
1436
1437        // Password strength meter — ADVISORY ONLY.
1438        //
1439        // This updates the checklist so somebody creating an account can see what is required. It
1440        // does NOT decide whether the form may be submitted. This one form is both the sign-in and
1441        // the sign-up form, and 259,321 of 473,356 accounts still hold pre-bcrypt MD5 passwords
1442        // chosen years before these rules existed. Gating submission on the rules meant those users
1443        // faced a permanently disabled button with no error text. The server knows whether a POST is
1444        // a login or a registration; the browser does not, so the browser does not get a vote.
1445        function updatePasswordMeter() {
1446            const value = passwordInput.value;
1447
1448            const lengthOk = value.length >= POLICY.minLength;
1449            const upperOk = classPatterns.upper.test(value);
1450            const lowerOk = classPatterns.lower.test(value);
1451            const numberOk = classPatterns.number.test(value);
1452
1453            reqLength.classList.toggle("valid", lengthOk);
1454            reqUpper.classList.toggle("valid", upperOk);
1455            reqLower.classList.toggle("valid", lowerOk);
1456            reqNumber.classList.toggle("valid", numberOk);
1457
1458            const meetsPolicy = lengthOk && upperOk && lowerOk && numberOk;
1459
1460            // Collapse the checklist once it is satisfied. On a small phone those four rows are the
1461            // difference between the submit button being on screen and being below the fold.
1462            if (meetsPolicy) passwordReqs.style.display = "none";
1463
1464            if (!value) {
1465                passwordInput.classList.remove("input-error", "input-success");
1466                passwordFeedback.textContent = "";
1467                passwordFeedback.className = "field-feedback";
1468            } else {
1469                // No red state for a short password: an existing user typing a correct legacy
1470                // password is not making a mistake, and marking their field as an error was the
1471                // visual half of the bug.
1472                passwordInput.classList.remove("input-error");
1473                passwordInput.classList.toggle("input-success", meetsPolicy);
1474                passwordFeedback.textContent = "";
1475                passwordFeedback.className = "field-feedback";
1476            }
1477        }
1478
1479        function showAlert(message, type) {
1480            alertBox.textContent = message;
1481            alertBox.className = "login-alert " + type;
1482            alertBox.scrollIntoView({ behavior: "smooth", block: "nearest" });
1483        }
1484
1485        function hideAlert() {
1486            alertBox.className = "login-alert hidden";
1487        }
1488
1489        function rejectWith(message, field, reason) {
1490            showAlert(message, "error");
1491            submitBtn.classList.remove("loading");
1492            track("login_blocked_client", { reason: reason });
1493            if (field) field.focus();
1494        }
1495
1496        // ---- Two steps: resolve the address, THEN ask for a password --------------------------
1497        //
1498        // One form has always served both signing in and creating an account, and it could not tell
1499        // which it was doing, so it asked for both fields at once and let the server sort it out.
1500        // When the address turned out to be unknown the server took the registration branch and
1501        // answered someone who believed they were signing in with password rules: 486 times across
1502        // 388 sessions in the 5 days to 2026-09-02, of which only 101 sessions went on to create an
1503        // account. Asking first is what makes every string on this page able to be true.
1504        //
1505        // The probe NEVER gates the login. api-account-check.php answers "unknown" for a stale CSRF
1506        // token, a throttled IP, a Redis or database problem, and this code answers "unknown" for a
1507        // network failure or a timeout — and "unknown" is precisely the one-step form that existed
1508        // before, so the worst outcome of the whole mechanism is the behaviour it replaced.
1509        const PROVIDER_NAMES = { google: "Google", facebook: "Facebook", linkedin: "LinkedIn" };
1510
1511        let probedEmail = null;   // the address api-account-check.php last answered for
1512        let probedStatus = null;  // "password" | "social" | "new" | "unknown"
1513
1514        // Turnstile, armed only on the branch that can create an account.
1515        //
1516        // The whole point is that signing in is untouched: a returning user never loads the
1517        // Cloudflare script, never mounts a widget and never waits on a token. arm() is called
1518        // from showPasswordStep() for "new" and for "unknown" — "unknown" is included because it
1519        // is the probe failure fallback, and the server may still take the registration branch
1520        // for it. Everything here degrades to doing nothing: no site key, a blocked script, an
1521        // adblocked iframe. When that happens the server answers captcha_required and the submit
1522        // handler mounts the widget and asks for one more try, which is the only path that can
1523        // still reach a real person.
1524        //
1525        // appearance:"interaction-only" keeps it invisible for the large majority whose challenge
1526        // solves in the background, and reveals itself only when Cloudflare actually wants a tap.
1527        const Captcha = (function() {
1528            const slot = document.getElementById("turnstileSlot");
1529            let scriptPromise = null;
1530            let widgetId = null;
1531            let currentToken = "";
1532
1533            function available() {
1534                return !!TURNSTILE_KEY && !!slot;
1535            }
1536
1537            function loadScript() {
1538                if (scriptPromise) return scriptPromise;
1539                scriptPromise = new Promise(function(resolve, reject) {
1540                    const s = document.createElement("script");
1541                    s.src = "https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit";
1542                    s.async = true;
1543                    s.defer = true;
1544                    s.onload = resolve;
1545                    s.onerror = function() {
1546                        // Forget the rejection. A memoised failed promise would be handed back to
1547                        // every later caller, so one flaky load w
1547ould permanently disable the
1548                        // widget — including the captcha_required retry, whose whole job is to
1549                        // rescue the person this just happened to.
1550                        scriptPromise = null;
1551                        s.remove();
1552                        reject(new Error("turnstile blocked"));
1553                    };
1554                    document.head.appendChild(s);
1555                });
1556                return scriptPromise;
1557            }
1558
1559            // Idempotent: called on every entry to the create-account step, mounts once. A widget
1560            // that is already mounted is just un-parked (see park()).
1561            async function arm() {
1562                if (!available()) return;
1563                if (widgetId !== null) { slot.hidden = false; return; }
1564                try {
1565                    await loadScript();
1566                } catch (err) {
1567                    return;
1568                }
1569                if (!window.turnstile || widgetId !== null) return;
1570                slot.hidden = false;
1571                let id = null;
1572                try {
1573                    id = window.turnstile.render(slot, {
1574                        sitekey: TURNSTILE_KEY,
1575                        action: TURNSTILE_ACTION,
1576                        appearance: "interaction-only",
1577                        theme: "dark",
1578                        callback: function(t) { currentToken = t || ""; },
1579                        "expired-callback": function() { currentToken = ""; },
1580                        "error-callback": function() { currentToken = ""; }
1581                    });
1582                } catch (err) {
1583                    id = null;
1584                }
1585                // Cloudflare documents the return as "the widget ID" and says nothing about failure.
1586                // Accepting anything non-null would make armed() true for a widget that never
1587                // mounted (an undefined return), and then: token() waits its full timeout, "new"
1588                // is refused with a message about a challenge that is not on screen, and the retry
1589                // returns early here because widgetId is "set". Only a non-empty string counts.
1590                widgetId = (typeof id === "string" && id !== "") ? id : null;
1591                if (widgetId === null) slot.hidden = true;
1592            }
1593
1594            // Hide a mounted widget while the form is on a branch that cannot register — a
1595            // returning account, a Google account, back at the email step. Nothing is torn down,
1596            // so a later arm() is instant; this only stops a checkbox that Cloudflare chose to
1597            // show lingering above the sign-in button of an account it has nothing to do with.
1598            function park() {
1599                if (slot) slot.hidden = true;
1600            }
1601
1602            function armed() {
1603                return widgetId !== null;
1604            }
1605
1606            // Tokens are single-use, so this is called after every rejected submit — otherwise the
1607            // second attempt replays a token Cloudflare has already retired and fails as a
1608            // duplicate, which looks to the user like the site refusing them twice for no reason.
1609            function reset() {
1610                currentToken = "";
1611                if (widgetId === null || !window.turnstile) return;
1612                try { window.turnstile.reset(widgetId); } catch (err) {}
1613            }
1614
1615            // Wait briefly for a background solve. Resolves "" if the challenge needs a tap the
1616            // user has not given yet, and the caller turns that into a message rather than a hang.
1617            async function token(waitMs) {
1618                if (!armed()) return "";
1619                const deadline = Date.now() + (waitMs || 0);
1620                while (!currentToken && Date.now() < deadline) {
1621                    await new Promise(function(r) { setTimeout(r, 150); });
1622                }
1623                return currentToken;
1624            }
1625
1626            return { available: available, arm: arm, park: park, armed: armed, reset: reset, token: token };
1627        })();
1628
1629        function setHint(text, isSocial) {
1630            // textContent, not innerHTML: these strings are translations, but the branch below
1631            // splices a provider name into one of them and this element must never become a sink.
1632            stepHint.textContent = text;
1633            stepHint.className = isSocial ? "step-hint social" : "step-hint";
1634            stepHint.style.display = "block";
1635        }
1636
1637        function showEmailStep() {
1638            probedEmail = null;
1639            probedStatus = null;
1640            Captcha.park();
1641            passwordGroup.style.display = "none";
1642            passwordReqs.style.display = "none";
1643            stepHint.style.display = "none";
1644            usePasswordLink.style.display = "none";
1645            submitBtn.style.display = "";
1646            submitBtnText.textContent = STRINGS.btnContinue;
1647        }
1648
1649        // focusField is false when the reveal was not something the user just asked for (an
1650        // autofill landing after parse), because moving the caret out from under someone who may
1651        // be mid-keystroke in the email field is worse than the field arriving unfocused.
1652        // armCaptcha is false only from the autofill path: a password manager filling step one
1653        // means saved credentials, i.e. almost certainly a returning account, and "unknown" there
1654        // is "we have not asked yet", not "the probe failed". Arming on it would fetch the
1655        // Cloudflare script for the commonest successful sign-in there is. The submit handler
1656        // still probes and still arms if the answer turns out to be "new".
1657        function showPasswordStep(status, focusField, armCaptcha) {
1658            probedStatus = status;
1659            passwordGroup.style.display = "";
1660            usePasswordLink.style.display = "none";
1661            submitBtn.style.display = "";
1662            passwordInput.setAttribute("autocomplete", status === "new" ? "new-password" : "current-password");
1663
1664            // The checklist describes the rules for SETTING a password, so exactly one person sees
1665            // it: whoever is about to set one. Showing it to a returning user is the same mistake
1666            // that left 259k legacy accounts staring at a disabled button.
1667            passwordReqs.style.display = status === "new" ? "block" : "none";
1668
1669            // Both branches that can end in a new account. Fired here rather than on submit so the
1670            // background solve runs while the password is being typed and has finished by the time
1671            // it matters; "password" and "social" never reach it.
1672            if ((status === "new" || status === "unknown") && armCaptcha !== false) {
1673                Captcha.arm();
1674            } else {
1675                Captcha.park();
1676            }
1677
1678            if (status === "new") {
1679                submitBtnText.textContent = STRINGS.btnCreate;
1680                setHint(STRINGS.stepNew, false);
1681            } else if (status === "password") {
1682                submitBtnText.textContent = STRINGS.btnSignIn;
1683                setHint(STRINGS.stepReturning, false);
1684            } else {
1685                // Unknown: say nothing we cannot back up, and put the old label back.
1686                submitBtnText.textContent = STRINGS.btnDefault;
1687                stepHint.style.display = "none";
1688            }
1689
1690            if (focusField !== false) passwordInput.focus();
1691        }
1692
1693        function showSocialStep(provider) {
1694            probedStatus = "social";
1695            Captcha.park();
1696            passwordGroup.style.display = "none";
1697            passwordReqs.style.display = "none";
1698            // Nothing for the submit button to do here — the action is the Google button above,
1699            // or the link below for the rare account that also holds a password.
1700            submitBtn.style.display = "none";
1701            usePasswordLink.style.display = "block";
1702
1703            if (provider === "google") {
1704                setHint(STRINGS.stepSocial, true);
1705            } else {
1706                // Google is the only provider with a button on this page, so a Facebook or LinkedIn
1707                // account is pointed at the password-reset link instead of at a control that is not
1708                // there. 487 accounts are Facebook-only; none are LinkedIn-only.
1709                setHint(STRINGS.socialOther.replace("{provider}", PROVIDER_NAMES[provider] || "your provider"), true);
1710            }
1711        }
1712
1713        async function probeEmail(email) {
1714            const controller = new AbortController();
1715            // A slow answer must not hold the form hostage; 4s then fall back to the old flow.
1716            const timer = setTimeout(function() { controller.abort(); }, 4000);
1717            try {
1718                const body = new FormData();
1719                body.append("email", email);
1720                body.append("csrf", form.elements.csrf ? form.elements.csrf.value : "");
1721                const res = await fetch(BASE + "api-account-check.php", {
1722                    method: "POST",
1723                    body: body,
1724                    headers: { "X-Requested-With": "XMLHttpRequest" },
1725                    signal: controller.signal
1726                });
1727                const data = await res.json();
1728                return (data && data.status) ? data : { status: "unknown", provider: null };
1729            } catch (err) {
1730                return { status: "unknown", provider: null };
1731            } finally {
1732                clearTimeout(timer);
1733            }
1734        }
1735
1736        usePasswordLink.addEventListener("click", function() {
1737            showPasswordStep("password");
1738        });
1739
1740        // Toggle Password Visibility
1741        togglePassword.addEventListener("click", function() {
1742            const type = passwordInput.type === "password" ? "text" : "password";
1743            passwordInput.type = type;
1744            document.getElementById("eyeLine").style.display = type === "text" ? "block" : "none";
1745        });
1746
1747        // Show password requirements on focus, unless the password already satisfies them — or the
1748        // probe has told us this is a returning account, in which case the rules do not apply to
1749        // this person at all and putting them on screen is how they end up feeling refused.
1750        passwordInput.addEventListener("focus", function() {
1751            if (probedStatus === "password") return;
1752            if (passwordInput.value && classPatterns.upper.test(passwordInput.value)
1753                && classPatterns.lower.test(passwordInput.value)
1754                && classPatterns.number.test(passwordInput.value)
1755                && passwordInput.value.length >= POLICY.minLength) {
1756                return;
1757            }
1758            passwordReqs.style.display = "block";
1759        });
1760
1761        emailInput.addEventListener("input", validateEmail);
1762        emailInput.addEventListener("blur", validateEmail);
1763        passwordInput.addEventListener("input", updatePasswordMeter);
1764
1765        // Editing the address after it has been resolved invalidates every claim on screen — the
1766        // "welcome back" line, the button label, whether the checklist belongs there — so go back
1767        // to step one rather than leave the form asserting something about a different account.
1768        emailInput.addEventListener("input", function() {
1769            if (probedEmail !== null && emailInput.value.trim() !== probedEmail) {
1770                showEmailStep();
1771            }
1772        });
1773
1774        // Google Login Handler.
1775        // No longer gated on a consent checkbox. It used to return early with nothing but a shake
1776        // animation near the bottom of the form, which silently killed the button that carries ~85%
1777        // of all successful logins.
1778        googleBtn.addEventListener("click", function() {
1779            track("login_google_clicked", {});
1780            window.location.href = BASE + "auth.php?google=1&login=1";
1781        });
1782
1783        // Form Submit via AJAX
1784        form.addEventListener("submit", async function(e) {
1785            e.preventDefault();
1786
1787            if (!validateEmail()) {
1788                rejectWith(STRINGS.invalidEmail, emailInput, "invalid_email");
1789                return;
1790            }
1791
1792            const typedEmail = emailInput.value.trim();
1793
1794            // Step one. Resolve the address, then decide what this form is for.
1795            if (probedEmail !== typedEmail) {
1796                submitBtn.classList.add("loading");
1797                hideAlert();
1798                const probe = await probeEmail(typedEmail);
1799                submitBtn.classList.remove("loading");
1800
1801                probedEmail = typedEmail;
1802                track("login_email_probed", { status: probe.status });
1803
1804                if (probe.status === "social") {
1805                    showSocialStep(probe.provider);
1806                    return;
1807                }
1808
1809                showPasswordStep(probe.status);
1810
1811                // Stop here so they can type the password we have just asked for. The exception is
1812                // a field a password manager has already filled: making that person press the
1813                // button twice would be a regression for the commonest successful path there is.
1814                if (!passwordInput.value) return;
1815            }
1816
1817            // Presence, not strength. See updatePasswordMeter().
1818            if (!passwordInput.value) {
1819                rejectWith(STRINGS.passwordEmpty, passwordInput, "empty_password");
1820                return;
1821            }
1822
1823            submitBtn.classList.add("loading");
1824            hideAlert();
1825
1826            const body = new FormData(form);
1827
1828            // Turnstile, and ONLY on a branch that can create an account. Keying this off
1829            // Captcha.armed() alone was wrong: the widget stays mounted after the address is
1830            // edited, so somebody who mistyped their address, armed it, then corrected it to
1831            // their real one was refused a SIGN-IN by a challenge sign-in does not use — the one
1832            // path this feature promised not to touch. probedStatus is what says which branch
1833            // this is; armed() only says whether a widget happens to exist.
1834            //
1835            // Turnstile renders inside the form and injects cf-turnstile-response itself, so
1836            // FormData has usually collected the token already; the rest of this only fills gaps.
1837            if (probedStatus === "new" || probedStatus === "unknown") {
1838                // Submitted before the mount finished. Waiting beats spending a round trip on a
1839                // request the server would answer with captcha_required.
1840                if (!Captcha.armed()) await Captcha.arm();
1841
1842                if (Captcha.armed() && !body.get("cf-turnstile-response")) {
1843                    const captchaToken = await Captcha.token(5000);
1844                    if (captchaToken) {
1845                        body.set("cf-turnstile-response", captchaToken);
1846                    } else if (probedStatus === "new") {
1847                        // Known to be a registration, and Cloudflare wants a tap it has not had.
1848                        // interaction-only means the widget is on screen by now, so point at it
1849                        // rather than submit a request the server is certain to refuse.
1850                        submitBtn.classList.remove("loading");
1851                        showAlert(STRINGS.captchaFailed, "error");
1852                        track("signup_blocked_client", { reason: "captcha_incomplete" });
1853                        return;
1854                    }
1855                    // "unknown" deliberately falls through unblocked: the probe failed, so this
1856                    // may well be a login, and refusing it here would break sign-in for someone
1857                    // whose only mistake was a flaky network. The server is the only party that
1858                    // knows which branch it took, and it answers captcha_required if it matters.
1859                }
1860            }
1861
1862            try {
1863                const response = await fetch(BASE, {
1864                    method: "POST",
1865                    body: body,
1866                    headers: { "X-Requested-With": "XMLHttpRequest" }
1867                });
1868
1869                // index.php answers a stale CSRF token with a plain-text 403, not JSON. The old code
1870                // let response.json() throw, then resubmitted the form without the ajax flag — which
1871                // hit the same 403 and rendered it as a blank white page. Read the body defensively
1872                // and tell the user something true instead.
1873                let data = null;
1874                try {
1875                    data = await response.json();
1876                } catch (parseError) {
1877                    data = null;
1878                }
1879
1880                if (!data) {
1881                    submitBtn.classList.remove("loading");
1882                    if (response.status === 403) {
1883                        // Stale CSRF token: the session expired while this page sat open. Nothing
1884                        // the user can do but reload, so do it for them and carry the email over.
1885                        showAlert(STRINGS.sessionExpired, "error");
1886                        track("login_blocked_client", { reason: "csrf_expired" });
1887                        try { sessionStorage.setItem("login_email", emailInput.value.trim()); } catch (err) {}
1888                        setTimeout(function() { window.location.reload(); }, 2500);
1889                    } else {
1890                        showAlert(STRINGS.loginFailed, "error");
1891                        track("login_blocked_client", { reason: "bad_response_" + response.status });
1892                    }
1893                    return;
1894                }
1895
1896                if (data.success) {
1897                    showAlert(data.message || STRINGS.redirecting, "success");
1898                    try { sessionStorage.removeItem("login_email"); } catch (err) {}
1899                    setTimeout(function() {
1900                        window.location.href = data.redirect || BASE;
1901                    }, 500);
1902                } else {
1903                    // captcha_required is the server saying it took the registration branch and
1904                    // found no usable token — a probe that answered "unknown", a page that was
1905                    // open before the widget mounted, a blocked script. Mount it now and let them
1906                    // try once more; without this the person is simply stuck forever.
1907                    if (data.captcha_required) await Captcha.arm();
1908
1909                    // Every rejection retires the token, so the next attempt needs a fresh one.
1910                    Captcha.reset();
1911
1912                    showAlert(data.message || STRINGS.loginFailed, "error");
1913                    submitBtn.classList.remove("loading");
1914                }
1915            } catch (err) {
1916                // Genuine network failure. Resubmitting the form here would only produce the blank
1917                // page described above, so say what happened and leave the typed values in place.
1918                showAlert(STRINGS.networkError, "error");
1919                submitBtn.classList.remove("loading");
1920            }
1921        });
1922
1923        // Autofill recovery.
1924        //
1925        // Browsers fill saved credentials asynchronously, and Safari/iOS in particular masks the
1926        // value from scripts until the user interacts with the page. A one-shot check at parse time
1927        // therefore reads "" for a field that visibly contains a password. That used to leave the
1928        // submit button disabled on a form the user could see was full. The button is no longer
1929        // disabled, so this is now only about keeping the checklist and the email state honest.
1930        function syncFromAutofill() {
1931            if (emailInput.value) validateEmail();
1932            if (passwordInput.value) {
1933                updatePasswordMeter();
1934                // A manager filled the password while we were still on step one. Hiding a field the
1935                // browser has already filled is worse than showing one we have not justified yet,
1936                // so reveal it and let the submit handler resolve the address on the way past.
1937                if (passwordGroup.style.display === "none") showPasswordStep("unknown", false, false);
1938            }
1939        }
1940
1941        // Applied from script, never from the server response: a browser that fails to run this
1942        // must still get the working one-step form the page has always rendered.
1943        if (!passwordInput.value) showEmailStep();
1944
1945        syncFromAutofill();
1946        setTimeout(syncFromAutofill, 250);
1947        window.addEventListener("pageshow", syncFromAutofill);
1948        form.addEventListener("focusin", syncFromAutofill, { once: true });
1949
1950        // Restore the email after a forced reload from an expired CSRF token.
1951        try {
1952            const savedEmail = sessionStorage.getItem("login_email");
1953            if (savedEmail && !emailInput.value) {
1954                emailInput.value = savedEmail;
1955                validateEmail();
1956            }
1957            sessionStorage.removeItem("login_email");
1958        } catch (err) { /* private mode */ }
1959
1960        // Update forgot password link with current email
1961        const forgotLink = document.getElementById("forgotPasswordLink");
1962        function updateForgotLink() {
1963            const email = emailInput.value.trim();
1964            forgotLink.href = email && emailPattern.test(email)
1965                ? BASE + "forgot-password?email=" + encodeURIComponent(email)
1966                : BASE + "forgot-password";
1967        }
1968        emailInput.addEventListener("change", updateForgotLink);
1969        emailInput.addEventListener("blur", updateForgotLink);
1970        updateForgotLink();
1971    })();
1972    </script>
1972
1973
1974    
1975
1976
1977    </main>
1978
1979    
1980
1981    
1981<script>(function(d, w, c){w.BrevoConversationsID = '64b5a57d072c447de967a09b';w[c] = w[c] || function(){ (w[c].q = w[c].q || []).push(arguments); };w.ccLoadBrevoChat = function(cb){var s = d.getElementById('brevo-convo-script');if (s) { if (cb) cb(); return; }s = d.createElement('script'); s.id = 'brevo-convo-script'; s.async = true;s.src = 'https://conversations-widget.brevo.com/brevo-conversations.js';if (cb) s.onload = function(){ setTimeout(cb, 800); };(d.head || d.documentElement).appendChild(s);};w.ccOpenSupportChat = function(){try { w.ccLoadBrevoChat(function(){ try { w[c]('openChat', true); } catch(e) {} }); } catch(e) {}};w.ccLoadBrevoChat();})(document, window, 'BrevoConversations');</script>
1981
1982
1983
1984    <footer class="text-center" id="footer">
1985
1986    <p>
1987    <a href="https://rebrand.ly/reddit-clipcafe" title="Our Reddit community"><img data-src="img/reddit.svg" height="50" width="50" alt="Reddit community" class="lazyImg"></a>
1988    <a href="https://discord.gg/kyKmte9CPp" title="Our Discord Channel"><img data-src="img/discord2.svg" height="50" width="50" alt="Discord Channel" class="lazyImg"></a>
1989    <a href="https://rebrand.ly/twitter-clipcafe" title="Our Twitter"><img data-src="img/twitter.svg" height="50" width="50" alt="Twitter" class="lazyImg"></a>
1990    </p>
1991
1992    <div class="text-center m-33-a">
1993    <div class="trustpilot-badge">
1994        <a href="https://www.trustpilot.com/review/clip.cafe" target="_blank" rel="noopener">
1995
1996            <div class="badge-content">
1997                <div class="badge-score">4.5</div>
1998                <div class="badge-rating">Excellent</div>
1999                <div class="badge-stars">★★★★☆</div>
2000            </div>
2001        </a>
2002    </div>
2003</div>
2004
2005    <div class="footer-lang-switcher"><a href="#" onclick="switchLanguage('en'); return false;" class="footer-lang-link active"><img src="https://flagcdn.com/w40/gb.png" width="20" height="15" alt="English" style="border-radius: 2px; vertical-align: middle;"> English</a> <span class="footer-lang-sep">|</span> <a href="#" onclick="switchLanguage('es'); return false;" class="footer-lang-link"><img src="https://flagcdn.com/w40/es.png" width="20" height="15" alt="Spanish" style="border-radius: 2px; vertical-align: middle;"> Español</a> <span class="footer-lang-sep">|</span> <a href="#" onclick="switchLanguage('pt'); return false;" class="footer-lang-link"><img src="https://flagcdn.com/w40/br.png" width="20" height="15" alt="Portuguese" style="border-radius: 2px; vertical-align: middle;"> Português</a> <span class="footer-lang-sep">|</span> <a href="#" onclick="switchLanguage('fr'); return false;" class="footer-lang-link"><img src="https://flagcdn.com/w40/fr.png" width="20" height="15" alt="French" style="border-radius: 2px; vertical-align: middle;"> Français</a> <span class="footer-lang-sep">|</span> <a href="#" onclick="switchLanguage('de'); return false;" class="footer-lang-link"><img src="https://flagcdn.com/w40/de.png" width="20" height="15" alt="German" style="border-radius: 2px; vertical-align: middle;"> Deutsch</a> <span class="footer-lang-sep">|</span> <a href="#" onclick="switchLanguage('it'); return false;" class="footer-lang-link"><img src="https://flagcdn.com/w40/it.png" width="20" height="15" alt="Italian" style="border-radius: 2px; vertical-align: middle;"> Italiano</a> <span class="footer-lang-sep">|</span> <a href="#" onclick="switchLanguage('tr'); return false;" class="footer-lang-link"><img src="https://flagcdn.com/w40/tr.png" width="20" height="15" alt="Turkish" style="border-radius: 2px; vertical-align: middle;"> Türkçe</a> <span class="footer-lang-sep">|</span> <a href="#" onclick="switchLanguage('zh'); return false;" class="footer-lang-link"><img src="https://flagcdn.com/w40/cn.png" width="20" height="15" alt="Chinese" style="border-radius: 2px; vertical-align: middle;"> 中文</a> <span class="footer-lang-sep">|</span> <a href="#" onclick="switchLanguage('ja'); return false;" class="footer-lang-link"><img src="https://flagcdn.com/w40/jp.png" width="20" height="15" alt="Japanese" style="border-radius: 2px; vertical-align: middle;"> 日本語</a> <span class="footer-lang-sep">|</span> <a href="#" onclick="switchLanguage('ko'); return false;" class="footer-lang-link"><img src="https://flagcdn.com/w40/kr.png" width="20" height="15" alt="Korean" style="border-radius: 2px; vertical-align: middle;"> 한국어</a> <span class="footer-lang-sep">|</span> <a href="#" onclick="switchLanguage('id'); return false;" class="footer-lang-link"><img src="https://flagcdn.com/w40/id.png" width="20" height="15" alt="Indonesian" style="border-radius: 2px; vertical-align: middle;"> Bahasa Indonesia</a> <span class="footer-lang-sep">|</span> <a href="#" onclick="switchLanguage('ar'); return false;" class="footer-lang-link"><img src="https://flagcdn.com/w40/sa.png" width="20" height="15" alt="Arabic" style="border-radius: 2px; vertical-align: middle;"> العربية</a></div>
2006
2007    <div class="footer-links-row">
2008    Movie Quote Database with Video Clips |
2009    <a href="./spotlight/">Spotlight</a> |
2010    <a href="./categories/">Genres</a> |
2011    <a href="./movies-by-year">Years</a> |
2012    <a href="./aboutus/">About Us</a> |
2013    <a href="./privacypolicy/">Privacy Policy</a> |
2014    <a href="./refundpolicy/">Refund Policy</a> |
2015    <a href="./termsandconditions/">Terms & Conditions</a> |
2016    <a href="./allsitemaps.xml">Sitemap</a> |
2017    <a href="./dmca/">DMCA</a>  |
2018    <a href="#" onclick="ccOpenSupportChat();return false;">
2018Report a bug</a> |
2019    info<img src="img/e.svg" class="v-sub" height="20" width="20" alt="@">clip.cafe | 1337 LLC,  Charlestown,Nevis
2020    </div>
2021    
2022
2023    All movie names, images, videos are registered trademarks and/or copyrights of their respective holders | Site is protected by reCAPTCHA. <a href="https://policies.google.com/privacy" target="_blank" rel="noopener noreferrer">Google Privacy Policy</a> and
2024    <a href="https://policies.google.com/terms" target="_blank" rel="noopener noreferrer">Terms of Service</a> apply.
2025
2026    </footer>
2027
2028    
2028<script>
2029    
2030    </script>
2030
2031
2032    <!-- Security Cleanup Script -->
2033    
2033<script src="security-cleanup.js?v=1769240009"></script>
2033
2034
2035    
2036
2037    
2038
2039
2040  
2040<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a440ca924df67236',t:'MTc5MDkxMzUzMw=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
2040<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"0eaf7b9cdd604b0a9b725aebbca431a8","r":1,"spa":2}' crossorigin="anonymous"></script>
2040
2041</body>
2042</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.