Giter VIP home page Giter VIP logo

luvnft / podsearch Goto Github PK

View Code? Open in Web Editor NEW
0.0 0.0 0.0 72.35 MB

Search-engine for podcast-transcriptions with accompanying youtube videos, synced and aligned. Nuxt3-frontend, Express/Prisma/pm2/MySQL-backend. Uses WhispherX, wav2vec, feedparser, ffmpeg, meilisearch, github actions, bash-scripts with SSH for CICD and tailwindcss with tailwind-bootstrap-grid.

Home Page: https://podsearch.vercel.app

JavaScript 38.17% Python 0.69% TypeScript 10.79% CSS 39.41% HTML 0.12% Vue 10.82%

podsearch's Introduction


Poddley

"Shazam" for Podcasts


Link: poddley.com


🎙️ About Poddley

Poddley is the "Shazam for podcasts," an innovative service designed to be a comprehensive search engine for podcast transcriptions. It provides a nexus between various podcast resources, including YouTube, Apple Podcasts, transcripts, time-stamped quotes, RSS feeds, homepages, and episode links. More than just a search tool, Poddley is a discovery platform, empowering users to unearth and enjoy a vast array of podcast content based on the spoken word.

🔍 Main Features

  • 📜 Transcription Search: Instantly find podcasts through searchable transcriptions.
  • 🔗 Resource Mapping: Seamless integration with platforms like YouTube and Apple Podcasts.
  • 🕓 Time-Location Quotes: Locate the exact moment a phrase was spoken in a podcast episode.
  • 🌐 Discovery Platform: Explore new podcasts with ease, tailored to your interests.

💡 Vision

The vision for Poddley is to transform how people discover and interact with podcast content. By bridging the gap between various podcasting platforms and enriching the search experience, Poddley aspires to be the go-to resource for podcast enthusiasts and casual listeners alike.


Project

Link to Poddley

Project duration (ca.)

24.11.2022 - 23.10.2023

Status build

CI/CD Pipeline

Design iterations

Realizations

  • Hydration mismatch when using cloudflare as proxy is due to cloudflares automatic html, css and js minifcation plus dns proxy. Disabling it causes hydration blinking to disappear. Als
  • Don't optimize too early
  • Too much caching is bad
  • Debouncing API should be (human reaction time in ms - API latency).
  • No amount of time optimizing backend will save you from long TTFB (Time To First Byte). After spending a week optimizing backend, testing out Vercel and Netlify (Pro and Free tier) trying to get speed-index below 2 seconds. Finally decided to try Cloudflare, went straight to 1.2 seconds.
  • Unused CSS and third-party script/services can be tricky to deal with.
  • Lazy-loading is nice.
  • Assets compression:
    • Decided to use Brotli Compression to improve transfer time. Since Brotli was designed to compress streams on the fly, it is faster at both compressing content on the server and decompressing it in the browser than in gzip. In some cases the overall front-end decompression is up to 64% faster than gzip. Source
    • Only using webp on website due to faster loading speed and better compression during transfer Source

