local _, ns = ...

-- Patch membership and story order are deliberately curated rather than
-- inferred from MovieID. Blizzard often allocates IDs out of release order,
-- and some later client builds add alternate edits of older cinematics.
--
-- Each movie tuple is { MovieID, kind }. Kinds are presentation hints used by
-- the library's cards and description fallbacks; they never affect playback.
ns.PATCH_GROUPS = {
    classic = {
        { key = "original", name = "Original / 1.0", movies = {
            { 2, "trailer" },
        } },
    },
    burning_crusade = {
        { key = "launch", name = "Launch / 2.0", movies = {
            { 27, "trailer" },
        } },
    },
    wrath = {
        { key = "launch", name = "Launch / 3.0", movies = {
            { 18, "trailer" }, { 14, "story" },
        } },
        { key = "fall", name = "Fall of the Lich King / 3.3", movies = {
            { 16, "raid" },
        } },
    },
    cataclysm = {
        { key = "launch", name = "Launch / 4.0", movies = {
            { 23, "trailer" }, { 21, "story" }, { 22, "story" },
        } },
        { key = "hour_of_twilight", name = "Hour of Twilight / 4.3", movies = {
            { 73, "raid" }, { 74, "raid" }, { 75, "raid" }, { 76, "raid" },
        } },
    },
    mists = {
        { key = "launch", name = "Launch / 5.0", movies = {
            { 115, "trailer" }, { 119, "story" }, { 120, "story" },
            { 121, "story" }, { 116, "story" }, { 117, "story" }, { 118, "story" },
        } },
        { key = "landfall", name = "Landfall / 5.1", movies = {
            { 127, "story" }, { 128, "story" },
        } },
        { key = "siege", name = "Siege of Orgrimmar / 5.4", movies = {
            { 151, "raid" }, { 152, "raid" },
        } },
    },
    warlords = {
        { key = "launch", name = "Launch / 6.0", movies = {
            { 195, "trailer" }, { 185, "story" }, { 187, "story" },
            { 167, "story" }, { 168, "story" }, { 188, "story" }, { 177, "story" },
            { 189, "construction" }, { 190, "construction" }, { 191, "construction" },
            { 192, "construction" }, { 193, "construction" }, { 194, "construction" },
        } },
        { key = "garrisons", name = "Garrisons / 6.1", movies = {
            { 270, "story" },
        } },
        { key = "hellfire", name = "Fury of Hellfire / 6.2", movies = {
            { 292, "construction" }, { 293, "construction" },
            { 294, "story" }, { 295, "story" },
        } },
    },
    legion = {
        { key = "prelaunch", name = "Pre-launch", movies = {
            { 470, "trailer" }, { 476, "short" }, { 477, "short" }, { 478, "short" },
            { 469, "story" }, { 471, "story" },
        } },
        { key = "launch", name = "Launch / 7.0", movies = {
            { 486, "story" }, { 487, "story" }, { 488, "story" }, { 474, "story" },
            { 473, "story" }, { 472, "story" }, { 483, "story" }, { 484, "story" },
            { 475, "story" }, { 485, "story" }, { 489, "story" }, { 490, "story" },
        } },
        { key = "nighthold", name = "The Nighthold / 7.1.5", movies = {
            { 549, "raid" },
        } },
        { key = "tomb", name = "Tomb of Sargeras / 7.2", movies = {
            { 635, "trailer" }, { 636, "story" }, { 637, "story" }, { 656, "raid" },
        } },
        { key = "argus", name = "Shadows of Argus / 7.3", movies = {
            { 677, "story" }, { 679, "story" }, { 681, "story" },
            { 686, "raid" }, { 688, "raid" },
        } },
        { key = "epilogue", name = "Epilogue / 7.3.5", movies = {
            { 716, "story" }, { 717, "story" },
        } },
    },
    bfa = {
        { key = "prelaunch", name = "Pre-launch", movies = {
            { 852, "trailer" }, { 853, "short" }, { 871, "variant" },
            { 861, "short" }, { 884, "short" },
        } },
        { key = "launch", name = "Launch / 8.0", movies = {
            { 854, "story" }, { 855, "story" }, { 856, "story" },
            { 857, "story" }, { 858, "story" }, { 859, "story" },
            { 860, "story" }, { 862, "story" }, { 863, "story" },
            { 864, "story" }, { 865, "story" },
        } },
        { key = "tides", name = "Tides of Vengeance / 8.1", movies = {
            { 874, "story" }, { 876, "raid" }, { 875, "raid" },
        } },
        { key = "reunion", name = "War Campaign / 8.1.5", movies = {
            { 879, "story" },
        } },
        { key = "azshara", name = "Rise of Azshara / 8.2", movies = {
            { 883, "trailer" }, { 894, "trailer" }, { 1059, "story" },
            { 885, "story" }, { 886, "raid" },
        } },
        { key = "reckoning", name = "War Campaign Finale / 8.2.5", movies = {
            { 903, "story" }, { 904, "story" },
        } },
        { key = "nzoth", name = "Visions of N'Zoth / 8.3", movies = {
            { 928, "trailer" }, { 927, "raid" }, { 926, "raid" },
        } },
    },
    shadowlands = {
        { key = "prelaunch", name = "Pre-launch", movies = {
            { 936, "trailer" }, { 895, "story" }, { 931, "story" },
            { 932, "short" }, { 933, "short" }, { 934, "short" }, { 935, "short" },
        } },
        { key = "launch", name = "Launch / 9.0", movies = {
            { 937, "story" }, { 945, "story" }, { 946, "story" }, { 943, "story" }, { 941, "story" },
            { 944, "story" }, { 942, "story" }, { 947, "story" }, { 948, "story" },
        } },
        { key = "domination", name = "Chains of Domination / 9.1", movies = {
            { 949, "story" }, { 951, "story" }, { 950, "raid" }, { 953, "story" },
        } },
        { key = "eternity", name = "Eternity's End / 9.2", movies = {
            { 954, "story" }, { 955, "story" }, { 957, "raid" },
            { 956, "raid" }, { 958, "raid" },
        } },
    },
    dragonflight = {
        { key = "prelaunch", name = "Pre-launch", movies = {
            { 960, "trailer" }, { 966, "short" }, { 967, "short" }, { 968, "short" },
        } },
        { key = "launch", name = "Launch / 10.0", movies = {
            { 969, "story" }, { 973, "story" }, { 961, "raid" }, { 965, "story" },
            { 962, "story" }, { 963, "story" }, { 964, "raid" },
        } },
        { key = "reach", name = "Forbidden Reach / 10.0.7", movies = {
            { 974, "story" },
        } },
        { key = "embers", name = "Embers of Neltharion / 10.1", movies = {
            { 979, "story" }, { 980, "story" }, { 981, "story" },
        } },
        { key = "fractures", name = "Fractures in Time / 10.1.5", movies = {
            { 991, "story" }, { 992, "story" }, { 993, "story" },
        } },
        { key = "fury", name = "Fury Incarnate / 10.1.7", movies = {
            { 1001, "story" },
        } },
        { key = "dream", name = "Guardians of the Dream / 10.2", movies = {
            { 1002, "raid" }, { 1003, "raid" },
        } },
        { key = "epilogue", name = "Epilogue / 10.2.7", movies = {
            { 1009, "story" },
        } },
    },
    war_within = {
        { key = "prelaunch", name = "Pre-launch", movies = {
            { 1014, "trailer" }, { 1024, "recap" }, { 1053, "variant" },
        } },
        { key = "launch", name = "Launch / 11.0", movies = {
            { 1010, "story" }, { 1012, "story" }, { 1013, "story" },
            { 1019, "story" }, { 1020, "story" }, { 1021, "story" }, { 1023, "story" },
        } },
        { key = "siren_isle", name = "Siren Isle / 11.0.7", movies = {
            { 1030, "story" },
        } },
        { key = "undermine", name = "Undermine(d) / 11.1", movies = {
            { 1028, "story" }, { 1045, "raid" }, { 1029, "story" },
        } },
        { key = "karesh", name = "Ghosts of K'aresh / 11.2", movies = {
            { 1033, "raid" }, { 1034, "raid" },
        } },
        { key = "twilight", name = "The Warning / 11.2.7", movies = {
            { 1040, "story" }, { 1052, "recap" },
        } },
    },
    midnight = {
        { key = "prelaunch", name = "Pre-launch", movies = {
            { 1051, "trailer" }, { 1066, "recap" },
        } },
        { key = "launch", name = "Launch / 12.0.1", movies = {
            { 1047, "story" }, { 1048, "story" }, { 1049, "story" },
            { 1050, "story" }, { 1061, "story" }, { 1062, "story" },
        } },
        { key = "amani", name = "Legacy of the Amani / 12.0.7", movies = {
            { 1063, "story" },
        } },
        { key = "ulatek", name = "Curse of Ula'tek / 12.1", movies = {
            { 1064, "story" }, { 1065, "archive" },
        } },
    },
}

