9 Commits

Author SHA1 Message Date
Relationship 2031057559 Add files via upload 2026-07-05 08:26:06 +01:00
Relationship c3c4488cdc Delete Core.lua 2026-07-05 08:25:48 +01:00
Relationship a1e45d9ed5 Delete GeneratePlaylist.bat 2026-07-05 08:25:44 +01:00
Relationship 343f892029 Delete GeneratePlaylist.ps1 2026-07-05 08:25:40 +01:00
Relationship f0996e4fce Delete RelationshipsJukeBox.toc 2026-07-05 08:25:34 +01:00
Relationship 5cd1a221bb Update README.md 2026-07-05 07:25:54 +01:00
Relationship e92321ada1 Update RelationshipsJukeBox.toc 2026-07-05 07:16:17 +01:00
Relationship 99d3881e88 Update RelationshipsJukeBox.toc 2026-07-05 07:13:48 +01:00
Relationship 504bdd7473 Update README.md 2026-07-05 07:02:13 +01:00
5 changed files with 582 additions and 7 deletions
+217
View File
@@ -0,0 +1,217 @@
RelationshipsJukeboxAutoPlaylist = {}
RelationshipsJukeboxAutoPlaylist.tracks = {
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\01 - Pantera - Walk.mp3", name = "01 - Pantera - Walk", duration = 316 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\01. Session.mp3", name = "01. Session", duration = 145 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\01. What I_ve Done.mp3", name = "01. What I_ve Done", duration = 206 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\02 - Metallica - Master Of Puppets.mp3", name = "02 - Metallica - Master Of Puppets", duration = 516 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\02. Doomsday Clock.mp3", name = "02. Doomsday Clock", duration = 224 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\02. This Is the New Shit.mp3", name = "02. This Is the New Shit", duration = 261 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\03 - Slayer - Raining Blood.mp3", name = "03 - Slayer - Raining Blood", duration = 255 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\03. Reload.mp3", name = "03. Reload", duration = 266 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\03. This Moment.mp3", name = "03. This Moment", duration = 186 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\04 - Slipknot - Duality.mp3", name = "04 - Slipknot - Duality", duration = 253 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\04. Before It_s Too Late _Sam and Mikaela_s Theme_.mp3", name = "04. Before It_s Too Late _Sam and Mikaela_s Theme_", duration = 186 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\04. Furious Angels _Instrumental_.mp3", name = "04. Furious Angels _Instrumental_", duration = 330 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\05 - Iron Maiden - The Trooper - 2015 Remaster.mp3", name = "05 - Iron Maiden - The Trooper - 2015 Remaster", duration = 253 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\05. Lucky You.mp3", name = "05. Lucky You", duration = 251 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\05. Pretty Handsome Awkward.mp3", name = "05. Pretty Handsome Awkward", duration = 216 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\06 - System Of A Down - Chop Suey_.mp3", name = "06 - System Of A Down - Chop Suey_", duration = 211 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\06. Passion_s Killing Floor.mp3", name = "06. Passion_s Killing Floor", duration = 311 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\06. The Passportal.mp3", name = "06. The Passportal", duration = 140 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\07 - Megadeth - Symphony Of Destruction.mp3", name = "07 - Megadeth - Symphony Of Destruction", duration = 247 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\07. Sleeping Awake.mp3", name = "07. Sleeping Awake", duration = 204 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\07. What_s It Feel Like to Be a Ghost.mp3", name = "07. What_s It Feel Like to Be a Ghost", duration = 225 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\08 - Rammstein - Du hast.mp3", name = "08 - Rammstein - Du hast", duration = 235 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\08. Bruises.mp3", name = "08. Bruises", duration = 156 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\08. Second to None _Feat. Mike Shinoda_.mp3", name = "08. Second to None _Feat. Mike Shinoda_", duration = 188 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\09 - TOOL - Stinkfist.mp3", name = "09 - TOOL - Stinkfist", duration = 313 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\09. Calm Like A Bomb.mp3", name = "09. Calm Like A Bomb", duration = 299 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\09. End of the World.mp3", name = "09. End of the World", duration = 251 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\10 - Five Finger Death Punch - Under and Over It.mp3", name = "10 - Five Finger Death Punch - Under and Over It", duration = 219 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\10. Dread Rock.mp3", name = "10. Dread Rock", duration = 281 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\10. Retina and the Sky.mp3", name = "10. Retina and the Sky", duration = 218 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\11 - Lamb of God - Laid to Rest.mp3", name = "11 - Lamb of God - Laid to Rest", duration = 231 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\11. Technical Difficulties.mp3", name = "11. Technical Difficulties", duration = 260 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\11. Zion.mp3", name = "11. Zion", duration = 274 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\12 - Motörhead - Ace of Spades.mp3", name = "12 - Motörhead - Ace of Spades", duration = 169 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\12. Transformers Theme.mp3", name = "12. Transformers Theme", duration = 167 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\12. When The World Ends _Oakenfold Remix_.mp3", name = "12. When The World Ends _Oakenfold Remix_", duration = 327 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\13 - Avenged Sevenfold - Hail to the King.mp3", name = "13 - Avenged Sevenfold - Hail to the King", duration = 306 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\13. Transformers Theme _More Than Meets The Eye_.mp3", name = "13. Transformers Theme _More Than Meets The Eye_", duration = 128 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\14 - Black Sabbath - Paranoid.mp3", name = "14 - Black Sabbath - Paranoid", duration = 169 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\15 - Korn - Freak On a Leash.mp3", name = "15 - Korn - Freak On a Leash", duration = 256 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\16 - Marilyn Manson - The Beautiful People.mp3", name = "16 - Marilyn Manson - The Beautiful People", duration = 223 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\17 - Volbeat - A Warrior_s Call.mp3", name = "17 - Volbeat - A Warrior_s Call", duration = 264 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\18 - Suicidal Tendencies - You Can_t Bring Me Down.mp3", name = "18 - Suicidal Tendencies - You Can_t Bring Me Down", duration = 348 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\19 - Metallica - Enter Sandman.mp3", name = "19 - Metallica - Enter Sandman", duration = 331 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\20 - Mastodon - Blood and Thunder.mp3", name = "20 - Mastodon - Blood and Thunder", duration = 229 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\21 - Anthrax - Madhouse.mp3", name = "21 - Anthrax - Madhouse", duration = 260 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\22 - Sepultura - Roots Bloody Roots.mp3", name = "22 - Sepultura - Roots Bloody Roots", duration = 213 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\23 - Bring Me The Horizon - Shadow Moses.mp3", name = "23 - Bring Me The Horizon - Shadow Moses", duration = 244 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\24 - Rob Zombie - Dragula.mp3", name = "24 - Rob Zombie - Dragula", duration = 223 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\25 - System Of A Down - Sugar.mp3", name = "25 - System Of A Down - Sugar", duration = 154 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\26 - Mudvayne - Dig.mp3", name = "26 - Mudvayne - Dig", duration = 163 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\27 - Bullet For My Valentine - Your Betrayal.mp3", name = "27 - Bullet For My Valentine - Your Betrayal", duration = 292 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\28 - Dope - Die MF Die.mp3", name = "28 - Dope - Die MF Die", duration = 187 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\29 - Judas Priest - Painkiller.mp3", name = "29 - Judas Priest - Painkiller", duration = 366 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\30 - Clawfinger - Biggest _ The Best - Remastered version.mp3", name = "30 - Clawfinger - Biggest _ The Best - Remastered version", duration = 232 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\31 - Exodus - The Toxic Waltz.mp3", name = "31 - Exodus - The Toxic Waltz", duration = 291 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\32 - Machine Head - Davidian.mp3", name = "32 - Machine Head - Davidian", duration = 297 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\33 - Fear Factory - Linchpin.mp3", name = "33 - Fear Factory - Linchpin", duration = 205 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\34 - DOWN - Stone the Crow.mp3", name = "34 - DOWN - Stone the Crow", duration = 283 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\35 - Pantera - Cowboys from Hell.mp3", name = "35 - Pantera - Cowboys from Hell", duration = 244 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\36 - Parkway Drive - Carrion.mp3", name = "36 - Parkway Drive - Carrion", duration = 189 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\37 - Alice In Chains - Would.mp3", name = "37 - Alice In Chains - Would", duration = 207 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\38 - Gojira - Flying whales.mp3", name = "38 - Gojira - Flying whales", duration = 465 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\39 - Slipknot - Wait and Bleed.mp3", name = "39 - Slipknot - Wait and Bleed", duration = 148 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\40 - Deftones - My Own Summer _Shove It_.mp3", name = "40 - Deftones - My Own Summer _Shove It_", duration = 216 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\41 - Coal Chamber - Loco.mp3", name = "41 - Coal Chamber - Loco", duration = 255 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\42 - Prong - Snap Your Fingers_ Snap Your Neck.mp3", name = "42 - Prong - Snap Your Fingers_ Snap Your Neck", duration = 252 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\43 - Trivium - Dying in Your Arms.mp3", name = "43 - Trivium - Dying in Your Arms", duration = 174 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\44 - Slayer - South Of Heaven.mp3", name = "44 - Slayer - South Of Heaven", duration = 299 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\45 - Life Of Agony - River Runs Red.mp3", name = "45 - Life Of Agony - River Runs Red", duration = 115 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\46 - Testament - Electric Crown.mp3", name = "46 - Testament - Electric Crown", duration = 331 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\47 - Disturbed - Down with the Sickness.mp3", name = "47 - Disturbed - Down with the Sickness", duration = 279 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\48 - In Flames - Only for the Weak.mp3", name = "48 - In Flames - Only for the Weak", duration = 298 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\49 - Limp Bizkit - Break Stuff.mp3", name = "49 - Limp Bizkit - Break Stuff", duration = 167 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\50 - Within Temptation - Stand My Ground.mp3", name = "50 - Within Temptation - Stand My Ground", duration = 269 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\51 - Accept - Balls to the Wall.mp3", name = "51 - Accept - Balls to the Wall", duration = 343 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\52 - Amon Amarth - Twilight Of The Thunder God.mp3", name = "52 - Amon Amarth - Twilight Of The Thunder God", duration = 249 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\53 - W.A.S.P. - I Wanna Be Somebody.mp3", name = "53 - W.A.S.P. - I Wanna Be Somebody", duration = 224 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\54 - Hatebreed - Looking Down the Barrel of Today.mp3", name = "54 - Hatebreed - Looking Down the Barrel of Today", duration = 162 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\55 - Static-X - Push It.mp3", name = "55 - Static-X - Push It", duration = 155 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\56 - Killswitch Engage - My Curse.mp3", name = "56 - Killswitch Engage - My Curse", duration = 245 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\57 - Ministry - Just One Fix.mp3", name = "57 - Ministry - Just One Fix", duration = 311 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\58 - Paradise Lost - Enchantment - 2011 Remasterred.mp3", name = "58 - Paradise Lost - Enchantment - 2011 Remasterred", duration = 366 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\59 - King Diamond - Abigail - Reissue.mp3", name = "59 - King Diamond - Abigail - Reissue", duration = 291 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\60 - Ghost - Ritual.mp3", name = "60 - Ghost - Ritual", duration = 269 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\61 - Twisted Sister - I Wanna Rock.mp3", name = "61 - Twisted Sister - I Wanna Rock", duration = 180 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\62 - Manowar - Kings of Metal.mp3", name = "62 - Manowar - Kings of Metal", duration = 224 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\63 - Type O Negative - Black No. 1 _Little Miss Scare -All_.mp3", name = "63 - Type O Negative - Black No. 1 _Little Miss Scare -All_", duration = 676 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\64 - Lacuna Coil - Heaven_s a Lie.mp3", name = "64 - Lacuna Coil - Heaven_s a Lie", duration = 287 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\65 - Nightwish - Nemo.mp3", name = "65 - Nightwish - Nemo", duration = 277 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\66 - Meshuggah - Bleed.mp3", name = "66 - Meshuggah - Bleed", duration = 443 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\67 - White Zombie - Thunder Kiss _65.mp3", name = "67 - White Zombie - Thunder Kiss _65", duration = 235 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\68 - Arch Enemy - War Eternal.mp3", name = "68 - Arch Enemy - War Eternal", duration = 257 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\69 - Death Angel - The Ultra-Violence.mp3", name = "69 - Death Angel - The Ultra-Violence", duration = 634 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\70 - Soil - Halo.mp3", name = "70 - Soil - Halo", duration = 196 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\71 - Dream Theater - Panic Attack.mp3", name = "71 - Dream Theater - Panic Attack", duration = 437 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\72 - Strapping Young Lad - Love.mp3", name = "72 - Strapping Young Lad - Love", duration = 294 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\73 - As I Lay Dying - The Sound Of Truth.mp3", name = "73 - As I Lay Dying - The Sound Of Truth", duration = 261 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\74 - Godsmack - 1000hp.mp3", name = "74 - Godsmack - 1000hp", duration = 227 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\75 - Sacred Reich - The American Way.mp3", name = "75 - Sacred Reich - The American Way", duration = 222 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\76 - Overkill - Elimination.mp3", name = "76 - Overkill - Elimination", duration = 276 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\77 - Children Of Bodom - Are You Dead Yet.mp3", name = "77 - Children Of Bodom - Are You Dead Yet", duration = 235 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Cheese - 10x Karma.mp3", name = "Cheese - 10x Karma", duration = 332 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Cheese - Doobie Tunes 1 _ 2.mp3", name = "Cheese - Doobie Tunes 1 _ 2", duration = 337 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Cheese - Few Seconds Of Pain.mp3", name = "Cheese - Few Seconds Of Pain", duration = 153 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Cheese - Fine.mp3", name = "Cheese - Fine", duration = 269 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Cheese - Gaido.mp3", name = "Cheese - Gaido", duration = 253 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Cheese -Trilogy.mp3", name = "Cheese -Trilogy", duration = 275 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Chico Science - Sink or Swim.mp3", name = "Chico Science - Sink or Swim", duration = 250 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Chicosci - A Promise.mp3", name = "Chicosci - A Promise", duration = 185 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Chicosci - Chicosci Vampire Social Club.mp3", name = "Chicosci - Chicosci Vampire Social Club", duration = 183 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Chicosci - Paris.mp3", name = "Chicosci - Paris", duration = 238 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Chicosci - Raspberry_ Girl.mp3", name = "Chicosci - Raspberry_ Girl", duration = 213 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Disturbed - Down With The Sickness.mp3", name = "Disturbed - Down With The Sickness", duration = 279 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Disturbed - Indestructible.mp3", name = "Disturbed - Indestructible", duration = 278 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Disturbed - Stricken.mp3", name = "Disturbed - Stricken", duration = 248 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Disturbed - Stupify.mp3", name = "Disturbed - Stupify", duration = 274 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Disturbed - The Vengeful One.mp3", name = "Disturbed - The Vengeful One", duration = 253 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Donkey Kong Country - Gangplank Galleon.ogg", name = "Donkey Kong Country - Gangplank Galleon", duration = 194 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Drowning Pool - Bodies _2014_.mp3", name = "Drowning Pool - Bodies _2014_", duration = 203 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Drowning Pool - Feel Like I Do.mp3", name = "Drowning Pool - Feel Like I Do", duration = 214 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Drowning Pool - Numb _2004_.mp3", name = "Drowning Pool - Numb _2004_", duration = 213 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Drowning Pool - Sinner _2014_.mp3", name = "Drowning Pool - Sinner _2014_", duration = 148 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Drowning Pool - Step Up _2004_.mp3", name = "Drowning Pool - Step Up _2004_", duration = 198 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Drowning Pool - Tear Away.mp3", name = "Drowning Pool - Tear Away", duration = 273 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Evanescence - Bring Me To Life.mp3", name = "Evanescence - Bring Me To Life", duration = 238 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Evanescence - My Immortal.mp3", name = "Evanescence - My Immortal", duration = 265 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Greyhoundz - Even.mp3", name = "Greyhoundz - Even", duration = 218 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Greyhoundz - Jack In Da Box.mp3", name = "Greyhoundz - Jack In Da Box", duration = 268 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Greyhoundz - Karmic.mp3", name = "Greyhoundz - Karmic", duration = 224 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Greyhoundz - Mr. P.I.G..mp3", name = "Greyhoundz - Mr. P.I.G.", duration = 190 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Greyhoundz - Pigface.mp3", name = "Greyhoundz - Pigface", duration = 217 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Greyhoundz - Your Puppet And Clown.mp3", name = "Greyhoundz - Your Puppet And Clown", duration = 306 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Korn - Blind.mp3", name = "Korn - Blind", duration = 261 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Korn - Falling Away From Me.mp3", name = "Korn - Falling Away From Me", duration = 271 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Korn - Freak On A Leash.mp3", name = "Korn - Freak On A Leash", duration = 257 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Korn - Got The Life.mp3", name = "Korn - Got The Life", duration = 226 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Korn - Here To Stay.mp3", name = "Korn - Here To Stay", duration = 272 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Limp Bizkit - Behind Blue Eyes.mp3", name = "Limp Bizkit - Behind Blue Eyes", duration = 366 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Limp Bizkit - Break Stuff.mp3", name = "Limp Bizkit - Break Stuff", duration = 167 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Limp Bizkit - My Generation.mp3", name = "Limp Bizkit - My Generation", duration = 222 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Limp Bizkit - My Way.mp3", name = "Limp Bizkit - My Way", duration = 274 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Limp Bizkit - Nookie.mp3", name = "Limp Bizkit - Nookie", duration = 290 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Limp Bizkit - Re-Arranged.mp3", name = "Limp Bizkit - Re-Arranged", duration = 355 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Limp Bizkit - Rollin' (Air Raid Vehicle).mp3", name = "Limp Bizkit - Rollin' (Air Raid Vehicle)", duration = 214 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Limp Bizkit - Rollin_ _Air Raid Vehicle_.mp3", name = "Limp Bizkit - Rollin_ _Air Raid Vehicle_", duration = 214 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Limp Bizkit - Rollin_ Air Raid Vehicle.mp3", name = "Limp Bizkit - Rollin_ Air Raid Vehicle", duration = 214 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Limp Bizkit - Take A Look Around.mp3", name = "Limp Bizkit - Take A Look Around", duration = 322 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Linkin Park - Breaking the Habit.mp3", name = "Linkin Park - Breaking the Habit", duration = 197 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Linkin Park - Crawling.mp3", name = "Linkin Park - Crawling", duration = 210 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Linkin Park - Faint.mp3", name = "Linkin Park - Faint", duration = 163 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Linkin Park - In the End.mp3", name = "Linkin Park - In the End", duration = 217 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Linkin Park - My December.mp3", name = "Linkin Park - My December", duration = 260 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Linkin Park - Numb.mp3", name = "Linkin Park - Numb", duration = 188 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Linkin Park - One Step Closer.mp3", name = "Linkin Park - One Step Closer", duration = 156 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Linkin Park - Papercut.mp3", name = "Linkin Park - Papercut", duration = 185 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Linkin Park - Somewhere I Belong.mp3", name = "Linkin Park - Somewhere I Belong", duration = 215 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Loopo_b.wav", name = "Loopo_b", duration = 1 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Mudvayne - _2000_ 02 Dig.mp3", name = "Mudvayne - _2000_ 02 Dig", duration = 162 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Mudvayne - _2000_ 05 Death Blooms.mp3", name = "Mudvayne - _2000_ 05 Death Blooms", duration = 292 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Mudvayne - _2005_ 01 Determined.mp3", name = "Mudvayne - _2005_ 01 Determined", duration = 160 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Mudvayne - _2005_ 03 Happy.mp3", name = "Mudvayne - _2005_ 03 Happy", duration = 218 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Mudvayne - _2005_ 08 Forget To Remember.mp3", name = "Mudvayne - _2005_ 08 Forget To Remember", duration = 216 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\P.O.D. - Alive.mp3", name = "P.O.D. - Alive", duration = 204 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\P.O.D. - Boom.mp3", name = "P.O.D. - Boom", duration = 189 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\P.O.D. - Satellite.mp3", name = "P.O.D. - Satellite", duration = 211 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\P.O.D. - Youth_of_the_nation.mp3", name = "P.O.D. - Youth_of_the_nation", duration = 260 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Papa Roach - Between Angels And Insects.mp3", name = "Papa Roach - Between Angels And Insects", duration = 235 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Papa Roach - Getting Away With Murder.mp3", name = "Papa Roach - Getting Away With Murder", duration = 193 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Papa Roach - Last Resort.mp3", name = "Papa Roach - Last Resort", duration = 200 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Papa Roach - Scars.mp3", name = "Papa Roach - Scars", duration = 209 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Papa Roach - She Loves Me Not.mp3", name = "Papa Roach - She Loves Me Not", duration = 210 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Queso - Furlan.mp3", name = "Queso - Furlan", duration = 275 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Queso - Insekta.mp3", name = "Queso - Insekta", duration = 371 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Queso - Tiamat.mp3", name = "Queso - Tiamat", duration = 291 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Seether - Broken _Feat. Amy Lee_.mp3", name = "Seether - Broken _Feat. Amy Lee_", duration = 259 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Seether - Fake It.mp3", name = "Seether - Fake It", duration = 194 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Seether - Fine Again.mp3", name = "Seether - Fine Again", duration = 246 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Seether - Love Her.mp3", name = "Seether - Love Her", duration = 252 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Seether - Remedy.mp3", name = "Seether - Remedy", duration = 208 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Seether - Save Today.mp3", name = "Seether - Save Today", duration = 289 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Seether - Tied My Hands.mp3", name = "Seether - Tied My Hands", duration = 314 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Slapshock - Agent Orange.mp3", name = "Slapshock - Agent Orange", duration = 248 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Slapshock - Anino Mo.mp3", name = "Slapshock - Anino Mo", duration = 303 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Slapshock - Carino Brutal.mp3", name = "Slapshock - Carino Brutal", duration = 266 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Slapshock - Direction.mp3", name = "Slapshock - Direction", duration = 224 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Slapshock - Get Away.mp3", name = "Slapshock - Get Away", duration = 249 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Slapshock - Numb.mp3", name = "Slapshock - Numb", duration = 344 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Slapshock - Waiting.mp3", name = "Slapshock - Waiting", duration = 242 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Slipknot - _Sic_.mp3", name = "Slipknot - _Sic_", duration = 201 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Slipknot - Before I Forget.mp3", name = "Slipknot - Before I Forget", duration = 279 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Slipknot - Duality.mp3", name = "Slipknot - Duality", duration = 253 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Slipknot - Snuff.mp3", name = "Slipknot - Snuff", duration = 277 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Slipknot - Vermilion Pt. 2.mp3", name = "Slipknot - Vermilion Pt. 2", duration = 225 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Slipknot - Wait and Bleed.mp3", name = "Slipknot - Wait and Bleed", duration = 148 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\SOAD - Aerials.mp3", name = "SOAD - Aerials", duration = 372 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\SOAD - B.Y.O.B..mp3", name = "SOAD - B.Y.O.B.", duration = 256 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\SOAD - Chop Suey_.mp3", name = "SOAD - Chop Suey_", duration = 211 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\SOAD - Hypnotize.mp3", name = "SOAD - Hypnotize", duration = 190 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\SOAD - Lonely Day.mp3", name = "SOAD - Lonely Day", duration = 168 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\SOAD - Question_.mp3", name = "SOAD - Question_", duration = 201 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\SOAD - Spiders.mp3", name = "SOAD - Spiders", duration = 216 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\SOAD - Sugar.mp3", name = "SOAD - Sugar", duration = 154 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\SOAD - Toxicity.mp3", name = "SOAD - Toxicity", duration = 219 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Staind - Fade.mp3", name = "Staind - Fade", duration = 244 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Staind - It_s Been Awhile.mp3", name = "Staind - It_s Been Awhile", duration = 266 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Staind - Outside.mp3", name = "Staind - Outside", duration = 293 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Staind - So Far Away.mp3", name = "Staind - So Far Away", duration = 246 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Three Days Grace - Animal I Have Become.mp3", name = "Three Days Grace - Animal I Have Become", duration = 232 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Three Days Grace - I Hate Everything About You.mp3", name = "Three Days Grace - I Hate Everything About You", duration = 232 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Three Days Grace - Never Too Late.mp3", name = "Three Days Grace - Never Too Late", duration = 210 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Three Days Grace - Riot.mp3", name = "Three Days Grace - Riot", duration = 208 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Three Days Grace - Time Of Dying.mp3", name = "Three Days Grace - Time Of Dying", duration = 189 },
{ path = "Interface\\AddOns\\RelationshipsJukeBox\\Media\\Trapt - Headstrong _Explicit Version_.mp3", name = "Trapt - Headstrong _Explicit Version_", duration = 293 },
}
+23 -4
View File
@@ -364,7 +364,7 @@ local function ResumePlayback()
RJ.isPaused = false
if RJ.currentPath then
if IsMp3Path and IsMp3Path(RJ.currentPath) and PlayMusic then
if IsMusicPath(RJ.currentPath) and PlayMusic then
PlayMusic(RJ.currentPath)
RJ.currentCanStop = true
elseif PlaySoundFile then
@@ -564,6 +564,22 @@ end
-----------------------------------------------------------------------
-- Track playback core
-----------------------------------------------------------------------
-- Check whether a file path should be played via PlayMusic (WoW 1.12 FMOD 3.x
-- requires PlayMusic for .mp3, .wav AND .ogg — PlaySoundFile cannot play any
-- of these formats). Only files NOT matching these extensions should use
-- PlaySoundFile (e.g. custom SoundKit IDs or Blizzard sound paths).
--
-- Uses separate string.find calls per extension instead of a regex-style
-- alternation (|) because Lua patterns are NOT regular expressions — the
-- pipe character has no special meaning in Lua patterns.
local function IsMusicPath(path)
local lower = string.lower(path or "")
return string.find(lower, "%.mp3$") ~= nil
or string.find(lower, "%.wav$") ~= nil
or string.find(lower, "%.ogg$") ~= nil
end
-- Legacy alias kept for clarity in comments / status messages
local function IsMp3Path(path)
return string.find(string.lower(path or ""), "%.mp3$") ~= nil
end
@@ -631,7 +647,10 @@ PlayTrack = function(indexOrEntry, fromQueue)
RJ.consecutiveNotPlaying = 0
-- Play the track
if IsMp3Path(path) and PlayMusic then
-- WoW 1.12 FMOD 3.x: PlayMusic supports .mp3, .wav and .ogg.
-- PlaySoundFile does NOT play .wav or .ogg (it silently fails),
-- so all three formats must go through PlayMusic.
if IsMusicPath(path) and PlayMusic then
PlayMusic(path)
ok = 1
RJ.currentCanStop = true
@@ -662,7 +681,7 @@ PlayTrack = function(indexOrEntry, fromQueue)
RJ.trackEndTime = GetTime() + duration
SetStatus("Playing " .. posLabel .. ": " .. name .. " (" .. duration .. "s)", 0.2, 1, 0.2)
elseif RJ.currentCanStop and IsPlaying then
-- MP3 with no duration: poll IsPlaying() to detect end
-- PlayMusic track with no duration: poll IsPlaying() to detect end
RJ.trackEndTime = nil
RJ.pollingForEnd = true
RJ.pollTimer = GetTime() + RJ.pollStartDelay
@@ -1266,7 +1285,7 @@ ticker:SetScript("OnUpdate", function()
return
end
-- 2) IsPlaying polling: detect when MP3 finishes for tracks with no duration
-- 2) IsPlaying polling: detect when PlayMusic track finishes for tracks with no duration
if RJ.autoPlayEnabled and not RJ.isPaused and RJ.pollingForEnd then
if GetTime() < RJ.pollTimer then
return
+335
View File
@@ -1259,6 +1259,341 @@ if ($sanitized -eq 0 -and $skipped -eq 0 -and $mp3Files.Count -gt 0) {
Write-Host ""
}
# -- Sanitize WAV/OGG files for WoW 1.12 compatibility -----------------------
# WoW 1.12's FMOD 3.x engine is very picky about WAV and OGG files too.
# Many WAV/OGG files that play fine in modern players will silently fail in-game.
#
# Known WAV issues:
# 1. 24-bit or 32-bit float samples (FMOD 3.x only supports 8-bit and 16-bit PCM)
# 2. Sample rates other than 44100 Hz or 22050 Hz
# 3. More than 2 channels (surround sound WAVs)
# 4. ADPCM or other compressed WAV formats
# 5. RIFF LIST/INFO chunks that can confuse FMOD
# 6. Very large WAV files that exceed FMOD's buffer
# 7. IEEE float format (format code 3) instead of PCM (format code 1)
#
# Known OGG issues:
# 1. Vorbis encoding at unusual bitrates or quality levels
# 2. OGG files with video streams or metadata that FMOD cannot parse
# 3. OGG files encoded with very high quality settings (-q10) that FMOD 3.x rejects
# 4. Non-standard channel configurations
# 5. Opus codec inside an OGG container (FMOD 3.x only supports Vorbis in OGG)
#
# The ONLY reliable fix is to re-encode with ffmpeg using settings known to
# produce FMOD 3.x-compatible output. WAV is re-encoded to 16-bit PCM at
# 44100 Hz stereo; OGG is re-encoded to Vorbis at quality 6 (~192kbps).
function Test-WavNeedsReencode {
param([string]$FilePath)
try {
$ffmpegExe = Find-Ffmpeg -Name 'ffprobe'
if ($ffmpegExe) {
$ffOutFile = [System.IO.Path]::GetTempFileName()
$ffErrFile = [System.IO.Path]::GetTempFileName()
$ffProc = Start-Process -FilePath $ffmpegExe -ArgumentList @('-v', 'quiet', '-print_format', 'json', '-show_streams', '-show_format', $FilePath) -NoNewWindow -Wait -PassThru -RedirectStandardOutput $ffOutFile -RedirectStandardError $ffErrFile
Remove-Item -LiteralPath $ffErrFile -Force -ErrorAction SilentlyContinue
if ($ffProc.ExitCode -eq 0 -and (Test-Path -LiteralPath $ffOutFile -PathType Leaf)) {
$ffOut = Get-Content -LiteralPath $ffOutFile -Raw
Remove-Item -LiteralPath $ffOutFile -Force -ErrorAction SilentlyContinue
if ($ffOut) {
$ffJson = $ffOut | ConvertFrom-Json
foreach ($stream in $ffJson.streams) {
if ($stream.codec_type -eq 'audio') {
# Check sample format - must be s16 (signed 16-bit PCM)
if ($stream.sample_rate -and [int]$stream.sample_rate -ne 44100 -and [int]$stream.sample_rate -ne 22050) {
return $true, "Sample rate $($stream.sample_rate) Hz (FMOD 3.x requires 44100 or 22050 Hz)"
}
if ($stream.channels -and [int]$stream.channels -gt 2) {
return $true, "$($stream.channels) channels (FMOD 3.x supports max 2 channels)"
}
# Check codec - must be PCM (not ADPCM, float, etc.)
if ($stream.codec_name -and $stream.codec_name -ne 'pcm_s16le' -and $stream.codec_name -ne 'pcm_s16be' -and $stream.codec_name -ne 'pcm_u8' -and $stream.codec_name -ne 'pcm_s24le' -and $stream.codec_name -ne 'pcm_f32le' -and $stream.codec_name -ne 'adpcm_ms' -and $stream.codec_name -ne 'adpcm_ima_wav') {
# Not a standard PCM codec
} elseif ($stream.codec_name -eq 'pcm_s24le') {
return $true, '24-bit PCM (FMOD 3.x only supports 8-bit and 16-bit)'
} elseif ($stream.codec_name -eq 'pcm_f32le' -or $stream.codec_name -eq 'pcm_f64le') {
return $true, 'Float PCM format (FMOD 3.x only supports integer PCM)'
} elseif ($stream.codec_name -match 'adpcm') {
return $true, 'ADPCM compressed WAV (FMOD 3.x may not support this codec)'
}
# Check bit depth via bits_per_sample if available
if ($stream.bits_per_sample -and [int]$stream.bits_per_sample -gt 16 -and [int]$stream.bits_per_sample -ne 0) {
return $true, "$($stream.bits_per_sample)-bit audio (FMOD 3.x only supports 8-bit and 16-bit)"
}
}
}
}
} else {
Remove-Item -LiteralPath $ffOutFile -Force -ErrorAction SilentlyContinue
}
}
# Fallback: check WAV header bytes manually
$bytes = [System.IO.File]::ReadAllBytes($FilePath)
if ($bytes.Length -lt 44) { return $false, 'File too small' }
# Check RIFF header
if ($bytes[0] -ne 0x52 -or $bytes[1] -ne 0x49 -or $bytes[2] -ne 0x46 -or $bytes[3] -ne 0x46) {
return $false, 'Not a valid RIFF/WAV file'
}
# Find the 'fmt ' chunk
$fmtOffset = -1
for ($i = 12; $i -lt [Math]::Min($bytes.Length - 24, 4096); $i++) {
if ($bytes[$i] -eq 0x66 -and $bytes[$i+1] -eq 0x6D -and $bytes[$i+2] -eq 0x74 -and $bytes[$i+3] -eq 0x20) {
$fmtOffset = $i + 8 # Skip past 'fmt ' and chunk size
break
}
}
if ($fmtOffset -ge 0 -and $fmtOffset + 16 -le $bytes.Length) {
# Parse format fields (little-endian)
$audioFormat = $bytes[$fmtOffset] -bor ($bytes[$fmtOffset+1] -shl 8)
$numChannels = $bytes[$fmtOffset+2] -bor ($bytes[$fmtOffset+3] -shl 8)
$sampleRate = $bytes[$fmtOffset+4] -bor ($bytes[$fmtOffset+5] -shl 8) -bor ($bytes[$fmtOffset+6] -shl 16) -bor ($bytes[$fmtOffset+7] -shl 24)
$bitsPerSample = $bytes[$fmtOffset+14] -bor ($bytes[$fmtOffset+15] -shl 8)
if ($audioFormat -ne 1) {
return $true, "Non-PCM format code $audioFormat (FMOD 3.x only supports PCM format code 1)"
}
if ($bitsPerSample -gt 16) {
return $true, "$bitsPerSample-bit audio (FMOD 3.x only supports 8-bit and 16-bit)"
}
if ($numChannels -gt 2) {
return $true, "$numChannels channels (FMOD 3.x supports max 2 channels)"
}
if ($sampleRate -ne 44100 -and $sampleRate -ne 22050 -and $sampleRate -ne 11025) {
return $true, "Sample rate $sampleRate Hz (FMOD 3.x requires 11025/22050/44100 Hz)"
}
}
return $false, 'Compatible'
}
catch {
return $true, "Error analyzing file: $($_.Exception.Message)"
}
}
function Test-OggNeedsReencode {
param([string]$FilePath)
try {
$ffmpegExe = Find-Ffmpeg -Name 'ffprobe'
if ($ffmpegExe) {
$ffOutFile = [System.IO.Path]::GetTempFileName()
$ffErrFile = [System.IO.Path]::GetTempFileName()
$ffProc = Start-Process -FilePath $ffmpegExe -ArgumentList @('-v', 'quiet', '-print_format', 'json', '-show_streams', '-show_format', $FilePath) -NoNewWindow -Wait -PassThru -RedirectStandardOutput $ffOutFile -RedirectStandardError $ffErrFile
Remove-Item -LiteralPath $ffErrFile -Force -ErrorAction SilentlyContinue
if ($ffProc.ExitCode -eq 0 -and (Test-Path -LiteralPath $ffOutFile -PathType Leaf)) {
$ffOut = Get-Content -LiteralPath $ffOutFile -Raw
Remove-Item -LiteralPath $ffOutFile -Force -ErrorAction SilentlyContinue
if ($ffOut) {
$ffJson = $ffOut | ConvertFrom-Json
foreach ($stream in $ffJson.streams) {
if ($stream.codec_type -eq 'audio') {
# OGG must use Vorbis codec (not Opus, FLAC, etc.)
if ($stream.codec_name -and $stream.codec_name -ne 'vorbis') {
return $true, "Non-Vorbis codec '$($stream.codec_name)' in OGG container (FMOD 3.x only supports Vorbis)"
}
if ($stream.channels -and [int]$stream.channels -gt 2) {
return $true, "$($stream.channels) channels (FMOD 3.x supports max 2 channels)"
}
if ($stream.sample_rate -and [int]$stream.sample_rate -ne 44100 -and [int]$stream.sample_rate -ne 22050) {
return $true, "Sample rate $($stream.sample_rate) Hz (FMOD 3.x prefers 44100 or 22050 Hz)"
}
}
if ($stream.codec_type -eq 'video') {
return $true, "Embedded video stream in OGG (FMOD 3.x cannot handle)"
}
}
}
} else {
Remove-Item -LiteralPath $ffOutFile -Force -ErrorAction SilentlyContinue
}
}
return $false, 'Compatible'
}
catch {
return $true, "Error analyzing file: $($_.Exception.Message)"
}
}
function Sanitize-WavFile {
param([System.IO.FileInfo]$File)
$tempFile = $File.FullName + '.sanitize.tmp'
# Re-encode with ffmpeg: 16-bit PCM, 44100 Hz, stereo, strip metadata
$ffmpegExe = Find-Ffmpeg -Name 'ffmpeg'
try {
if ($ffmpegExe) {
$stderrFile = [System.IO.Path]::GetTempFileName()
$proc = Start-Process -FilePath $ffmpegExe -ArgumentList @('-y', '-i', $File.FullName, '-vn', '-c:a', 'pcm_s16le', '-ac', '2', '-ar', '44100', '-map_metadata', '-1', $tempFile) -NoNewWindow -Wait -PassThru -RedirectStandardError $stderrFile
Remove-Item -LiteralPath $stderrFile -Force -ErrorAction SilentlyContinue
if ($proc.ExitCode -ne 0) {
Write-Host " ffmpeg exited with code $($proc.ExitCode) for $($File.Name), trying alternate settings..."
}
}
} catch {
Write-Host " ffmpeg re-encode failed for $($File.Name): $($_.Exception.Message)"
}
if ((Test-Path -LiteralPath $tempFile -PathType Leaf) -and ((Get-Item -LiteralPath $tempFile).Length -gt 0)) {
Move-Item -LiteralPath $tempFile -Destination $File.FullName -Force
Write-Host " Sanitized (re-encoded to 16-bit PCM 44100Hz stereo for WoW 1.12): $($File.Name)"
return $true
} elseif (Test-Path -LiteralPath $tempFile) {
Remove-Item -LiteralPath $tempFile -Force
}
return $false
}
function Sanitize-OggFile {
param([System.IO.FileInfo]$File)
$tempFile = $File.FullName + '.sanitize.tmp'
# Re-encode with ffmpeg: Vorbis codec, quality 6 (~192kbps), 44100 Hz, stereo
$ffmpegExe = Find-Ffmpeg -Name 'ffmpeg'
try {
if ($ffmpegExe) {
$stderrFile = [System.IO.Path]::GetTempFileName()
$proc = Start-Process -FilePath $ffmpegExe -ArgumentList @('-y', '-i', $File.FullName, '-vn', '-c:a', 'libvorbis', '-q:a', '6', '-ac', '2', '-ar', '44100', '-map_metadata', '-1', $tempFile) -NoNewWindow -Wait -PassThru -RedirectStandardError $stderrFile
Remove-Item -LiteralPath $stderrFile -Force -ErrorAction SilentlyContinue
if ($proc.ExitCode -ne 0) {
Write-Host " ffmpeg exited with code $($proc.ExitCode) for $($File.Name), trying alternate settings..."
}
}
} catch {
Write-Host " ffmpeg re-encode failed for $($File.Name): $($_.Exception.Message)"
}
if ((Test-Path -LiteralPath $tempFile -PathType Leaf) -and ((Get-Item -LiteralPath $tempFile).Length -gt 0)) {
Move-Item -LiteralPath $tempFile -Destination $File.FullName -Force
Write-Host " Sanitized (re-encoded to Vorbis q6 44100Hz stereo for WoW 1.12): $($File.Name)"
return $true
} elseif (Test-Path -LiteralPath $tempFile) {
Remove-Item -LiteralPath $tempFile -Force
}
return $false
}
# Check and sanitize WAV files for WoW 1.12 compatibility
Write-Host ""
Write-Host "Scanning WAV files for WoW 1.12 compatibility..."
$wavFiles = @(Get-ChildItem -LiteralPath $Media -Recurse -File |
Where-Object { $_.Extension -match '^(?i)\.wav$' })
$wavSanitized = 0
$wavSkipped = 0
$wavCompatOk = 0
if ($wavFiles.Count -eq 0) {
Write-Host "No WAV files found in Media folder."
} else {
Write-Host "Found $($wavFiles.Count) WAV file(s) to check..."
foreach ($wav in $wavFiles) {
try {
$needsReencode, $reason = Test-WavNeedsReencode -FilePath $wav.FullName
if ($needsReencode) {
Write-Host " Issue found: $($wav.Name) - $reason"
try {
$fixed = Sanitize-WavFile -File $wav
if ($fixed) { $wavSanitized++ } else { $wavSkipped++ }
} catch {
Write-Host " WARNING: Could not sanitize $($wav.Name): $($_.Exception.Message)"
$wavSkipped++
}
} else {
$wavCompatOk++
}
} catch {
Write-Host " WARNING: Could not scan $($wav.Name): $($_.Exception.Message)"
$wavSkipped++
}
}
Write-Host ""
Write-Host " WAV Compatible: $wavCompatOk Sanitized: $wavSanitized Skipped: $wavSkipped"
}
if ($wavSanitized -gt 0) {
Write-Host ""
Write-Host "Sanitized $wavSanitized WAV file(s) for WoW 1.12 compatibility."
Write-Host "These files were re-encoded to 16-bit PCM 44100Hz stereo."
Write-Host ""
}
if ($wavSkipped -gt 0) {
Write-Host ""
Write-Host "WARNING: $wavSkipped WAV file(s) could not be sanitized (ffmpeg not available?)."
Write-Host "These tracks may not play correctly in-game. Install ffmpeg and re-run."
Write-Host ""
}
if ($wavSanitized -eq 0 -and $wavSkipped -eq 0 -and $wavFiles.Count -gt 0) {
Write-Host ""
Write-Host "All $($wavFiles.Count) WAV file(s) passed compatibility check."
Write-Host ""
}
# Check and sanitize OGG files for WoW 1.12 compatibility
Write-Host ""
Write-Host "Scanning OGG files for WoW 1.12 compatibility..."
$oggFiles = @(Get-ChildItem -LiteralPath $Media -Recurse -File |
Where-Object { $_.Extension -match '^(?i)\.ogg$' })
$oggSanitized = 0
$oggSkipped = 0
$oggCompatOk = 0
if ($oggFiles.Count -eq 0) {
Write-Host "No OGG files found in Media folder."
} else {
Write-Host "Found $($oggFiles.Count) OGG file(s) to check..."
foreach ($ogg in $oggFiles) {
try {
$needsReencode, $reason = Test-OggNeedsReencode -FilePath $ogg.FullName
if ($needsReencode) {
Write-Host " Issue found: $($ogg.Name) - $reason"
try {
$fixed = Sanitize-OggFile -File $ogg
if ($fixed) { $oggSanitized++ } else { $oggSkipped++ }
} catch {
Write-Host " WARNING: Could not sanitize $($ogg.Name): $($_.Exception.Message)"
$oggSkipped++
}
} else {
$oggCompatOk++
}
} catch {
Write-Host " WARNING: Could not scan $($ogg.Name): $($_.Exception.Message)"
$oggSkipped++
}
}
Write-Host ""
Write-Host " OGG Compatible: $oggCompatOk Sanitized: $oggSanitized Skipped: $oggSkipped"
}
if ($oggSanitized -gt 0) {
Write-Host ""
Write-Host "Sanitized $oggSanitized OGG file(s) for WoW 1.12 compatibility."
Write-Host "These files were re-encoded to Vorbis q6 44100Hz stereo."
Write-Host ""
}
if ($oggSkipped -gt 0) {
Write-Host ""
Write-Host "WARNING: $oggSkipped OGG file(s) could not be sanitized (ffmpeg not available?)."
Write-Host "These tracks may not play correctly in-game. Install ffmpeg and re-run."
Write-Host ""
}
if ($oggSanitized -eq 0 -and $oggSkipped -eq 0 -and $oggFiles.Count -gt 0) {
Write-Host ""
Write-Host "All $($oggFiles.Count) OGG file(s) passed compatibility check."
Write-Host ""
}
# -- Rename files with special characters for WoW 1.12 compatibility ----------
# WoW 1.12's FMOD engine may fail to play files whose names contain characters
# like apostrophes ('), parentheses, or other special symbols. This step
+3 -2
View File
@@ -1,3 +1,6 @@
<img src="https://cdn.discordapp.com/attachments/1510333697277300856/1523207096915460226/wwww.png?ex=6a4b44a7&is=6a49f327&hm=392e90557fee2d45b436fd72c1fe1ef975d318acdbb0fd5df799e8d06a4690d0&"/>
# Relationships Jukebox
**Relationships Jukebox** is a lightweight World of Warcraft music addon that lets you play your own local audio files in-game through a full playlist window, a compact mini player, and simple slash commands.
@@ -195,5 +198,3 @@ Install one of the following:
## Credits
Author: **Relationship**
If you package releases, consider including this README alongside the addon so users know to place tracks in `Media`, run the generator, and reload the UI.
+4 -1
View File
@@ -1,7 +1,10 @@
## Interface: 11200
## Title: Relationships Jukebox
## Notes: Simple in-game MP3/WAV player with GUI.
## Notes: Simple in-game MP3/WAV/OGG player with GUI.
## Author: Relationship
## Version: 1.1
## SavedVariables: RelationshipsJukeboxDB
## X-Website: https://github.com/Relationship-OctoWoW/RelationshipsJukeBox
## X-GitHub: https://github.com/Relationship-OctoWoW/RelationshipsJukeBox
AutoPlaylist.lua
Core.lua