Frontend:

  • Nuxt 3 for client-stuff:
    • SSR enabled
    • Server-structure (as website can't be generated statically due to dynamic route-params)
    • Nitro-server with gzip- and brotli-compression and minified assets
  • JSON to TypeScript type for types generation based on API response
  • TypeScript.
  • Cloudflare as the DNS-manager for easier setup and automatic image resizing.
  • Tracking: Plausible Switched to Cloudflare as it was free
  • ServiceWorker for offloading the main-thread from the frequest API-calls to the backend-API. There are multiple ways to solve this. Throttling + Debouncing on user-input (during instantSearch) is a possibility, but it often causes laggy ui and mucky logic. Offloading it all to a ServiceWorker showed much better results in spite of it being tricky to implement.
  • Nuxt 3 modules used:
    • TailwindCSS module (integrated PurgeCSS and fast design development)
    • NuxtImage module
    • HeadlessUI module
    • SVG-sprite-module (for reducing SVG-requests to server)
    • Nuxt Delayed Hydration module (for improved Lighthouse score and loading time)
    • Lodash module (for _Debounce-function)
    • Device module (for iPhone-device detection)
    • Pinia Nuxt Module (for global storage across components)
    • Nightwind Tailwind plugin (for deep automaticaally generated tailwind classes for nightmode)
    • Nuxt Image Cloudflare (passes correct image width and height to cloudflare image url causes cloudflare to automatically resize and compress image to be the smallest payload)'
    • Floating UI + Nuxt3 Headless UI to have automatic flipping of UI when outside of viewport
    • Nuxt3 Google Fonts module for async fetching of google fonts (probably GDPR breach, but...)

Backend:

Services:

The services are running primarily as pm2-processes. With daemon-autorestart on server-shutdown, which are:

  • Express-API: API that queries the meilisearch instance.
  • Route-Controller-Service architecture for ExpressJS/Node-backends. Architecture
  • Indexer (runs every 30min): Updates meilisearch indexes based on db-data
  • RSS-updater (runs very 30min): Updates db (upsert) based on changes in rss-feeds
  • Transcriber/YoutubeGetter (runs continuously) (can be run concurrently due to db-row locking)
  • Meilisearch-instance (native rust): Does the full-text search functionality

Architecture:

Server 1: Very low-end DigitalOcean droplet with 2vCPUs and 4Gigs of RAM run the database consistently. I need the db to be constantly available due to the transcriber and indexer fetching to and from it. Server 2: Higher end 8vCPUs and 16Gigs of RAM running the Express API, Meilisearch search engine, the indexer and the RSS-updater Local PC: Runs the Transcriber on an ASUS GeForce RTX 3060 DUAL OC as it's much cheaper than to rent any kind of Server

Overall Architecture

Location Specifications Responsibilities
Server 1 Very low-end DigitalOcean droplet with 2vCPUs and 4Gigs of RAM Runs the database consistently (needed for transcriber and indexer as I can't have it shut down sporadically for whatever reason)
Server 2 Higher end 8vCPUs and 16Gigs of RAM Running the Express API, Nuxt3-client code (planning to at least) Meilisearch search engine, the indexer, and the RSS-updater
Local PC ASUS GeForce RTX 3060 DUAL OC Runs the Transcriber
Pm2Setup Pm2Diagram
Meilisearch pm2 config

A meilisearch instance running with the following settings (all indexes use the default settings), besides what's specified in the backend scripts.

Meilisearch pm2 config
	module.exports = {
	  apps: [
	    {
	      name: "meilisearch",
	      script: `./meilisearch --no-analytics`,
	      env: {
	        MEILI_HTTP_ADDR: "0.0.0.0:7700",
	        MEILI_MASTER_KEY: "some key here",
	      },
	    },
	  ],
	};
Indexes
All Meilisearch Indexes
	{
	    "results": [
	        {
	            "uid": "episodes",
	            "createdAt": "2023-07-16T09:34:08.17973422Z",
	            "updatedAt": "2023-09-23T11:11:03.374123595Z",
	            "primaryKey": "id"
	        },
	        {
	            "uid": "podcasts",
	            "createdAt": "2023-07-16T09:34:08.151876845Z",
	            "updatedAt": "2023-09-23T11:39:47.029653816Z",
	            "primaryKey": "id"
	        },
	        {
	            "uid": "segments",
	            "createdAt": "2023-07-16T09:34:08.099810144Z",
	            "updatedAt": "2023-10-01T15:16:28.788349424Z",
	            "primaryKey": "id"
	        },
	        {
	            "uid": "transcriptions",
	            "createdAt": "2023-07-16T09:34:08.05460293Z",
	            "updatedAt": "2023-09-23T11:08:48.119600807Z",
	            "primaryKey": "id"
	        }
	    ],
	    "offset": 0,
	    "limit": 20,
	    "total": 4
	}
Podcasts:
Podcasts Index Settings
	{
	    "displayedAttributes": [
	        "*"
	    ],
	    "searchableAttributes": [
	        "*"
	    ],
	    "filterableAttributes": [
	        "podcastGuid"
	    ],
	    "sortableAttributes": [],
	    "rankingRules": [
	        "words",
	        "typo",
	        "proximity",
	        "attribute",
	        "sort",
	        "exactness"
	    ],
	    "stopWords": [],
	    "synonyms": {},
	    "distinctAttribute": null,
	    "typoTolerance": {
	        "enabled": true,
	        "minWordSizeForTypos": {
	            "oneTypo": 5,
	            "twoTypos": 9
	        },
	        "disableOnWords": [],
	        "disableOnAttributes": []
	    },
	    "faceting": {
	        "maxValuesPerFacet": 100,
	        "sortFacetValuesBy": {
	            "*": "alpha"
	        }
	    },
	    "pagination": {
	        "maxTotalHits": 1000
	    }
	}
Episodes:
Episodes Index Settings
	{
	    "displayedAttributes": [
	        "*"
	    ],
	    "searchableAttributes": [
	        "*"
	    ],
	    "filterableAttributes": [
	        "episodeGuid"
	    ],
	    "sortableAttributes": [
	        "addedDate"
	    ],
	    "rankingRules": [
	        "words",
	        "typo",
	        "proximity",
	        "attribute",
	        "sort",
	        "exactness"
	    ],
	    "stopWords": [],
	    "synonyms": {},
	    "distinctAttribute": null,
	    "typoTolerance": {
	        "enabled": true,
	        "minWordSizeForTypos": {
	            "oneTypo": 5,
	            "twoTypos": 9
	        },
	        "disableOnWords": [],
	        "disableOnAttributes": []
	    },
	    "faceting": {
	        "maxValuesPerFacet": 100,
	        "sortFacetValuesBy": {
	            "*": "alpha"
	        }
	    },
	    "pagination": {
	        "maxTotalHits": 1000
	    }
	}
Transcriptions:
Transcriptions Index Settings
	{
	    "displayedAttributes": [
	        "*"
	    ],
	    "searchableAttributes": [
	        "transcription"
	    ],
	    "filterableAttributes": [],
	    "sortableAttributes": [],
	    "rankingRules": [
	        "exactness",
	        "proximity",
	        "typo",
	        "words"
	    ],
	    "stopWords": [],
	    "synonyms": {},
	    "distinctAttribute": null,
	    "typoTolerance": {
	        "enabled": true,
	        "minWordSizeForTypos": {
	            "oneTypo": 5,
	            "twoTypos": 9
	        },
	        "disableOnWords": [],
	        "disableOnAttributes": []
	    },
	    "faceting": {
	        "maxValuesPerFacet": 100,
	        "sortFacetValuesBy": {
	            "*": "alpha"
	        }
	    },
	    "pagination": {
	        "maxTotalHits": 1000
	    }
	}
Segments:
Segments Index Settings
	{
	    "displayedAttributes": [
	        "*"
	    ],
	    "searchableAttributes": [
	        "text"
	    ],
	    "filterableAttributes": [
	        "belongsToEpisodeGuid",
	        "belongsToPodcastGuid",
	        "belongsToTranscriptGuid",
	        "end",
	        "id",
	        "start"
	    ],
	    "sortableAttributes": [
	        "start"
	    ],
	    "rankingRules": [
	        "exactness",
	        "sort",
	        "proximity",
	        "typo",
	        "words"
	    ],
	    "stopWords": [],
	    "synonyms": {},
	    "distinctAttribute": null,
	    "typoTolerance": {
	        "enabled": true,
	        "minWordSizeForTypos": {
	            "oneTypo": 5,
	            "twoTypos": 9
	        },
	        "disableOnWords": [],
	        "disableOnAttributes": []
	    },
	    "faceting": {
	        "maxValuesPerFacet": 200,
	        "sortFacetValuesBy": {
	            "*": "alpha"
	        }
	    },
	    "pagination": {
	        "maxTotalHits": 5000
	    }
	}

Transcriber/Re-alignment-service

  • The transcriber is a python script that grabs a selection of podcast names from a json.
  • Queries a SQLite database downloaded daily from PodcastIndex.com
  • Uses feedparser to get episode-names, audiofiles, titles etc. from the rss-feeds for further parsing
  • Uses WhispherX to transcribe and align the segments. This implementation is better than the original Whisper due to it using faster-whisper under the hood which supports batching among other performance-improvements.
  • Then uses WhisperX to re-align the timestamps in accordance with the audio file (using the large wav2vec model.
  • Then finds the youtube video that fits to that audio file and updates the episode in the database.

Nginx settings:

NginxSetup NginxDiagram
Nginx Settings

For meilisearch.poddley.com

	server {
	    listen 80;
	    server_name meilisearch.poddley.com;
	
	    # Add this line to increase max upload size
	    client_max_body_size 30M;
	
	    location / {
		proxy_pass http://localhost:7700;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection 'upgrade';
		proxy_set_header Host $host;
		proxy_cache_bypass $http_upgrade;
	    }
	
	    listen 443 ssl;
	    ssl_certificate /etc/letsencrypt/live/meilisearch.poddley.com/fullchain.pem;
	    ssl_certificate_key /etc/letsencrypt/live/meilisearch.poddley.com/privkey.pem;
	    include /etc/letsencrypt/options-ssl-nginx.conf;
	    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
	}
	
	server {
	    listen 80;
	    server_name poddley.com;
	
	    location / {
		proxy_pass http://localhost:3001;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection 'upgrade';
		proxy_set_header Host $host;
		proxy_cache_bypass $http_upgrade;
	    }
	
	    listen 443 ssl; # managed by Certbot
	    ssl_certificate /etc/letsencrypt/live/poddley.com/fullchain.pem; # managed by Certbot
	    ssl_certificate_key /etc/letsencrypt/live/poddley.com/privkey.pem; # managed by Certbot
	    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
	    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
	}
	
	server {
	    listen 80;
	    server_name api.poddley.com;
	
	    # Add this line to increase max upload size
	    client_max_body_size 30M;
	
	    location / {
		proxy_pass http://localhost:3000;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection 'upgrade';
		proxy_set_header Host $host;
		proxy_cache_bypass $http_upgrade;
	    }
	
	    listen 443 ssl;
	    ssl_certificate /etc/letsencrypt/live/api.poddley.com/fullchain.pem;
	    ssl_certificate_key /etc/letsencrypt/live/api.poddley.com/privkey.pem;
	    include /etc/letsencrypt/options-ssl-nginx.conf;
	    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
	}

Other

  • HTTPS everywhere done with let's encrypt. Free https certificates

AI services

  • All AI services run 24/7 on a ASUS GeForce RTX 3060 Dual OC V2
  • I used to run and do tests on runpod.io due to their cheap prices, but realized quickly that long term use would quickly become expensive. Paperspace was even more expensive. Deepgram was ridiculous expensive.
  • The AI models were initially running on my local computer running an RTX 1650, but it was crashing frequently and had insufficient GPU memory (would terminate sporadically). I also tried running an RTX3060 using ADT-Link connected to my Legion 5 AMD Lenovo gaming laption through the M.2 NVME as an eGPU. That was deeply unsuccessful due to frequent crashes. All solutions were unsatisfactory so splurged for a workstation in the end.

Stuff to do:

TODO
  • Convert play-button too say Play podcast
  • Convert the insertionToDb on the TranscriptionService to javascript to take use of the $transaction functionality only available in the javascript client unlike ethe python-prisma-client port and enable multiple gpus to process transcriptions at the same time.
  • Joe Rogan Recorder(illegal)
  • Download all Podcast audio-files to own server to support long-term support (probably illegal)
  • Use Spotify audioplayer for the spotify podcasts (pointless)
  • Create spotify recorder (it's illegal)
  • Use Spotify audioplayer for the spotify podcasts (pointless)
  • Create spotify recorder (it's illegal)
  • Try Workes on Cloudflare just in case, with the nitro template (using cloudflare images and pages)
  • We need 3 tabs that show at the top like the buttons: - [ ] New episodes - [ ] Trending episodes - [ ] Info
  • Add embedded YouTube to episode-area??? Mulig i det hele tatt, skal den være også tidsbasert?
  • Add info component (part of three tabs task)
  • Add top 3 most searched podcasts (part of tabs)
  • Switch to use the puppeteer script as time ensues (meaningless)
  • Record knappen skal være der doneringsknappen er nå
  • Implement https://github.com/GoogleChromeLabs/quicklink and Instant.page
  • Set up CI/CD pipeline for backend (here: https://medium.com/@fredrik.burmester/nuxt-3-website-with-cloudflare-workers-and-github-actions-336411530aa1)
  • Lag desktop moden
  • Lag iPhone moden
  • Lag Android moden
  • Add faceting for episode and podcast (route for episode og podcast)
  • Make the types shared between backend and client
  • Add audio noise denoising on backend to clean up safari audio recordings as they are very muddy due to Safari being restrictive (Was implemented primarily to address the issues associated with Safari and it's horrible audio-recording issues, but it didn't really solve much. The audio was denoised and clean, but the muffled speech was unavoidable. This was the main reason to create an app).
  • Disable animation button (nah)
  • Skal være mulig å paste en link til youtube/tiktok/ehatever side og få svarer på hvilken episode det kommer fra
  • Add word, by, word, highlighting during playback. and ..The animate.css text shall be only one liners so it needs to be split but for this to work we need to get the word-token-times, which isn't yet implemented
  • Download all podcats (should be)...
  • Move navbar to bottom (bad idea, so no)
  • Brul en annen audio player kanskje som er bedre til å ferche metadata???
  • Add the firefox colors as the nuxt progress bar bar color and find out why loding indicator doesnt work (This is meaningless as the NuxtLoadingIndicator is only present on SPAs not SSR apps.
  • Fix so the home button doesn't wait for the api response but rather has same behaviour as NavLogo
  • Legg til navbar i toppen hvor det står hvor mange podcaster episoder er transcriba+ current listerens
  • Increase zoom further to 25% or 10%?? (not necessary, enough screen hagging)
  • Binary tree subs cache object needs to be available (unnecessary)
  • Add dark mode icon to the button
  • Logo color?
  • Add share buttons to moreLink
  • Sett default til å alltid være darkMode (Nah use system)
  • Flytt subsene inn i den modda spilleren (no subs)
  • Grab transcriptionsne til anthony for lex for å spare tid (no, he doesnt have the necessary info
  • Legg til sjekk som blokker flere audioplayere fra å spille samtidig + make the audioPlayer not visible until someone starts playing
  • Bytt audioPlayer til howler.js til designet som er ønsket
  • When someone clicks on the button, it should set the global playing value to true and it should set the link of the audioLink that is being played. If the audioPlayer has that enclosure it should continue playing, if not it shant. The audioPlayer should also show up if the it has a chosen audio-file. If not, it shant be shown.
  • Dockerize entire product on 1 server container (cloudflare workers, it's cheaper than digitalocean, CICD also. This means (client + api/backend + indexer). The transcriber is on my own setup. Not possible due to Cloudflare not supporting custom dbs or express backend
  • Covert search to multiseach to speed up search time
  • Enable teksting on all iframes (Youtube api doesn't support/allow this.
  • Create ElasticSearch full text search engine, switch to it from MeiliSearch
  • When you click on a section of the text it should start playing.
  • Make dropdown lighter in color on darkMode
  • Fine-tune the search functionality based on phrase-searching and typo-tolerance
  • Fix the indexing bug that causes the entire database to be re-indexed each time
  • Add loading spinner only for firefox/chrome-based audioPlayers
  • Switch from Whisper OpenAI to https://github.com/guillaumekln/faster-whisper 4x increase in speed 🤩🤩🤩 and that is with the fucking Large-v2 model omg fuck
  • Switch to this alignment model: jonatasgrosman/wav2vec2-large-xlsr-53-english
  • Stick to MeiliSearch, but use the new MatchingStrategy functionality and see if you can adapt the phrase searching to accomodate your needs
  • Use meilisearch as a rough-searching and then use n-gram(3) with jaccard-string-similarity to do the fine-tuned search
  • Fix 3x instance return on API
  • Add second-hand jaccard highlighting
  • Downscale the pictures retrieved and store them on local
  • Adjust python transcription script for optimistic concurrency
  • Reindex everything prior to 16. april.
  • Indexer alt inn i meilisearch igjen.
  • Sjekk om gratis vercel er bedre enn gratis netlify
  • Fix segment-area design
  • Legg til nginx infoen, arkitekturen osv.
  • Add bg to selected jutton and route to the buttons
  • Fikse loading spinner bug
  • Remove bold tab bar
  • Add loading spinner to the audio player as in v-if
  • Legg til loading for audio while loading
  • Legg til segment id
  • Fix navbar
  • Detach logic of searching from navbar
  • Fix unique segment issue by modifying triplet
  • Refactor the returning logic backend
  • Indexer restne av databasen
  • Legg til loading indinator når api callet kjører
  • Gjør search ikonet til en x når den er nede
  • Turn dedigated cpu to api server
  • Use lowest db cpu
  • Possible idea: nuxt generate all static files => serve on bunnyCDN all as static => create CI/CD pipeline to bunnyCDN, kinda want to avoid cloudflare tbh
  • Write me an about page contact page and donate page
  • Disable plausible, netlify, vercel and images.poddley.com. Cloudflare literally does all that for free..
  • Login/Sign-up functionality.
  • Setup up multisearch for the search-service on the backend. Should give some slight performance benefits
  • Don't have debouncing on client side, but do have throttling + cancellable promises
  • Add helmet and add rate-limiting
  • Light refactoring of backend and frontend to support SeachQuery and filter/sort parameteres + refactor ServiceWorker + change all APIs to POST requests.
  • Find out why worker is slow on new backend. Json parsing? Filter setting on the meilisearch api?
  • Fix the buttons
  • Segments have to move
  • Add segment search functionality route so it can be shared.
  • Search button index redirect
  • Time location needs to update if livesubs are enabled.
  • Livesubs button is needed
  • Drop usage of hq720
  • Start delayed hydratipn again
  • Fix donation page
  • Fix nav buttons
  • Fix the layout shitfs on the image downloading time…
  • Add esc listener to non-headless ui stuff
  • Use vueUse instead of vlickoutside
  • Øk margin på search oxen og marginBottom
  • Set logo to be nuxtlink not href
  • Skal kun blinke hvis man starter play
  • Audio to text transformation search
  • Add dark mode... toggle button + functionality.
  • Fix device issue
  • Fix home button not reflecting same behaviour as home button
  • Added animate to the text changing section
  • Fjern overflødig respons fra API-et
  • Fullfør respons
  • Improve dark mode colors
  • Fiks svart bakgrunn
  • Fjern overflødig møkkatekst fra responsen
  • Fjern profile of push mikroen dit
  • Fix extreme build time due to tailwind
  • Fix SSR dark mode not being preloaded => (found a hack, contribute to the repo?)
  • Convert entire Nuxt3 app to an iOS/Android app using capacitor https://dev.to/daiquiri_team/how-to-create-android-and-ios-apps-from-the-nuxtjs-application-using-capacitorjs-134h (was possible to implement)
  • Fix the favicons to look good, and to support darkmode
  • Remove useDevice as we have no use for it on the web-version
  • Se over about og contact siden
  • Make emails
  • Fix darkMode doubleClick bug
  • Fix issue with description meta-tag on poddley
  • Add "x"-cleanSearchString functionality like google
  • Subtitles toast enabled/disabled
  • Fix spinner wiggle bug
  • Youtube DarkMode button
  • Align RemoveButtons
  • Remove shade and border on audioPlayer on iPhones
  • Move expand more text all the way to the right even when text is short
  • MoreLinks buttonen har forsvunnet fiks det
  • Fix hover fill on rss icon
  • Add icons to burgerMenu
  • Hr bug about
  • Gray-100 text sb
  • Fix darkmode issue on audioplayer
  • Fix wrong reload thing on navlogo
  • Fix size issue on triple dot menu
  • Expand icon padding
  • Fix toast-issues
  • Returner 3 ascending fra query pick last npt full fjern expand
  • Legg til custom tailwindUI toast-engine/service
  • Refaktorerer transcriberen
  • Fiks desktop searchbar
  • Microphone-functionality on phones will redirect to app to stimulate users + better audio-quality which is needed for the transcriptions.
  • Halve the amount of text returned and the height of the textField component
  • Use the native audio player as far as you can embeeded into each entry if someone clicks on the playing button.
  • Style all of them accordingly, for chrome a certain way, for firefox a certain way and for opera another way.
  • Are the about page and contact page good looking, different font?
  • Start up all pm2-services.
  • Fix height of text-area
  • More padding on the navbar on the mobile phones.
  • Add the "getEntireTranscript"-button.
  • Finskriv githuben
  • Fix the sceollIntoView bug
  • Backend refactor for speed improvemnet
  • Fix padding top on contact and about page
  • Remove all the gunk from the segments and keep the episode and podcast stuff only on the Hit-object but not on the subhits and dont have any values besides the necessary on the subhits. that should reduce the payload substatially.
  • Adapt the api response to be only 5 elements on phone reponse as phones have shit spec
  • Fix the search functionality to use jaccard again
  • Fix sepia color on audioplayer
  • Make MeiliSearch production version.
  • Some podcast-streams might have ads when being played and when being transcribed. Solution to this is...??? Save podcast. Legal???...??? Not save podcast...??? Legal, but lame due to the ads and it fucking with the timestamp so solution is... mini-model on web audio ad killer??? .. How are we going to handle the issue with ads being part of some ppodcast transcription like Logan Paul?? AI to remove them from audio??? Solution is: Download podcast, remove ad from using AI, save audio, stream audio from own R3-bucket. PiHole?? Adsfree VPN? Current AI ad removers for audio suck. Find equivalent on apple podcast and use that instead of audio stream?? ANSWER: Until we develop Audio AI Ads removing model we will just remove them...
  • Can we move backend and client closer together? No.
  • Use <Lazy everywhere Using UseElementVisibily by vueUse + currentPlayingTime as markers for dom mouting
  • Upload sanitized repo stripped of all private-api-keys etc...
  • Start up all the pm2 instances in accorance to the written architecture (further up)
  • Doublecheck no API's have been leaked (gitguardian will probably be used)
  • Upon full load intersectionObserver goes berserker, gotta tweak that a bit I think...
  • Also remove "acast"-source podcast from podcasts.json
  • Integrate CI/CD somehow when everything is on DigitalOcean for client
  • Integrate CI/CD somehow when everything is on DigitalOcean for backend
  • Move Nuxt3 to DigitalOcean from Cloudflare
  • Start up Transcriber on MainPC
  • Refactor the transcriber to support concurrency.
  • Inserter needs to be part of transcriber
  • Make youtube video work with subs and sync too

podsearch's People

Contributors

igormomc avatar lx358hcl avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.