-- Concise, original summaries informed by Blizzard's story/video archive,
-- client MovieID data, and quest/raid context. They intentionally identify a
-- scene's premise without reproducing dialogue or spelling out every outcome.
ns.MOVIE_DESCRIPTION_OVERRIDES = {
    [2] = "The original World of Warcraft cinematic introduces Azeroth through the rival peoples drawn into a new age of conflict.",
    [27] = "Illidan's warning frames the return to Outland as blood elves, draenei, and old heroes answer the Burning Crusade.",
    [18] = "King Terenas' words accompany Arthas as the Lich King awakens and raises Sindragosa in Northrend.",
    [14] = "Alliance and Horde forces confront the Scourge at Angrathar, the Wrathgate, before the battle takes an unexpected turn.",
    [16] = "The final Icecrown cinematic closes the campaign against the Lich King atop the Frozen Throne.",
    [23] = "Deathwing's return tears through Azeroth and announces the world-changing destruction of the Cataclysm.",
    [21] = "Gilneas seals itself behind the Greymane Wall while a curse transforms its isolated people into worgen.",
    [22] = "Kezan's goblins flee a collapsing island under Trade Prince Gallywix's characteristically ruthless leadership.",
    [73] = "The first Dragon Soul chapter follows the assault that carries Azeroth's defenders toward Deathwing.",
    [74] = "The second Dragon Soul chapter continues the pursuit of Deathwing as the final battle draws nearer.",
    [75] = "The third Dragon Soul chapter brings the Dragon Aspects and their allies to the decisive confrontation.",
    [76] = "The Dragon Soul finale reflects on the victory over Deathwing and the future of Azeroth's dragons.",
    [115] = "A lost naval battle strands an orc and a human on Pandaria, where Chen Stormstout offers another path.",
    [116] = "The people of the Wandering Isle consider a new future after learning the truth about their wandering home.",
    [117] = "Aysa Cloudsinger and Ji Firepaw risk everything to save Shen-zin Su from the wound threatening his life.",
    [118] = "Alliance and Horde violence at the Serpent's Heart awakens a danger Pandaria had long kept buried.",
    [119] = "An Alliance expedition reaches Pandaria and begins its campaign across the newly revealed continent.",
    [120] = "A Horde expedition reaches Pandaria under orders to secure the mysterious continent for Garrosh.",
    [121] = "Hellscream's Fist crashes into Honeydew Village, abruptly bringing the Horde's war to the Jade Forest.",
    [127] = "The Alliance fleet arrives on Pandaria as the conflict between the factions enters a larger new phase.",
    [128] = "The Horde fleet arrives on Pandaria as Garrosh commits more forces to the escalating campaign.",
    [151] = "The Horde version of the Siege of Orgrimmar finale records the aftermath of Garrosh's defeat.",
    [152] = "The Alliance version of the Siege of Orgrimmar finale records the aftermath of Garrosh's defeat.",
    [195] = "Garrosh offers Grommash a vision of enslavement, inspiring the Iron Horde to reject its destined corruption.",
    [185] = "Azeroth's champions cross the altered Dark Portal and meet the Iron Horde on a Draenor that should not exist.",
    [187] = "The assault on Tanaan reaches the Dark Portal as the expedition fights to sever the Iron Horde's invasion route.",
    [167] = "Velen makes a final stand in Shadowmoon Valley to protect his people from the power of the Dark Star.",
    [168] = "The Frostwolf campaign culminates in a stand against the Iron Horde's advance through Frostfire Ridge.",
    [188] = "The defense of Talador reaches Auchindoun as Maraad confronts the cost of the Iron Horde's invasion.",
    [177] = "Thrall and Garrosh settle their long conflict in a mak'gora amid the stones of Nagrand.",
    [189] = "The Horde establishes its first permanent garrison outpost on Draenor.",
    [190] = "The Horde garrison expands from a rough foothold into a fortified base.",
    [191] = "The Horde completes the final expansion of its Draenor garrison.",
    [192] = "The Alliance establishes its first permanent garrison outpost on Draenor.",
    [193] = "The Alliance garrison expands from a rough foothold into a fortified base.",
    [194] = "The Alliance completes the final expansion of its Draenor garrison.",
    [270] = "Khadgar's legendary-ring investigation advances as Gul'dan's plans begin reshaping the war on Draenor.",
    [292] = "The Horde opens its shipyard and prepares a fleet for the campaign beyond its garrison walls.",
    [293] = "The Alliance opens its shipyard and prepares a fleet for the campaign beyond its garrison walls.",
    [294] = "Gul'dan seizes the initiative in Tanaan and turns the Iron Horde toward the Legion's fel power.",
    [295] = "The Draenor campaign ends with victory at Hellfire Citadel and Gul'dan cast toward another war.",
    [470] = "The Legion returns in force while Varian and Sylvanas lead Azeroth's fleets toward the Broken Shore.",
    [469] = "Illidan sends his demon hunters on a mission whose success demands the sacrifice at the heart of their creed.",
    [471] = "The imprisoned Illidari awaken in the Vault of the Wardens as the Legion's invasion reaches Azeroth.",
    [472] = "The Val'sharah campaign mourns Ysera and follows her spirit into the stars above the temple.",
    [473] = "Xavius ensnares Ysera with the Nightmare and turns an ancient guardian against Val'sharah.",
    [474] = "A wounded Vol'jin names a successor and entrusts the Horde to a new Warchief after the Broken Shore.",
    [475] = "Genn Greymane and Sylvanas clash over Eyir and the future Sylvanas seeks for the Forsaken.",
    [476] = "Gul'dan recounts the rejection and ambition that led him to embrace the Legion's power.",
    [477] = "Khadgar weighs Medivh's legacy and the burden of becoming Azeroth's next great guardian.",
    [478] = "An Illidari recruit remembers Illidan's preparations for a war few others believed was coming.",
    [483] = "The Alliance pursues Sylvanas into Stormheim as Greymane's Gambit becomes a personal hunt.",
    [484] = "The Horde enters Stormheim while Sylvanas quietly pursues a plan involving the val'kyr.",
    [485] = "Thalyssra recounts how Suramar survived the Sundering, raised its barrier, and fell under Legion control.",
    [486] = "Alliance and Horde forces launch their first united assault against the Legion at the Broken Shore.",
    [487] = "The Alliance's Broken Shore battle culminates in King Varian Wrynn's last stand.",
    [488] = "The Horde's Broken Shore battle follows Vol'jin's order to retreat from the Legion's trap.",
    [489] = "Khadgar delivers Light's Heart, a naaru vessel carrying a message tied to Illidan's destiny.",
    [490] = "A vision preserved by Light's Heart revisits Illidan's fall at the Black Temple.",
    [549] = "The Nighthold's closing scene reveals the fate of Gul'dan and the next stage of the war with the Legion.",
    [635] = "The Tomb of Sargeras trailer calls Azeroth's armies back to the Broken Shore to carry the war to the Legion.",
    [636] = "Anduin follows his father's compass to the Broken Shore and finds a path forward through Varian's memory.",
    [637] = "The campaign breaches the Tomb of Sargeras, opening the way to the Legion stronghold within.",
    [656] = "The Tomb of Sargeras finale turns a hard-won victory into an unexpected journey toward Argus.",
    [677] = "Velen and Azeroth's champions arrive on Argus to begin the final campaign against the Burning Legion.",
    [679] = "Xe'ra offers Illidan a prophesied transformation, but he refuses a destiny chosen by the Light.",
    [681] = "Alleria embraces the Void within the Seat of the Triumvirate and emerges forever changed.",
    [686] = "The path through Antorus reaches Argus the Unmaker, the tortured world-soul at the Legion's heart.",
    [688] = "The Antorus finale closes the campaign against the Burning Legion and leaves a lasting mark on Azeroth's sky.",
    [716] = "Alliance leaders look from the Legion's defeat toward the wound now threatening Azeroth.",
    [717] = "Horde leaders look from the Legion's defeat toward the struggle beginning around Azeroth's wound.",
    [852] = "Anduin and Sylvanas lead their armies into a battle that declares open war between Alliance and Horde.",
    [853] = "Sylvanas remembers the fall of Quel'Thalas as war returns to the shores of Kalimdor.",
    [854] = "Alliance champions confront Sylvanas in Lordaeron's throne room as the siege reaches its final standoff.",
    [855] = "Horde champions join Sylvanas in Lordaeron's throne room as the siege reaches its final standoff.",
    [856] = "Jaina's arrival turns the Battle for Lordaeron and gives the Alliance a way through the city's defenses.",
    [857] = "The Horde delegation reaches Zandalar and appeals to King Rastakhan for a vital new alliance.",
    [858] = "The Alliance's pursuit of the Horde carries its fleet to the dangerous waters around Zandalar.",
    [859] = "Jaina returns to Kul Tiras with the Alliance delegation and faces the homeland she left behind.",
    [860] = "Jaina relives the guilt surrounding her father Daelin and the choices that estranged her from Kul Tiras.",
    [861] = "Jaina Proudmoore looks back on the choices that separated her from Kul Tiras and her family.",
    [862] = "King Rastakhan bargains with Bwonsamdi for the power to save Zandalar, accepting a lasting price.",
    [863] = "A threat within Zandalar emerges as the royal family confronts betrayal close to the throne.",
    [864] = "Kul Tiras finds renewed hope as Jaina's family and nation reconsider the legacy that divided them.",
    [865] = "Jaina crosses a realm of torment shaped by memory, blame, and the shadow of Gorak Tul.",
    [871] = "A shorter edit of Sylvanas' Warbringers chapter recalls the fall of Quel'Thalas and the road to war.",
    [874] = "Tyrande invokes the Night Warrior to answer the burning of Teldrassil and retake Darkshore.",
    [884] = "Queen Azshara recounts the bargain that transformed her people after the Sundering.",
    [875] = "The Battle of Dazar'alor reaches King Rastakhan as the Alliance assault enters the royal pyramid.",
    [876] = "Alliance and Horde forces prepare for the Battle of Dazar'alor from opposite sides of the coming siege.",
    [879] = "Jaina receives an unexpected reunion when Baine chooses compassion over Sylvanas' orders.",
    [883] = "The Alliance version of the Rise of Azshara trailer follows the fleet into Nazjatar and an ancient trap.",
    [885] = "Baine faces a choice at the crossroads as dissent inside the Horde can no longer remain hidden.",
    [886] = "The Eternal Palace finale reveals the consequence of confronting Azshara in N'Zoth's prison.",
    [894] = "The Horde version of the Rise of Azshara trailer follows the fleet into Nazjatar and an ancient trap.",
    [903] = "Alliance and Horde representatives attempt negotiations while Sylvanas' war drives both factions toward a reckoning.",
    [904] = "The War Campaign reaches its reckoning as Horde and Alliance leaders face the cost of the Fourth War.",
    [926] = "The Ny'alotha finale closes the campaign against N'Zoth and the visions of the Black Empire.",
    [927] = "Wrathion joins the final assault inside Ny'alotha as the champions close in on N'Zoth.",
    [928] = "Wrathion returns to warn Azeroth's leaders that N'Zoth's visions can turn certainty into a weapon.",
    [936] = "Sylvanas confronts Bolvar atop Icecrown and shatters the boundary between Azeroth and the realms of Death.",
    [895] = "An Alliance expedition ship is lost near Exile's Reach, beginning a rescue on the unfamiliar island.",
    [931] = "A Horde expedition ship is lost near Exile's Reach, beginning a rescue on the unfamiliar island.",
    [932] = "The Bastion chapter of Afterlives follows a soul's arrival among the kyrian and the memories he carries.",
    [933] = "The Revendreth chapter of Afterlives introduces Sire Denathrius and his realm's anima crisis.",
    [934] = "The Maldraxxus chapter of Afterlives follows Draka as she finds a new purpose among the necrolords.",
    [935] = "The Ardenweald chapter of Afterlives follows the difficult choices made to preserve the realm's groves.",
    [937] = "The Jailer's forces abduct Azeroth's leaders, drawing the factions toward Icecrown and the shattered veil.",
    [941] = "The Winter Queen offers Ysera new life in Ardenweald, binding the dragon's fate to her realm.",
    [942] = "Tyrande carries the memory of Teldrassil into the Shadowlands while the Night Warrior's power grows.",
    [943] = "Azeroth's champions cross beyond the veil and enter the divided realms of the Shadowlands.",
    [944] = "Sire Denathrius reminds Prince Renathal of the lesson behind his exile and Revendreth's rebellion.",
    [945] = "A mysterious force strikes the Arbiter, disrupting the judgment of souls and feeding them into the Maw.",
    [946] = "The kidnapped faction leaders awaken in the Maw and search for a way out of the Jailer's realm.",
    [947] = "Anduin challenges Sylvanas to confront the truth behind the choices that brought them to the Jailer.",
    [948] = "Sylvanas faces a defining choice as the Jailer's plan advances beyond the Maw.",
    [949] = "Anduin is bound to Kingsmourne as the Jailer turns a champion of the Light into his instrument.",
    [950] = "The Sanctum of Domination finale follows the confrontation with Sylvanas at the heart of Torghast.",
    [951] = "The Night Fae defend Ardenweald as Sylvanas and Tyrande bring their long pursuit to a confrontation.",
    [953] = "Uther helps a divided Sylvanas confront the memories and choices bound to her shattered soul.",
    [954] = "Pelagos accepts a new purpose in Oribos and restores judgment to the flow of mortal souls.",
    [955] = "Sylvanas faces judgment for her actions and the long task required to answer for them.",
    [956] = "The battle with Anduin reaches the person still trapped beneath the Jailer's domination.",
    [957] = "The Jailer enters the Sepulcher of the First Ones to begin the final stage of his design.",
    [958] = "The Sepulcher finale closes the campaign against the Jailer and turns attention back toward Azeroth.",
    [960] = "Koranos climbs Tyrhold to relight the beacon and call the dragonflights home to the Dragon Isles.",
    [961] = "Raszageth escapes her ancient prison as the dracthyr awaken to a world transformed by time.",
    [962] = "The Primalists unleash a tempest that carries the conflict with the Incarnates across the Dragon Isles.",
    [963] = "A precious seed offers hope for renewal after the losses carried from Teldrassil and Ardenweald.",
    [964] = "Raszageth's defeat at the Vault opens the way for the remaining Primal Incarnates.",
    [965] = "Raszageth confronts Alexstrasza over the Titans' legacy and the future claimed for dragonkind.",
    [966] = "The first Legacies chapter begins Nozdormu's account of the Dragon Aspects and their ancient oaths.",
    [967] = "The second Legacies chapter continues the history of Neltharion and the choices that divided dragonkind.",
    [968] = "The final Legacies chapter connects the dragons' past to the return of the Dragon Isles.",
    [969] = "A dracthyr dream recalls Neltharion's command and the moment their long stasis began.",
    [973] = "The dragonflights return to their ancestral isles as Azeroth's champions take to the skies beside them.",
    [974] = "Emberthal returns to the Forbidden Reach and finds Sarkareth pursuing Neltharion's hidden legacy.",
    [979] = "The Incarnates force open a path beneath the Dragon Isles, revealing Zaralek Cavern and Aberrus.",
    [980] = "Emberthal and Ebyssian offer the dracthyr a future not dictated by Neltharion's forgotten experiments.",
    [981] = "Fyrakk brings shadowflame to Loamm, turning the conflict beneath the Dragon Isles against the niffen.",
    [991] = "Chromie follows the Infinite dragonflight through time while Iridikron moves toward Galakrond's legacy.",
    [992] = "The Dawn of the Infinite finale reveals Iridikron's prize and the larger bargain behind his escape.",
    [993] = "Nozdormu and Chromie reflect on the timelines they preserved and the future still shadowed by Murozond.",
    [1001] = "Fyrakk embraces deeper shadowflame while Vyranoth begins to question the war being waged in their name.",
    [1002] = "Fyrakk carries his crown of flame into the Emerald Dream and turns his hunger toward Amirdrassil.",
    [1003] = "The Amirdrassil finale celebrates the new world tree and the bonds formed in its defense.",
    [1009] = "Vyranoth meets Iridikron to challenge his alliance with the Harbinger and his plans beyond the Dragon Isles.",
    [1010] = "Khadgar brings Dalaran to Khaz Algar as Azeroth's champions follow the Radiant Song beneath the surface.",
    [1012] = "The War Within's opening campaign reaches a turning point when Dalaran comes under attack.",
    [1013] = "Magni answers Azeroth's call during the opening journey to Khaz Algar.",
    [1014] = "Thrall finds Anduin in Silithus and calls him home as visions warn of a threat within Azeroth.",
    [1019] = "Alleria confronts Xal'atath and discovers how easily the Harbinger can turn determination into doubt.",
    [1020] = "The Earthen story reaches its finale as the peoples of Khaz Algar consider a shared future.",
    [1021] = "The story of Queen Ansurek reveals how ambition and Xal'atath's influence shaped the ruler she became.",
    [1023] = "The shadows beneath Khaz Algar gather around Xal'atath's plans and the conflict consuming the nerubians.",
    [1024] = "A concise recap follows the heroes, rivalries, and warnings that lead into The War Within.",
    [1028] = "The Undermine campaign opens in a boardroom where goblin rivalries set the next conflict in motion.",
    [1029] = "The Undermine epilogue considers what comes next for the goblins after Gallywix's final gamble.",
    [1030] = "Orweyna receives a worldsoul vision linking the roots below Khaz Algar to the danger approaching Azeroth.",
    [1033] = "The Shadowguard attempts to summon Dimensius through Manaforge Omega and consume what remains of K'aresh.",
    [1034] = "The Manaforge Omega finale resolves the raid's battle over K'aresh and the threat beyond it.",
    [1040] = "A vast voidstorm breaks loose as The War Within turns toward the opening conflict of Midnight.",
    [1045] = "The Undermine raid's closing scene brings Xal'atath face to face with Gallywix.",
    [1052] = "A cinematic recap gathers the major events of The War Within before the Worldsoul Saga continues.",
    [1053] = "An alternate edit of The War Within cinematic revisits Anduin, Thrall, and Azeroth's warning.",
    [1047] = "Turalyon strikes down Arator during a crisis that tests the family's faith in the Light.",
    [1048] = "The Midnight campaign arrives at the Sunwell as Quel'Thalas prepares to face the gathering Void.",
    [1049] = "The Fall marks a major reversal as Xal'atath's offensive reaches the defenders of Quel'Thalas.",
    [1050] = "The united elven armies reach the climax of their march on Quel'Danas and the threatened Sunwell.",
    [1051] = "Xal'atath's Void invasion descends on Quel'Thalas as Azeroth's defenders rally around the Sunwell.",
    [1059] = "Varok Saurfang travels to Nagrand to seek Thrall's help in securing a future for the Horde.",
    [1061] = "Xal'atath unites the Void's warring powers and turns their hunger toward Azeroth's worldsoul.",
    [1062] = "Xal'atath tests Arator's convictions as his path through Midnight brings Light and Void into conflict.",
    [1063] = "An Amani history lesson remembers the empire's legacy and the power carried by its descendants.",
    [1064] = "The story of Ula'tek reveals the ancient power behind the curse threatening the Amani.",
    [1065] = "After Ula'tek falls in the Venomous Abyss, the Amani reckon with the cost of victory and Zul'jan's fate.",
    [1066] = "A story recap traces the people, losses, and rivalries leading into the battle for Quel'Thalas.",
}

-- This scene belongs to the Undermine story chronologically even though its
-- current client asset arrived with a later content build.
ns.MOVIE_SOURCE_PATCHES = {
    [1045] = "11.2.7",
    [1059] = "12.0.7",
}
