From acd02d83d4ac0a83e41c3e2766a8251e0f9fcab7 Mon Sep 17 00:00:00 2001 From: lolcat Date: Sat, 9 Aug 2025 13:28:36 -0400 Subject: [PATCH] added cara.app --- lib/frontend.php | 2 + scraper/cara.php | 847 +++++++++++++++++++++++++++++++++++++++++++++++ settings.php | 4 + 3 files changed, 853 insertions(+) create mode 100644 scraper/cara.php diff --git a/lib/frontend.php b/lib/frontend.php index 7d898c5..41f9bad 100644 --- a/lib/frontend.php +++ b/lib/frontend.php @@ -974,6 +974,7 @@ class frontend{ "baidu" => "Baidu", //"solofield" => "Solofield", "pinterest" => "Pinterest", + "cara" => "Cara", "flickr" => "Flickr", "fivehpx" => "500px", "vsco" => "VSCO", @@ -990,6 +991,7 @@ class frontend{ "option" => [ "yt" => "YouTube", "vimeo" => "Vimeo", + //"odysee" => "Odysee", "sepiasearch" => "Sepia Search", //"fb" => "Facebook videos", "ddg" => "DuckDuckGo", diff --git a/scraper/cara.php b/scraper/cara.php new file mode 100644 index 0000000..ed3d0b5 --- /dev/null +++ b/scraper/cara.php @@ -0,0 +1,847 @@ +backend = new backend("cara"); + } + + public function getfilters($page){ + + return [ + "sort" => [ + "display" => "Sort by", + "option" => [ + "Top" => "Top", + "MostRecent" => "Most Recent" + ] + ], + "type" => [ + "display" => "Post type", + "option" => [ + "any" => "Any type", + "portfolio" => "Portfolio", // {"posts":["portfolio"]} + "timeline" => "Timeline" // {"posts":["timeline"]} + ] + ], + "fields" => [ + "display" => "Field/Medium", + "option" => [ + "any" => "Any field", + "2D" => "2D Work", + "3D" => "3D Work", + "3DPrinting" => "3D Printing", + "Acrylic" => "Acrylic", + "AlcoholMarkers" => "Alcohol Markers", + "Animation" => "Animation", + "Chalk" => "Chalk", + "Charcoal" => "Charcoal", + "Colored pencil" => "Colored pencil", + "Conte" => "Conte", + "Crayon" => "Crayon", + "Digital" => "Digital", + "Gouache" => "Gouache", + "Ink" => "Ink", + "MixedMedia" => "Mixed-Media", + "Oil" => "Oil", + "Oil-based Markers" => "Oil-based Markers", + "Other" => "Other", + "Pastels" => "Pastels", + "Photography" => "Photography", + "Sculpture" => "Sculpture", + "Sketches" => "Sketches", + "Tattoos" => "Tattoos", + "Traditional" => "Traditional", + "VFX" => "VFX", + "Watercolor" => "Watercolor" + ] + ], + "category" => [ + "display" => "Category", + "option" => [ + "any" => "Any category", + "3DScanning" => "3D Scanning", + "Abstract" => "Abstract", + "Adoptable" => "Adoptable", + "Anatomy" => "Anatomy", + "Animals" => "Animals", + "Anime" => "Anime", + "App" => "App", + "ArchitecturalConcepts" => "Architectural Concepts", + "ArchitecturalVisualization" => "Architectural Visualization", + "AugmentedReality" => "Augmented Reality", + "Automotive" => "Automotive", + "BoardGameArt" => "Board Game Art", + "BookIllustration" => "Book Illustration", + "CardGameArt" => "Card Game Art", + "CeramicsPottery" => "Ceramics/Pottery", + "CharacterAnimation" => "Character Animation", + "CharacterDesign" => "Character Design", + "CharacterModeling" => "Character Modeling", + "ChildrensArt" => "Children's Illustration", + "Collectibles" => "Collectibles", + "ColoringPage" => "Coloring Page", + "ComicArt" => "Comic Art", + "ConceptArt" => "Concept Art", + "Cosplay" => "Cosplay", + "CostumeDesign" => "Costume Design", + "CoverArt" => "Cover Art", + "Creatures" => "Creatures", + "Diorama" => "Diorama", + "EditorialIllustration" => "Editorial Illustration", + "EmbroiderySewing" => "Embroidery/Sewing", + "EnvironmentalConceptArt" => "Environmental Concept Art", + "EnvironmentalConceptDesign" => "Environmental Concept Design", + "FanArt" => "Fan Art", + "Fantasy" => "Fantasy", + "Fashion" => "Fashion", + "FashionStyling" => "Fashion Styling", + "FiberArts" => "Fiber Arts", + "Furry" => "Furry", + "GameArt" => "Game Art", + "GameplayDesign" => "Gameplay Design", + "GamesEnvironmentArt" => "Games Environment Art", + "Gem" => "Gem", + "GraphicDesign" => "Graphic Design", + "Handicraft" => "Handicraft", + "HairStyling" => "Hair Styling", + "HardSurface" => "Hard Surface", + "Horror" => "Horror", + "Illustration" => "Illustration", + "IllustrationVisualization" => "Illustration Visualization", + "IndustrialDesign" => "Industrial Design", + "Jewelry" => "Jewelry", + "KnittingCrochet" => "Knitting/Crochet", + "Landscape" => "Landscape", + "LevelDesign" => "Level Design", + "Lighting" => "Lighting", + "Makeup" => "Makeup", + "Manga" => "Manga", + "MapsCartography" => "Maps/Cartography", + "MattePainting" => "Matte Painting", + "Materials" => "Materials", + "MechanicalDesign" => "Mechanical Design", + "Medical" => "Medical", + "Mecha" => "Mecha", + "MiniatureArt" => "Miniature Art", + "MotionGraphics" => "Motion Graphics", + "FrescoMurals" => "Fresco/Murals", + "Natural" => "Natural", + "Original Character" => "Original Character", + "Overlay" => "Overlay", + "PleinAir" => "Plein Air", + "Photogrammetry" => "Photogrammetry", + "PixelArt" => "Pixel Art", + "Portraits" => "Portraits", + "Props" => "Props", + "ProductDesign" => "Product Design", + "PublicDomain" => "Public Domain or Royalty Free", + "Real-Time3DEnvironmentArt" => "Real-Time 3D Environment Art", + "Realism" => "Realism", + "ScienceFiction" => "Science Fiction", + "ScientificVisualization" => "Scientific Visualization", + "Scripts" => "Scripts", + "StillLife" => "Still Life", + "Storyboards" => "Storyboards", + "Stylized" => "Stylized", + "Surreal" => "Surreal", + "TechnicalArt" => "Technical Art", + "Textures" => "Textures", + "Tools" => "Tools", + "Toys" => "Toys", + "ToyPackaging" => "Toy Packaging", + "Tutorials" => "Tutorials", + "UIArt" => "User Interface (UI) Art", + "UrbanSketch" => "Urban Sketch", + "VFXforAnimation" => "VFX for Animation", + "VFXforFilm" => "VFX for Film", + "VFXforGames" => "VFX for Games", + "VFXforRealTime" => "VFX for Real-Time", + "VFXforTV" => "VFX for TV", + "Vehicles" => "Vehicles", + "VirtualReality" => "Virtual Reality", + "VisualDevelopment" => "Visual Development", + "VoxelArt" => "Voxel Art", + "Vtubers" => "Vtubers", + "WIP" => "WIP (Work in Progress)", + "Web" => "Web", + "Weapons" => "Weapons", + "Wildlife" => "Wildlife", + "Woodcutting" => "Woodcutting" + ] + ], + "software" => [ + "display" => "Software", + "option" => [ + "any" => "Any software", + "123D" => "123D", + "123DCatch" => "123D Catch", + "3DBee" => "3DBee", + "3DCoat" => "3DCoat", + "3DCoatPrint" => "3DCoatPrint", + "3DCoatTextura" => "3DCoatTextura", + "3DEqualizer" => "3DEqualizer", + "3DFZephyr" => "3DF Zephyr", + "3Delight" => "3Delight", + "3dpeople" => "3dpeople", + "3dsMax" => "3ds Max", + "3DSPaint" => "3DS Paint", + "ACDSeeCanvas" => "ACDSee Canvas", + "AbletonLive" => "Ableton Live", + "Acrobat" => "Acrobat", + "AdobeDraw" => "Adobe Draw", + "AdobeFlash" => "Adobe Flash", + "AdobeFresco" => "Adobe Fresco", + "AdobeSubstance3Dassets" => "Adobe Substance 3D assets", + "AdobeXD" => "Adobe XD", + "AffinityDesigner" => "Affinity Designer", + "AffinityPhoto" => "Affinity Photo", + "AfterEffects" => "After Effects", + "Akeytsu" => "Akeytsu", + "Alchemy" => "Alchemy", + "AliasDesign" => "Alias Design", + "AlightMotion" => "Alight Motion", + "Amadine" => "Amadine", + "Amberlight" => "Amberlight", + "Animate" => "Animate", + "AnimationMaster" => "Animation:Master", + "AnimeStudio" => "Anime Studio", + "Apophysis" => "Apophysis", + "ArchiCAD" => "ArchiCAD", + "Arion" => "Arion", + "ArionFX" => "ArionFX", + "Arnold" => "Arnold", + "ArtEngine" => "ArtEngine", + "ArtFlow" => "ArtFlow", + "ArtRage" => "ArtRage", + "ArtstudioPro" => "Artstudio Pro", + "Artweaver" => "Artweaver", + "Aseprite" => "Aseprite", + "Audition" => "Audition", + "AutoCAD" => "AutoCAD", + "AutodeskSketchBook" => "Autodesk SketchBook", + "AvidMediaComposer" => "Avid Media Composer", + "AzPainter" => "AzPainter", + "babylonjs" => "babylon.js", + "BalsamiqMockup" => "Balsamiq Mockup", + "Bforartists" => "Bforartists", + "BlackInk" => "Black Ink", + "BlackmagicDesignFusion" => "Blackmagic Design Fusion", + "Blender" => "Blender", + "Blender DeepPaint" => "Blender DeepPaint", + "BlenderGreasePencil" => "Blender Grease Pencil", + "Blockbench" => "Blockbench", + "BodyPaint" => "BodyPaint", + "Boxcutter" => "Boxcutter", + "BraidMaker" => "Braid Maker", + "BrickLinkStudio" => "BrickLink Studio", + "Bridge" => "Bridge", + "Brushifyio" => "Brushify.io", + "C" => "C", + "C#" => "C#", + "C++" => "C++", + "CACANi" => "CACANi", + "CLIPSTUDIOPAINT" => "CLIP STUDIO PAINT", + "CLO" => "CLO", + "CRYENGINE" => "CRYENGINE", + "Callipeg" => "Callipeg", + "Canva" => "Canva", + "CaptureOne" => "Capture One", + "CartoonAnimator" => "Cartoon Animator", + "Carveco" => "Carveco", + "Cavalry" => "Cavalry", + "Chaotica" => "Chaotica", + "CharacterAnimator" => "Character Animator", + "CharacterCreator" => "Character Creator", + "Cinema4D" => "Cinema 4D", + "ClarisseiFX" => "Clarisse iFX", + "Coiffure" => "Coiffure", + "ColorsLive" => "Colors Live", + "Combustion" => "Combustion", + "Construct2" => "Construct 2", + "Core" => "Core", + "CorelPainter" => "Corel Painter", + "CorelDRAWGraphicsSuite" => "CorelDRAW Graphics Suite", + "CoronaRenderer" => "Corona Renderer", + "ProMotionNG" => "Cosmigo Pro Motion NG", + "CrazyBump" => "CrazyBump", + "Crocotile3D" => "Crocotile 3D", + "Curvy3D" => "Curvy 3D", + "Cycles4D" => "Cycles 4D", + "Darkroom" => "Darkroom", + "DAZStudio" => "DAZ Studio", + "DDO" => "DDO", + "DECIMA" => "DECIMA", + "Darktable" => "Darktable", + "DaVinciResolve" => "DaVinci Resolve", + "Dimension" => "Dimension", + "DragonBones" => "DragonBones", + "Dragonframe" => "Dragonframe", + "Drawpile" => "Drawpile", + "Dreams" => "Dreams", + "Dreamweaver" => "Dreamweaver", + "DxOPhotoLab" => "DxO PhotoLab", + "ECycles" => "E-Cycles", + "EmberGen" => "EmberGen", + "Encore" => "Encore", + "Expresii" => "Expresii", + "FStorm" => "FStorm", + "FadeIn" => "FadeIn", + "Feather3D" => "Feather 3D", + "FiberShop" => "FiberShop", + "Figma" => "Figma", + "FilmoraWondershare" => "Filmora Wondershare", + "FilterForge" => "Filter Forge", + "FinalCutPro" => "Final Cut Pro", + "FinalDraft" => "Final Draft", + "finalRender" => "finalRender", + "FireAlpaca" => "FireAlpaca", + "Fireworks" => "Fireworks", + "FlamePainter" => "Flame Painter", + "Flash" => "Flash", + "FlipaClip" => "FlipaClip", + "FlipnoteStudio" => "Flipnote Studio", + "Fluent" => "Fluent", + "ForestPack" => "Forest Pack", + "FormZ" => "Form-Z", + "Fractorium" => "Fractorium", + "FreeCAD" => "FreeCAD", + "FreeHand" => "FreeHand", + "Forger" => "Forger", + "FrostbiteEngine" => "Frostbite Engine", + "fSpy" => "fSpy", + "FumeFX" => "FumeFX", + "Fusion360" => "Fusion 360", + "GIMP" => "GIMP", + "GSCurveTools" => "GS CurveTools", + "GSToolbox" => "GS Toolbox", + "Gaea" => "Gaea", + "GameTextures" => "Game Textures", + "GameMakerStudio" => "GameMaker: Studio", + "GarageFarmNET" => "GarageFarm.NET", + "GeoGlyph" => "GeoGlyph", + "GigapixelAl" => "Gigapixel Al", + "Glaxnimate" => "Glaxnimate", + "GnomePaint" => "Gnome Paint", + "Godot" => "Godot", + "Goxel" => "Goxel", + "Graphite" => "Graphite", + "Graswald" => "Graswald", + "GravitySketch" => "Gravity Sketch", + "GuerillaRender" => "GuerillaRender", + "HDRLightStudio" => "HDR Light Studio", + "HairStrandDesigner" => "Hair Strand Designer", + "HairTGHairFur" => "HairTG - Hair & Fur", + "HairTGSurfaceFeatherEdition" => "HairTG - Surface, Feather Edition", + "HairTGSurfaceHairEdition" => "HairTG - Surface, Hair Edition", + "Handplane" => "Handplane", + "Hansoft" => "Hansoft", + "HardOps" => "Hard Ops", + "HardMesh" => "HardMesh", + "Harmony" => "Harmony", + "HeavypaintWebbypaint" => "Heavypaint/Webbypaint", + "HelloPaint" => "HelloPaint", + "HeliconFocus" => "Helicon Focus", + "Hexels" => "Hexels", + "HiPaint" => "HiPaint", + "Houdini" => "Houdini", + "HydraRenderer" => "Hydra Renderer", + "iArtbook" => "iArtbook", + "IbisPaint" => "ibisPaint", + "Ideas" => "Ideas", + "IllustStudio" => "Illust Studio", + "Illustrator" => "Illustrator", + "IllustratorDraw" => "Illustrator Draw", + "InDesign" => "InDesign", + "Inochi2D" => "Inochi2D", + "InVision" => "InVision", + "InVisionCraft" => "InVision Craft", + "InfinitePainter" => "Infinite Painter", + "Inkscape" => "Inkscape", + "Inspirit" => "Inspirit", + "InstaLOD" => "InstaLOD", + "InstaMAT" => "InstaMAT", + "InstantLightRealtimePBR" => "Instant Light Realtime PBR", + "InstantMeshes" => "Instant Meshes", + "InstantTerra" => "Instant Terra", + "Inventor" => "Inventor", + "Iray" => "Iray", + "JWildfire" => "JWildfire", + "Java" => "Java", + "Jira" => "Jira", + "JumpPaint" => "Jump Paint by MediBang", + "JSPaint" => "JS Paint", + "Katana" => "Katana", + "Keyshot" => "Keyshot", + "KidPix" => "Kid Pix", + "KitBash3D" => "KitBash3D", + "Knald" => "Knald", + "Kodon" => "Kodon", + "KolourPaint" => "KolourPaint", + "Krakatoa" => "Krakatoa", + "KRESKA" => "KRESKA", + "Krita" => "Krita", + "LensStudio" => "Lens Studio", + "LibreSprite" => "LibreSprite", + "LightWave3D" => "LightWave 3D", + "Lightroom" => "Lightroom", + "Linearity" => "Linearity", + "LiquiGen" => "LiquiGen", + "Live2DCubism" => "Live2D Cubism", + "LookatmyHair" => "Look at my Hair", + "Lotpixel" => "Lotpixel", + "Lumion" => "Lumion", + "LuxRender" => "LuxRender", + "MacPaint" => "MacPaint", + "MagicaCSG" => "MagicaCSG", + "MagicaVoxel" => "MagicaVoxel", + "Magma" => "Magma", + "MakeHuman" => "MakeHuman", + "Malmal" => "Malmal", + "Mandelbulb3D" => "Mandelbulb 3D", + "Mandelbulber" => "Mandelbulber", + "MangaStudio" => "Manga Studio", + "Mari" => "Mari", + "MarmosetToolbag" => "Marmoset Toolbag", + "MarvelousDesigner" => "Marvelous Designer", + "MasterpieceStudioPro" => "Masterpiece Studio Pro", + "MasterpieceVR" => "MasterpieceVR", + "Maverick" => "Maverick", + "MaxwellRender" => "Maxwell Render", + "Maya" => "Maya", + "MediBangPaint" => "MediBang Paint", + "MediumbyAdobe" => "Medium by Adobe", + "Megascans" => "Megascans", + "mentalray" => "mental ray", + "MeshLab" => "MeshLab", + "Meshroom" => "Meshroom", + "MetaHumanCreator" => "MetaHuman Creator", + "Metashape" => "Metashape", + "MightyBake" => "MightyBake", + "MikuMikuDance" => "MikuMikuDance", + "Minecraft" => "Minecraft", + "Mischief" => "Mischief", + "Mixamo" => "Mixamo", + "Mixer" => "Mixer", + "MoI3D" => "MoI3D", + "Mocha" => "Mocha", + "Modo" => "Modo", + "Moho" => "Moho", + "MotionBuilder" => "MotionBuilder", + "Mudbox" => "Mudbox", + "Muse" => "Muse", + "MSPaint" => "MS Paint", + "MyPaint" => "MyPaint", + "NDO" => "NDO", + "NX" => "NX", + "NdotCAD" => "NdotCAD", + "NintendoNotes" => "Nintendo Notes", + "NomadSculpt" => "Nomad Sculpt", + "Notability" => "Notability", + "Nuke" => "Nuke", + "Nvil" => "Nvil", + "OctaneRender" => "Octane Render", + "Omniverse" => "Omniverse", + "OmniverseCreate" => "Omniverse Create", + "ON1PhotoRAW" => "ON1 Photo RAW", + "Open3DEngine" => "Open 3D Engine", + "OpenCanvas" => "OpenCanvas", + "OpenGL" => "OpenGL", + "OpenToonz" => "OpenToonz", + "Ornatrix" => "Ornatrix", + "OsciRender" => "Osci-Render", + "OurPaint" => "Our Paint", + "PBRMAX" => "PBRMAX", + "PFTrack" => "PFTrack", + "PTGui" => "PTGui", + "Paintbrush" => "Paintbrush", + "PaintNET" => "Paint.NET", + "PaintShopPro" => "PaintShop Pro", + "PaintToolSAI" => "Paint Tool SAI", + "PaintstormStudio" => "Paintstorm Studio", + "Paper" => "Paper", + "Pencil2D" => "Pencil2D", + "Penpot" => "Penpot", + "PhoenixFD" => "Phoenix FD", + "Phonto" => "Phonto", + "PhotoLab2" => "PhotoLab 2", + "Photopea" => "Photopea", + "Photoscan" => "Photoscan", + "Photoshop" => "Photoshop", + "PhotoshopElements" => "Photoshop Elements", + "PicoCAD" => "picoCAD", + "PicoCAD2" => "picoCAD 2", + "Pinta" => "Pinta", + "Piskel" => "Piskel", + "Pixilart" => "Pixilart", + "Pixelitor" => "Pixelitor", + "Pixelmator" => "Pixelmator", + "Pixelorama" => "Pixelorama", + "PixivSketch" => "pixiv Sketch", + "Pixquare" => "Pixquare", + "PlantCatalog" => "PlantCatalog", + "PlantFactory" => "PlantFactory", + "Plasticity" => "Plasticity", + "PNGtuberPlus" => "PNGtuber Plus", + "Poliigon" => "Poliigon", + "Polybrush" => "Polybrush", + "PopcornFx" => "PopcornFx", + "Poser" => "Poser", + "Premiere" => "Premiere", + "PremiereElements" => "Premiere Elements", + "PresagisCreator" => "Presagis Creator", + "ProTools" => "Pro Tools", + "Procreate" => "Procreate", + "ProcreateDreams" => "Procreate Dreams", + "Producer" => "Producer", + "PrometheanAI" => "Promethean AI", + "PureRef" => "PureRef", + "Python" => "Python", + "PyxelEdit" => "PyxelEdit", + "QuadRemesher" => "Quad Remesher", + "QuarkXPress" => "QuarkXPress", + "Qubicle" => "Qubicle", + "Quill" => "Quill", + "QuixelBridge" => "Quixel Bridge", + "QuixelMegascans" => "Quixel Megascans", + "QuixelMixer" => "Quixel Mixer", + "QuixelSuite" => "Quixel Suite", + "R3DSWrap" => "R3DS Wrap", + "R3DSZWRAP" => "R3DS ZWRAP", + "RDTextures" => "RD-Textures", + "RailClone" => "RailClone", + "RealFlow" => "RealFlow", + "RealisticPaintStudio" => "Realistic Paint Studio", + "RealityCapture" => "RealityCapture", + "RealityScan" => "RealityScan", + "RealtimeBoard" => "Realtime Board", + "Rebelle" => "Rebelle", + "Redshift" => "Redshift", + "RenderMan" => "RenderMan", + "RenderNetwork" => "Render Network", + "Revit" => "Revit", + "Rhino" => "Rhino", + "Rhinoceros" => "Rhinoceros", + "RizomUV" => "RizomUV", + "RoughAnimator" => "Rough Animator", + "SamsungNotes" => "Samsung Notes", + "SamsungPENUP" => "Samsung PENUP", + "ScansLibrary" => "ScansLibrary", + "Scrivener" => "Scrivener", + "Sculpt+" => "Sculpt+", + "Sculptris" => "Sculptris", + "ShaveandaHaircut" => "Shave and a Haircut", + "ShiVa3D" => "ShiVa3D", + "Shotgun" => "Shotgun", + "Silo" => "Silo", + "Silugen" => "Silugen", + "Sketch" => "Sketch", + "SketchApp" => "Sketch App", + "SketchBookPro" => "SketchBook Pro", + "SketchClub" => "SketchClub", + "SketchUp" => "SketchUp", + "Sketchable" => "Sketchable", + "Sketchfab" => "Sketchfab", + "Skyshop" => "Skyshop", + "Snapseed" => "Snapseed", + "Snowdrop" => "Snowdrop", + "Softimage" => "Softimage", + "SolidWorks" => "SolidWorks", + "SonySketch" => "Sony Sketch", + "Soundbooth" => "Soundbooth", + "Source2" => "Source 2", + "SourceControl" => "Source Control", + "SourceFilmmaker" => "Source Filmmaker", + "SpeedTree" => "SpeedTree", + "Speedgrade" => "Speedgrade", + "SpeedyPainter" => "SpeedyPainter", + "Spine2D" => "Spine 2D", + "Spriter" => "Spriter", + "Stingray" => "Stingray", + "Storyboarder" => "Storyboarder", + "StoryboardPro" => "Storyboard Pro", + "SublimeText" => "Sublime Text", + "Substance3DDesigner" => "Substance 3D Designer", + "Substance3DModeler" => "Substance 3D Modeler", + "Substance3DPainter" => "Substance 3D Painter", + "Substance3DSampler" => "Substance 3D Sampler", + "Substance3DStager" => "Substance 3D Stager", + "SubstanceB2M" => "Substance B2M", + "SweetHome3D" => "Sweet Home 3D", + "SynthEyes" => "SynthEyes", + "TTools" => "TTools", + "TVPaint" => "TVPaint", + "TVPaintAnimation" => "TVPaint Animation", + "TayasuiSketches" => "Tayasui Sketches", + "TayasuiSketchesMobileApp" => "Tayasui Sketches Mobile App", + "TayasuiSketchesPro" => "Tayasui Sketches Pro", + "Terragen" => "Terragen", + "Texturescom" => "Textures.com", + "Texturingxyz" => "Texturingxyz", + "TeyaConceptor" => "Teya Conceptor", + "TheGrove3D" => "The Grove 3D", + "TheaRender" => "Thea Render", + "Threejs" => "Three.js", + "Tiled" => "Tiled", + "TiltBrush" => "Tilt Brush", + "Tooll3" => "Tooll3", + "ToonBoomHarmony" => "Toon Boom Harmony", + "ToonBoomStudio" => "Toon Boom Studio", + "ToonSquid" => "ToonSquid", + "TopoGun" => "TopoGun", + "TuxPaint" => "Tux Paint", + "Tvori" => "Tvori", + "Twinmotion" => "Twinmotion", + "UNIGINEEngine" => "UNIGINE Engine", + "UVLayout" => "UVLayout", + "UltraFractal" => "Ultra Fractal", + "uMake" => "uMake", + "Unfold3D" => "Unfold 3D", + "Unity" => "Unity", + "UnrealEngine" => "Unreal Engine", + "Vengi" => "vengi", + "VRay" => "V-Ray", + "VRED" => "VRED", + "VTubeStudio" => "VTube Studio", + "Vectary" => "Vectary", + "VectorayGen" => "VectorayGen", + "Vectorworks" => "Vectorworks", + "VegasPro" => "Vegas Pro", + "VisualDesigner3D" => "Visual Designer 3D", + "VisualStudio" => "Visual Studio", + "VRoidStudio" => "VRoid Studio", + "Vue" => "Vue", + "Vuforia" => "Vuforia", + "WebGL" => "WebGL", + "WhiteboardFox" => "Whiteboard Fox", + "WickEditor" => "Wick Editor", + "Wings3D" => "Wings 3D", + "Word" => "Word", + "WorldCreator" => "World Creator", + "WorldMachine" => "World Machine", + "XParticles" => "X-Particles", + "Xfrog" => "Xfrog", + "Xgen" => "Xgen", + "xNormal" => "xNormal", + "xTex" => "xTex", + "XoliulShader" => "Xoliul Shader", + "Yafaray" => "Yafaray", + "Yeti" => "Yeti", + "ZBrush" => "ZBrush", + "ZBrushCore" => "ZBrushCore", + "ZenBrush" => "Zen Brush" + ] + ] + ]; + } + + private function get($proxy, $url, $get = [], $search){ + + $curlproc = curl_init(); + + if($get !== []){ + $get = http_build_query($get); + $url .= "?" . $get; + } + + curl_setopt($curlproc, CURLOPT_URL, $url); + + curl_setopt($curlproc, CURLOPT_ENCODING, ""); // default encoding + curl_setopt($curlproc, CURLOPT_HTTPHEADER, + ["User-Agent: " . config::USER_AGENT, + "Accept: application/json, text/plain, */*", + "Accept-Language: en-US,en;q=0.5", + "Accept-Encoding: gzip, deflate, br, zstd", + //"sentry-trace: 72b0318a7141fe18cbacbd905572eddf-a60de161b66b1e6f-1 + //"baggage: sentry-environment=vercel-production,sentry-release=251ff5179b4de94974f36d9b8659a487bbb8a819,sentry-public_key=2b87af2b44c84643a011838ad097735f,sentry-trace_id=72b0318a7141fe18cbacbd905572eddf,sentry-transaction=GET%20%2Fsearch,sentry-sampled=true,sentry-sample_rand=0.09967130764937493,sentry-sample_rate=0.5", + "DNT: 1", + "Sec-GPC: 1", + "Connection: keep-alive", + //"Referer: https://cara.app/search?q=jak+and+daxter&type=&sortBy=Top&filters=%7B%7D", + "Referer: https://cara.app/search?q=" . urlencode($search), + //"Cookie: __Host-next-auth.csrf-token=b752c4296375bccb7b480ff010e1e916c65c35c311a4a57ac6cd871468730578%7C4d3783cfb72a98f390e534abd149806432b6cf8d50555a52d00e99216a516911; __Secure-next-auth.callback-url=https%3A%2F%2Fcara.app; crumb=BV0HDt87G5+fOWE0ZDQ5MWM0ZTQ3YTZmMzM4MGU5MGNjNDNmMzY2", + "Sec-Fetch-Dest: empty", + "Sec-Fetch-Mode: cors", + "Sec-Fetch-Site: same-origin", + "TE: trailers"] + ); + + curl_setopt($curlproc, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curlproc, CURLOPT_SSL_VERIFYHOST, 2); + curl_setopt($curlproc, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($curlproc, CURLOPT_CONNECTTIMEOUT, 30); + curl_setopt($curlproc, CURLOPT_TIMEOUT, 30); + + $this->backend->assign_proxy($curlproc, $proxy); + + $data = curl_exec($curlproc); + + if(curl_errno($curlproc)){ + + throw new Exception(curl_error($curlproc)); + } + + curl_close($curlproc); + return $data; + } + + public function image($get){ + + if($get["npt"]){ + + [$npt, $proxy] = + $this->backend->get( + $get["npt"], + "images" + ); + + $npt = json_decode($npt, true); + }else{ + + $search = $get["s"]; + if(strlen($search) === 0){ + + throw new Exception("Search term is empty!"); + } + + $proxy = $this->backend->get_ip(); + + $npt = [ + "q" => $get["s"], + "sortBy" => $get["sort"], + "take" => 24, + "skip" => 0, + "filters" => [] + ]; + + // parse filters + if($get["type"] != "any"){ + + $npt["filters"]["posts"] = [$get["type"]]; + } + + if($get["fields"] != "any"){ + + $npt["filters"]["fields"] = [$get["fields"]]; + } + + if($get["category"] != "any"){ + + $npt["filters"]["categories"] = [$get["category"]]; + } + + if($get["software"] != "any"){ + + $npt["filters"]["softwares"] = [$get["software"]]; + } + + if($npt["filters"] == []){ + + $npt["filters"] = "{}"; + }else{ + + $npt["filters"] = json_encode($npt["filters"]); + } + } + + $out = [ + "status" => "ok", + "npt" => null, + "image" => [] + ]; + + // https://cara.app/api/search/portfolio-posts?q=jak+and+daxter&sortBy=Top&take=24&skip=0&filters=%7B%7D + try{ + $json = + $this->get( + $proxy, + "https://cara.app/api/search/posts", + $npt, + $npt["q"] + ); + + }catch(Exception $error){ + + throw new Exception("Failed to fetch JSON"); + } + + $json = json_decode($json, true); + + if($json === null){ + + throw new Exception("Failed to decode JSON"); + } + + $imagecount = 0; + foreach($json as $image){ + + if(count($image["images"]) === 0){ + + // sometimes the api returns no images for an object + $imagecount++; + continue; + } + + $cover = null; + $sources = []; + + foreach($image["images"] as $source){ + + if($source["isCoverImg"]){ + + $cover = [ + "url" => "https://images.cara.app/" . $this->fix_url($source["src"]), + "width" => 500, + "height" => 500 + ]; + }else{ + + $sources[] = [ + "url" => "https://images.cara.app/" . $this->fix_url($source["src"]), + "width" => null, + "height" => null + ]; + } + } + + if($cover !== null){ + + $sources[] = $cover; + } + + $out["image"][] = [ + "title" => str_replace("\n", " ", $image["content"]), + "source" => $sources, + "url" => "https://cara.app/post/" . $image["id"] + ]; + + $imagecount++; + } + + if($imagecount === 24){ + + $npt["skip"] += 24; + + $out["npt"] = + $this->backend->store( + json_encode($npt), + "images", + $proxy + ); + } + + return $out; + } + + private function fix_url($url){ + + return + str_replace( + [" "], + ["%20"], + $url + ); + } +} diff --git a/settings.php b/settings.php index dc3e818..75bc373 100644 --- a/settings.php +++ b/settings.php @@ -235,6 +235,10 @@ $settings = [ "value" => "pinterest", "text" => "Pinterest" ], + [ + "value" => "cara", + "text" => "Cara" + ], [ "value" => "flickr", "text" => "Flickr"