{% extends "base.html" %} {% block title %}CCTV — SignalOps{% endblock %} {% block extra_style %} @keyframes skeleton-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } .skeleton-card { background: var(--s); border: 1px solid var(--b); border-radius: 8px; padding: 18px; animation: skeleton-pulse 1.4s ease-in-out infinite; } .skeleton-card .sk-img { width: 100%; height: 140px; background: linear-gradient(90deg, rgba(138, 122, 184,0.08) 0%, rgba(138, 122, 184,0.2) 50%, rgba(138, 122, 184,0.08) 100%); background-size: 200% 100%; animation: skeleton-shimmer 1.4s linear infinite; border-radius: 6px; margin-bottom: 12px; } .skeleton-card .sk-line { height: 10px; background: rgba(138, 122, 184,0.12); border-radius: 4px; margin-bottom: 8px; } @keyframes skeleton-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } .src-pending { color: var(--tm); margin-right: 14px; } /* Camera preview fallback — shown when image fails to load (CORS/404/offline) */ .cam-preview-wrap { width: 100%; height: 140px; border-radius: 6px; margin-bottom: 10px; overflow: hidden; position: relative; background: linear-gradient(135deg, #0F1014 0%, #1A1D22 100%); border: 1px solid rgba(255,255,255,0.04); } .cam-preview-wrap img { width: 100%; height: 100%; object-fit: cover; display: block; } .cam-preview-wrap .cam-fallback { position: absolute; inset: 0; display: none; flex-direction: column; align-items: center; justify-content: center; gap: 6px; color: var(--tm); font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 1px; text-align: center; padding: 10px; } .cam-preview-wrap .cam-fallback .ico { font-size: 32px; opacity: 0.35; } .cam-preview-wrap.failed img { display: none; } .cam-preview-wrap.failed .cam-fallback { display: flex; } @media (max-width: 900px) { #cctv-type, #cctv-country { width: 100% !important; } .cctv-field { flex: 1 1 100% !important; min-width: 0 !important; } #cctv-grid { grid-template-columns: repeat(auto-fill, minmax(min(280px, 100%), 1fr)) !important; } #cctv-grid .btn, .cctv-actions .btn { min-height: 38px; } #cam-stat-badges { display: flex; flex-wrap: wrap; gap: 6px; } .cctv-actions { flex: 1 1 100%; } .cctv-actions .btn { flex: 1; } .cctv-actions { flex-wrap: wrap; } .cctv-actions #so-case-bar { flex: 1 1 100%; } .cctv-actions #so-case-bar .so-cs-bar, .cctv-actions #so-case-bar .so-cs-dd { flex: 1; } .cctv-actions #so-case-bar .so-cs-bar { flex-wrap: nowrap; } .cctv-actions #so-case-bar .so-cs-btn { width: 100%; } } {% endblock %} {% block content %}
IP Camera Discovery
Search
Type
Country
Search for cameras
Shodan · ZoomEye · FOFA · Censys · Netlas · Windy · OSM · Insecam · EarthCam · 21 official traffic / park / volcano camera networks
{% endblock %} {% block scripts %} {% endblock %}