{"id":16986886,"url":"https://github.com/amamenko/auto-mashup","last_synced_at":"2026-04-12T00:43:53.026Z","repository":{"id":99394191,"uuid":"389818245","full_name":"amamenko/auto-mashup","owner":"amamenko","description":"Billboard song mashups automated with Node.js","archived":false,"fork":false,"pushed_at":"2023-08-15T06:32:02.000Z","size":1285,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-01-26T20:12:47.372Z","etag":null,"topics":["aws","aws-lambda","aws-s3","billboard","contentful","dj","ffmpeg","genius","instagram","mashup","mashup-bot","music","spotify","youtube"],"latest_commit_sha":null,"homepage":"https://auto-mashup.vercel.app/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/amamenko.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-07-27T01:52:16.000Z","updated_at":"2024-10-30T17:56:20.000Z","dependencies_parsed_at":"2024-11-28T10:43:13.527Z","dependency_job_id":"ca273dfb-3494-464f-9bea-dca9a13a618d","html_url":"https://github.com/amamenko/auto-mashup","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amamenko%2Fauto-mashup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amamenko%2Fauto-mashup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amamenko%2Fauto-mashup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amamenko%2Fauto-mashup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amamenko","download_url":"https://codeload.github.com/amamenko/auto-mashup/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244894322,"owners_count":20527677,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws","aws-lambda","aws-s3","billboard","contentful","dj","ffmpeg","genius","instagram","mashup","mashup-bot","music","spotify","youtube"],"created_at":"2024-10-14T02:47:15.859Z","updated_at":"2026-04-12T00:43:52.985Z","avatar_url":"https://github.com/amamenko.png","language":"JavaScript","funding_links":["https://www.buymeacoffee.com/automashup"],"categories":[],"sub_categories":[],"readme":"[![MIT License][license-shield]][license-url]\n[![LinkedIn][linkedin-shield]][linkedin-url]\n\n\u003c!-- PROJECT LOGO --\u003e\n\u003cbr /\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/amamenko/auto-mashup#gh-dark-mode-only\"\u003e\n   \u003cimg src=\"https://images.ctfassets.net/r8d0zt89au6z/U08zxXPI7WotVcDYslYBF/1abd688f9038dba10e6aa96f30b84342/automashup_logo_white.svg\" width=\"125\" /\u003e\n  \u003c/a\u003e\n   \u003ca href=\"https://github.com/amamenko/auto-mashup#gh-light-mode-only\"\u003e\n    \u003cimg src=\"https://images.ctfassets.net/r8d0zt89au6z/2O6pZhJ8iQoqojzyNZCTRH/4e0020dda6a224a9460e49094417c9ff/automashup_logo.svg\" width=\"125\" /\u003e\n  \u003c/a\u003e\n   \n  \u003ch3 align=\"center\"\u003eAuto Mashup\u003c/h3\u003e\n\n  \u003cp align=\"center\"\u003e\n    Music Mashups Automated with Node.js\n    \u003cbr /\u003e\n    Featuring Songs from Billboard Charts\n    \u003cbr /\u003e\n    \u003cbr /\u003e\n    \u003ca href=\"https://www.automashup.ml/\"\u003eWebsite\u003c/a\u003e\n    ·\n    \u003ca href=\"https://www.youtube.com/channel/UCbjaDBiyXCqWGT4inY8LCmQ\"\u003eYouTube Channel\u003c/a\u003e\n     ·\n    \u003ca href=\"https://www.buymeacoffee.com/automashup\"\u003eBuy Me a Coffee\u003c/a\u003e\n    ·\n    \u003ca href=\"https://www.instagram.com/automaticmashup/\"\u003eInstagram\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/amamenko/auto-mashup/issues\"\u003eReport Issue\u003c/a\u003e \n  \u003c/p\u003e\n\u003c/p\u003e\n\n## Background\n\nA [mashup](\u003chttps://en.wikipedia.org/wiki/Mashup_(music)\u003e), according to [Merriam-Webster's Dictionary](https://www.merriam-webster.com/dictionary/mash-up), is \"a piece of music created by digitally overlaying\nan instrumental track with a vocal track from a different recording.\" The idea of mashups has been around since the late 1960s - the first such creation, arguably,\nwas found on [Harry Nilsson's](https://en.wikipedia.org/wiki/Harry_Nilsson) 1967 album [Pandemonium Shadow Show](https://en.wikipedia.org/wiki/Pandemonium_Shadow_Show), which features a cover of [The Beatles'](https://en.wikipedia.org/wiki/The_Beatles)\n[\"You Can't Do That\"](https://en.wikipedia.org/wiki/You_Can%27t_Do_That) with his own vocal recreations of more than a dozen other Beatles songs on the same instrumental track.\n\nIdeally, the vocal track of one song is superimposed seamlessly onto the instrumental track of a separate song, [modifying](https://en.wikipedia.org/wiki/Pitch_shift)\nthe musical keys and tempos where necessary to achieve a perfect mix. Often, when selecting songs for a mashup, mashup creators search for songs that have similar\n[musical keys](\u003chttps://en.wikipedia.org/wiki/Key_(music)\u003e), [tempos](https://en.wikipedia.org/wiki/Tempo), and [modes](\u003chttps://en.wikipedia.org/wiki/Mode_(music)\u003e).\nThis not only allows for a better-sounding mix, but increases the audience's ability to recognize distinct elements of both selected songs, while avoiding something like a\n\"chipmunk\"-sounding effect on the audio.\n\nIndeed, due to the fact that there are only so many chords, keys, tempos, song structures, time signatures, and modes, popular songs on the [Billboard](https://www.billboard.com/)\ncharts can, and often do, sound alike. The weekly [Billboard magazine](\u003chttps://en.wikipedia.org/wiki/Billboard_(magazine)\u003e) tracks the most popular trending songs\nacross various genres of music and displays various charts containing music rankings on their [website](\u003c(https://www.billboard.com/)\u003e). Charts include\nthe [Hot 100](https://www.billboard.com/charts/hot-100/) and the [Billboard Global 200](https://www.billboard.com/charts/billboard-global-200/),\nas well as greatest-of-all-time (GOAT) charts such as [GOAT Hot 100 Songs](greatest-hot-100-singles), [GOAT Songs of the '90s](greatest-billboards-top-songs-90s),\nand [GOAT Songs of the Summer](https://www.billboard.com/charts/greatest-of-all-time-songs-of-the-summer/).\n\nIn 2021, American singer-songwriter [Olivia Rodrigo](https://en.wikipedia.org/wiki/Olivia_Rodrigo) added two members of American rock band\n[Paramore](https://en.wikipedia.org/wiki/Paramore) as co-writers of her single [“Good 4 U”](https://en.wikipedia.org/wiki/Good_4_U)\n[due to the similarities](https://variety.com/2021/music/news/olivia-rodrigo-paramore-good-4-u-misery-business-1235048791/)\nbetween her own song and Paramore’s 2007 song [“Misery Business.\"](https://en.wikipedia.org/wiki/Misery_Business)\n[Multiple mashups](https://www.youtube.com/results?search_query=good+4+u+misery+business+mashup) of\nthe two songs can be be found online. This is not an isolated incident - many songs across multiple genres and decades sound similar or can be manipulated\nto sound similar - although perhaps not due to directly lifting elements from other musical works.\n\nNotable mashup artists including [Neil Cicierega](https://en.wikipedia.org/wiki/Neil_Cicierega) and [Girl Talk](\u003chttps://en.wikipedia.org/wiki/Girl_Talk_(musician)\u003e) have released entire mashup albums such as [Mouth Sounds](https://en.wikipedia.org/wiki/Mouth_Sounds) and [Feed the Animals](https://en.wikipedia.org/wiki/Feed_the_Animals), respectively. Platforms such as [Tik Tok](https://www.tiktok.com/) and [YouTube](https://www.youtube.com/) have no dearth of mashup material - such creations have clearly become exceedingly popular. The question is - with the formulaic concepts and techniques involved in creating a musical mashup, can mashup-creation be automated?\n\n## Functionality\n\nThe Auto Mashup project spans two repositories.\n\nThe first repository ([the one you are visiting right now](https://github.com/amamenko/auto-mashup)) represents\nthe [Node.js](https://nodejs.org/en/) and [Express](https://expressjs.com/) server that handles the weekly regular Billboard chart scraping, monthly GOAT\nBillboard chart scraping, individual song data/audio stem acquisition logic, and writing to a [Contentful Content Management System](https://www.contentful.com/).\n\nThe second repository\n([https://github.com/amamenko/auto-mashup-mix](https://github.com/amamenko/auto-mashup-mix)) contains both the client-side website logic of [auto-mashup.vercel.app](https://auto-mashup.vercel.app)\n(built with [React](https://reactjs.org/)) and the Node.js/Express server that uses the song data acquired in Contentful to find and create automated song mashups\nwith [FFMPEG](https://ffmpeg.org/) and create and upload a weekly video of mashups to the [Auto Mashup YouTube channel](https://www.youtube.com/channel/UCbjaDBiyXCqWGT4inY8LCmQ)\nand a post to the [@automaticmashup Instagram page](https://www.instagram.com/automaticmashup/).\n\nThe basic functionality of this repository's code logic is:\n\n\u003cstrong\u003eBillboard Chart Scraping:\u003c/strong\u003e\n\n- Use [cheerio](https://www.npmjs.com/package/cheerio) to scrape song position data from charts on [billboard.com](https://www.billboard.com/) using logic modified from [billboard-top-100](https://www.npmjs.com/package/billboard-top-100).\n- Remove any old entries and their associated instrumental and accompaniment audio assets if the song is no longer present on any Billboard chart.\n- Scrape regular Billboard charts via a CRON job set up via [node-cron](https://www.npmjs.com/package/node-cron) every Wednesday and greatest-of-all-time Billboard charts on the first Sunday of every month. The selected Billboard charts include:\n\u003cbr /\u003e\n\u003ctable align=\"center\"\u003e\n  \u003ctr\u003e\n    \u003cth\u003eRegular Billboard Charts\u003c/th\u003e\n    \u003cth\u003eGOAT Billboard Charts\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eThe Hot 100\u003c/td\u003e\n    \u003ctd\u003eGOAT Hot 100 Songs\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eBillboard Global 200\u003c/td\u003e\n    \u003ctd\u003eGOAT Hot 100 Songs by Women\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eRadio Songs\u003c/td\u003e\n    \u003ctd\u003eGOAT Songs of the Summer\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eHot Dance/Electronic Songs\u003c/td\u003e\n    \u003ctd\u003eGOAT Songs of the '80s\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eHot Rap Songs\u003c/td\u003e\n    \u003ctd\u003eGOAT Songs of the '90s\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eHot R\u0026B/Hip-Hop Songs\u003c/td\u003e\n    \u003ctd\u003eGOAT Hot R\u0026B/Hip-Hop Songs\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eHot R\u0026B Songs\u003c/td\u003e\n    \u003ctd\u003eGOAT Adult Alternative Songs\u003c/td\u003e\n  \u003c/tr\u003e \n  \u003ctr\u003e\n    \u003ctd\u003eHot Alternative Songs\u003c/td\u003e\n    \u003ctd\u003eGOAT Alternative Songs\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eHot Country Songs\u003c/td\u003e\n    \u003ctd\u003eGOAT Hot Country Songs\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eHot Mainstream Rock Songs\u003c/td\u003e\n    \u003ctd\u003eGOAT Mainstream Rock Songs\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eMexico Airplay\u003c/td\u003e\n    \u003ctd\u003eGOAT Pop Songs\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eHot Latin Songs\u003c/td\u003e\n    \u003ctd\u003eGOAT Adult Pop Songs\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\u003cbr /\u003e\n\u003cbr /\u003e\n\n\u003cstrong\u003eSong Data Acquisition:\u003c/strong\u003e\n\n- Use the [Spotify Web API](https://www.npmjs.com/package/spotify-web-api-node) to get an audio analysis for every track on the Billboard chart with a Spotify\n  song ID (noting the song's tempo, key, and mode, in addition to the track name and artist name). Songs with a time signature other than\n  [4/4 (common time)](https://en.wikipedia.org/wiki/Time_signature#common_time) are excluded since 4/4 time is by far the most popular time signature and to make\n  mashup creation a more streamlined effort.\n- Search [YouTube](https://www.youtube.com/) using logic modified from [usetube](https://www.npmjs.com/package/usetube) for applicable videos that meet certain minimum standards (e.g. videos do not contain\n  blacklisted terms either in their video title, video description title, channel name, or channel description) and contain closed-captions. The timestamped closed-captions\n  available on these videos are then compared to lyrics found on [Genius](https://genius.com/) (acquired via the [Genius Lyrics API](https://www.npmjs.com/package/genius-lyrics-api))\n  with a string and character comparison function that attributes timestamps to the various sections of the song.\n- If a video with an adequate number of successfully timestamped song sections is found, its MP3 audio is downloaded using [yt-dlp](https://github.com/yt-dlp/yt-dlp). Audio is then trimmed to a maximum of 3 minutes long with [fluent-ffmpeg](https://www.npmjs.com/package/fluent-ffmpeg).\n- The MP3 audio is then split into instrumental and vocal stem MP3 files uploaded to an output AWS S3 bucket using a custom [Dockerized AWS Lambda function](https://github.com/amamenko/lambda-spleeter-docker) that relies on\n  [Deezer's Spleeter](https://github.com/deezer/spleeter). Spleeter is a song separation library that uses pretrained models written in [Python](https://www.python.org/) and [Tensorflow](https://tensorflow.org/).\n  Note that a local Node.js implementation of Spleeter is possible as [noted by my comment on this issue](https://github.com/deezer/spleeter/issues/358#issuecomment-914895894), however,\n  Spleeter requires a substantial amount of RAM that quickly overwhelms an [AWC EC2 t2.micro instance](https://aws.amazon.com/ec2/instance-types/t2/). Even with [modular implementations](https://github.com/amo13/spleeter-wrapper) of Spleeter, the splitting process (even with a base 2-stem model) is memory-intensive.\n- Every beat position of the instrumental stem MP3 file is then determined for [beatmatching](https://en.wikipedia.org/wiki/Beatmatching) purposes using the [essentia.js](https://mtg.github.io/essentia.js/) library.\n- Vocal and accompaniment audio assets are uploaded to a Contentful CMS using Contentful's [Content Management API](https://www.npmjs.com/package/contentful-management). These assets are then associated with the song's entry. The enty is subsequently populated with all of the acquired data.\n\n## Deployment\n\nServer deployed via [AWS EC2](https://aws.amazon.com/ec2/) instance. Client-side website deployed with [Vercel](https://vercel.com/).\n\n\u003c!-- LICENSE --\u003e\n\n## License\n\nDistributed under the MIT License. See `LICENSE.txt` for more information.\n\n\u003c!-- CONTACT --\u003e\n\n## Contact\n\nAuto Mashup - automaticmashup@gmail.com\n\nAvraham (Avi) Mamenko - avimamenko@gmail.com\n\nProject Link: [https://github.com/amamenko/auto-mashup](https://github.com/amamenko/auto-mashup)\n\n\u003c!-- ACKNOWLEDGEMENTS --\u003e\n\n## Acknowledgements\n\n- [YouTube](https://www.youtube.com/)\n- [Billboard](https://www.billboard.com/)\n- [Contentful](https://www.contentful.com/)\n- [AWS](https://aws.amazon.com/)\n- [node-cron](https://www.npmjs.com/package/node-cron)\n- [Spotify](https://www.spotify.com/us/)\n- [Genius](https://genius.com/)\n- [FFMPEG](https://ffmpeg.org/)\n- [fluent-ffmpeg](https://www.npmjs.com/package/fluent-ffmpeg)\n- [yt-dlp](https://github.com/yt-dlp/yt-dlp)\n- [essentia.js](https://mtg.github.io/essentia.js/)\n- [usetube](https://www.npmjs.com/package/usetube)\n- [billboard-top-100](https://www.npmjs.com/package/billboard-top-100)\n- [Best-README-Template](https://github.com/othneildrew/Best-README-Template)\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\u003c!-- https://www.markdownguide.org/basic-syntax/#reference-style-links --\u003e\n\n[license-shield]: https://img.shields.io/github/license/othneildrew/Best-README-Template.svg?style=for-the-badge\n[license-url]: https://github.com/amamenko/auto-mashup/blob/master/LICENSE.txt\n[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge\u0026logo=linkedin\u0026colorB=555\n[linkedin-url]: https://www.linkedin.com/in/avrahammamenko\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famamenko%2Fauto-mashup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famamenko%2Fauto-mashup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famamenko%2Fauto-mashup/lists"}