Wikipedia testwiki https://test.wikipedia.org/wiki/Main_Page MediaWiki 1.46.0-wmf.24 first-letter Media Special Talk User User talk Wikipedia Wikipedia talk File File talk MediaWiki MediaWiki talk Template Template talk Help Help talk Category Category talk Thread Thread talk Summary Summary talk Test namespace 1 Test namespace 1 talk Test namespace 2 Test namespace 2 talk Draft Draft talk Campaign Campaign talk TimedText TimedText talk Module Module talk SecurePoll SecurePoll talk CNBanner CNBanner talk Translations Translations talk Event Event talk Topic Newsletter Newsletter talk Stankonia 0 65734 739167 596913 2026-04-22T22:04:20Z ~2026-24723-94 73667 739167 wikitext text/x-wiki {{Use mdy dates|date=November 2025}} {{Infobox album | name = Stankonia | type = studio | artist = [[Outkast]] | cover = OutKast - Stankonia.JPG | border = yes | alt = | released = October 31, 2000 | recorded = 1999–2000 | studio = * Stankonia Recording Tree Sound Studios, [[Atlanta]] * A&M Studios, [[Los Angeles]] | genre = {{hlist|[[Southern hip-hop]]|[[progressive rap]]|[[funk]]|[[psychedelic rap]]}} | length = 73:07 | label = {{hlist|[[LaFace]]|[[Arista Records|Arista]]}} | producer = {{hlist|[[Earthtone III]]|[[Organized Noize]]|[[Carl Mo]]}} | prev_title = [[Aquemini]] | prev_year = 1998 | next_title = [[Big Boi and Dre Present... Outkast]] | next_year = 2001 | misc = {{Singles | name = Stankonia | type = studio | single1 = [[B.O.B (song)|B.O.B]] | single1date = September 19, 2000 | single2 = [[Ms. Jackson]] | single2date = October 24, 2000 | single3 = [[So Fresh, So Clean]] | single3date = March 13, 2001 }} }} '''''Stankonia''''' is the fourth studio album by the American [[hip hop]] duo [[Outkast]], released on October 31, 2000, by [[LaFace Records]] and [[Arista Records]]. The album was recorded in the duo's recently purchased Atlanta recording facility, Stankonia Studios, which allowed for fewer time and recording constraints, and featured production work from [[Earthtone III]] (a production team consisting of Outkast and [[Mr. DJ]]) and longtime collaborators [[Organized Noize]]. For the follow-up to their 1998 album ''[[Aquemini]]'', the duo worked to create an expansive and experimental musical aesthetic, incorporating a diverse array of styles including [[funk]], [[Rave|rave music]], [[Psychedelic music|psychedelia]], [[Gospel music|gospel]], and [[Rock music|rock]] within a [[Southern hip-hop|Dirty South]]-oriented hip-hop context.<ref>{{cite web |url=http://www.allmusic.com/album/speakerboxxx-the-love-below-mw0000226528 |title=Speakerboxxx/The Love Below - OutKast |work=[[AllMusic]] |access-date=July 1, 2015 |author=Erlewine, Stephen Thomas |author-link=Stephen Thomas Erlewine}}</ref> During the recording sessions, [[André 3000]] began moving beyond traditional rapping in favor of a more melodic vocal style, an approach to which [[Big Boi]] and several other producers were initially unaccustomed. Lyrically, the duo touched upon a wide range of subject matters, including sexuality, politics, misogyny, African-American culture, parenthood, and introspection. ''Stankonia'' featured appearances from a variety of local musicians discovered by the group while they were visiting clubs in their native city of [[Atlanta]], [[Georgia (U.S. state)|Georgia]]. ''Stankonia'' received universal acclaim from music critics upon its release and has since been regarded by many to be one of the greatest hip hop albums of all time. The album debuted at number two on the [[Billboard 200|''Billboard'' 200]] chart, selling over 530,000 copies in its first week. It was supported by three [[Single (music)|single]]s: "[[B.O.B (song)|B.O.B]]", "[[Ms. Jackson]]", and "[[So Fresh, So Clean]]"; "Ms. Jackson" became the group's first single to reach number one on the [[Billboard Hot 100|''Billboard'' Hot 100]]. At the [[44th Annual Grammy Awards]], Outkast won [[Best Rap Album]] for ''Stankonia'' and [[Best Rap Performance by a Duo or Group]] for "Ms. Jackson". In 2003, the album was ranked number 359 on ''[[Rolling Stone]]''<nowiki/>'s list of the "[[Rolling Stone's 500 Greatest Albums of All Time|500 Greatest Albums of All Time]]", 361 in a 2012 revision, and 64 in a 2020 reboot of the list.<ref>{{cite magazine |url=https://www.rollingstone.com/music/music-lists/500-greatest-albums-of-all-time-156826/outkast-stankonia-59408/ |year=2012 |title=500 Greatest Albums of All Time Rolling Stone's definitive list of the 500 greatest albums of all time |magazine=[[Rolling Stone]] |access-date=September 9, 2019}}</ref> A re-issue of the album for its twentieth anniversary with previously unreleased remixes was released on October 30, 2020.<ref>{{cite web |url=https://pitchfork.com/news/outkast-announce-20th-anniversary-stankonia-reissue/ |year=2020 |title=OutKast Announce 20th Anniversary Stankonia Reissue |work=[[Pitchfork (website)|Pitchfork]] |access-date=October 8, 2020}}</ref> Another re-issue for the twenty-fifth anniversary was released on October 31, 2025.<ref>{{Cite web |last=Pilley |first=Max |date=September 21, 2025 |title=OutKast announce 25th anniversary deluxe reissue of 'Stankonia' |url=https://www.nme.com/news/music/outkast-announce-25th-anniversary-deluxe-reissue-of-stankonia-3894119 |access-date=September 22, 2025 |website=NME |language=en-GB}}</ref> ==Background== [[File:Flag of Stankonia.svg|thumb|left|The flag that is featured on the album cover of ''Stankonia'']] In 1998, OutKast released their third album ''[[Aquemini]]'' to critical acclaim while diversifying and expanding their sound. The album's success also attracted national attention to the [[Southern hip hop]] scene.<ref name="Westhoff112">Westhoff, 2011. p. 112</ref> Having collaborated on the ''Aquemini'' track "[[Skew It on the Bar-B]]", the [[Wu-Tang Clan]] member [[Raekwon]] later recalled the duo's impact at the time: "Before that, the South just wasn't played in New York. But that song was hot, the flows was crazy. The cycle changed. It really opened up the door for Southern rappers."<ref name="Westhoff112"/> In March 1998, OutKast purchased a studio near Northside Drive in [[Atlanta]]. Formerly owned by the [[contemporary R&B|R&B]] singer [[Bobby Brown]],<ref name="Steps">{{cite news |title=Steps to success OutKast's hard work and careful cultivation of an audience have led to unprecedented Grammy nominations |work=[[The Atlanta Journal-Constitution]] |date=February 26, 2002}}</ref> the studio was the first place the duo had ever recorded vocals together – on a remix of [[TLC (group)|TLC]]'s "[[What About Your Friends]]" (1992) – and held sentimental value for them.<ref name="Sentimental">{{cite web |url=https://books.google.com/books?id=7icEAAAAMBAJ&q=stankonia&pg=PA142 |title=Sentimental Journey |last=Bry |first=David |work=Vibe |publisher=Bob Guccione Jr. |date=December 2000 |access-date=July 8, 2012}} [https://archive.org/details/bub_gb_7icEAAAAMBAJ/page/n159/mode/2up Alt URL]</ref> Outkast named the studio "Stankonia", a word created by André 3000 as a [[portmanteau]] of the words "stank" (a slang synonym for "funky") and "Plutonia" (the title of a poster in his bedroom depicting a futuristic city).<ref name="Steps"/> As he explained, "Stankonia is this place I imagined where you can open yourself up and be free to express anything".<ref name="Poet/Playa">{{cite news |title=The poet and the playa: OutKast makes sweet music |last=Murray |first=Sonia |date=October 30, 2000 |work=[[The Atlanta Journal-Constitution]]}}</ref> ==Recording== The recording of ''Stankonia'' began in the spring of 1999 and lasted for about a year.<ref name="Steps"/> Owning a studio helped the group expand creatively, as the duo did not need to worry about time constraints that would occur with a rented studio.<ref name="Sentimental"/> André 3000 observed, "You can sit there and fuck with just a kick and a snare all day long if you want to&nbsp;... You're not working on the clock. Really, you're just working on your mind."<ref name="Sentimental"/> Big Boi spent the majority of the recording time in the studio, while André 3000 worked at home, creating beats and experimenting with an [[acoustic guitar]].<ref name="Steps"/> One song that came from a jam session on the guitar was "[[Ms. Jackson]]", the album's second single.<ref name="Steps"/> André 3000 also created song lyrics by writing words on the walls of his home: "I had planned to paint my house anyway; writing on the walls was just something I would do."<ref name="100greatest">{{cite web |url=https://books.google.com/books?id=p6-UYTO7l1MC&q=stankonia+gasoline+dreams&pg=PA78 |title=100 Greatest Albums, 1985-now: Stankonia |work=Spin |publisher=Bob Guccione, Jr. |date=July 2005 |access-date=July 8, 2012}}</ref> One stray lyric on his wall eventually developed into "Gasoline Dreams".<ref name="100greatest"/> Much of the album was formulated during "vibe sessions" in which the group and producers would visit clubs in downtown Atlanta, select performers they saw, and invite them to the studio.<ref name="Mojo">{{cite book |url=https://books.google.com/books?id=AVQbF9lTBwgC&q=stankonia&pg=PA681 |title=Outkast - Stankonia |work=The Mojo Collection: 4th Edition |isbn=9781847676436 |access-date=July 8, 2012 |last1=Magazine |first1=Various Mojo |date=November 2007 |publisher=Canongate Books}}</ref> They would then "sit around, smoke a few, drink a few", and create ideas for new songs.<ref name="Mojo"/> However, recording sessions became difficult as André 3000 grew tired of rapping on songs, which made Big Boi and the producers uneasy about how the music would sound.<ref name="Steps"/> To maintain musical cohesion with Big Boi while continuing to expand his vocal palette, André decided to combine rapping with [[Soul music|soul]]-inspired crooning, which had a major influence on ''Stankonia'''s sound.<ref name="Steps"/> "Snappin & Trappin'" features a guest appearance from the then-unknown rapper [[Killer Mike]]. The rapper noted that while working with Outkast, he used the opportunity to try to "compete" with the duo to improve his rapping skills.<ref name="killermike">{{cite web |url=https://books.google.com/books?id=vyYEAAAAMBAJ&q=outkast+stankonia+snappin&pg=PA61 |title=Killer Mike: By the Book |last=Hsu |first=Hua |work=[[Vibe (magazine)|Vibe]] |publisher=Vibe Media Group |date=January 2003 |access-date=July 10, 2012}}{{Dead link|date=June 2024 |bot=InternetArchiveBot |fix-attempted=yes }}</ref> Big Boi was impressed with Killer Mike's abilities, noting, "When I first heard him spit, his voice was just so commanding. He's a very intelligent guy."<ref name="killermike"/> ==Composition== ===Music and style=== {{Listen|pos = right |filename = Outkast-bob.ogg |title = "B.O.B. (Bombs Over Baghdad)" |description = The song "B.O.B. (Bombs Over Baghdad)" contains elements of [[drum and bass]] music in addition to combining guitars, organs, and gospel vocals. André 3000 and Big Boi's raps keep pace with the quick tempo of the track. }} While OutKast's previous albums were considered to be laid-back, mellow efforts, ''Stankonia'' contains faster, more high-energy tempos, partially to reflect the "chaotic times" at the end of the 20th century.<ref name="Braves">{{cite web |url=https://books.google.com/books?id=5CoEAAAAMBAJ&q=atliens&pg=PA44 |title=Atlanta's Braves |last=Caramanica |first=Jon |work=CMJ New Music Monthly |date=November 2000 |access-date=July 8, 2012}}</ref> The group took note of new, harder drugs hitting the hip-hop scene and teenagers using [[ecstasy (drug)|ecstasy]], [[cocaine]], and [[methamphetamine]].<ref name="Braves"/> Big Boi reflected, "Niggas living this life at a fast speed don't know what's going on around them. If you live fast, you gonna come out of here real fast, so the music need to show that."<ref name="Braves"/> While recording ''Stankonia'', the band refrained from listening to hip-hop, "That music was starting to sound real comfortable. There wasn't any adventure to it."<ref name="Moon569">Moon, 2008. p. 569</ref> Instead, the duo drew influence from musicians such as [[Jimi Hendrix]], [[Little Richard]], [[Prince (musician)|Prince]], and [[George Clinton (funk musician)|George Clinton]],<ref name="mic"/> as well as Clinton's [[Parliament-Funkadelic]] collective.<ref name="Pareles"/> However, the band refrained from producing a [[Retro style|throwback]] sound with the record and instead hoped to utilize these influences in a modern, experimental fashion.<ref name="Electric">{{cite web |url=https://books.google.com/books?id=yCUEAAAAMBAJ&q=stankonia+platinum&pg=PA88 |title=Electric Warriors |work=[[Vibe (magazine)|Vibe]] |date=February 2002 |access-date=July 10, 2012}}{{Dead link|date=June 2024 |bot=InternetArchiveBot |fix-attempted=yes }}</ref> André 3000 stated that "I don't want this to be the generation that went back to '70s rock. You gotta take it and do new things with it."<ref name="mic"/> On ''Stankonia'', OutKast experimented with a wide variety of musical genres. According to M. Matos of ''[[Vibe (magazine)|Vibe]]'', ''Stankonia'' "turned the South's predominantly reclined hip-hop sound into something freaky and menacing."<ref name="100greatest"/> [[AllMusic]]'s Steve Huey said their experimentation resulted in "a trippy sort of [[techno]]-[[psychedelic funk]]".<ref name="Allmusicrev"/> "B.O.B" features "jittery [[drum'n'bass]] rhythms" and has been classified as a "stylistic tour de force" combining "[[Jimi Hendrix|Hendrix]]-ian" guitars, organs, and [[Gospel music|gospel]] vocals.<ref name="Wang133">Wang, 2003. p. 133</ref><ref name="Allmusicrev">{{cite web |url=http://www.allmusic.com/album/stankonia-mw0000252371 |title=Stankonia - Outkast - Review |last=Huey |first=Steve |work=[[AllMusic]] |access-date=July 8, 2012}}</ref> On the track, André 3000 and Big Boi employ a "frantic" flow to keep pace with the song's high-speed tempo, which runs at 155 beats per minute.<ref name="thedish">{{cite web |url=https://books.google.com/books?id=yicEAAAAMBAJ&q=outkast+frantic&pg=PA172 |title=The dish on the latest cuts: Outkast's "B.O.B" |last=Kim |first=Hyun |work=[[Vice (magazine)|Vibe]] |date=October 2000 |access-date=July 9, 2012}}{{Dead link|date=June 2024 |bot=InternetArchiveBot |fix-attempted=yes }}</ref><ref name="Hess465">Hess, 2007. p. 465</ref> "Humble Mumble" is a [[Salsa music|salsa]]-influenced track that evolves into a club groove, while "Ms. Jackson" "marries early Prince with late [[P-Funk]]".<ref name="Braves"/><ref name="Mold">{{cite magazine |url=https://books.google.com/books?id=0RAEAAAAMBAJ&q=stankonia+humble+mumble&pg=PA38 |title=Outkast Breaks Hip-Hop Mold |last=Kenon |first=Marci |magazine=[[Billboard (magazine)|Billboard]] |date=September 23, 2000 |access-date=July 8, 2012}}</ref> The smooth melodies of "I'll Call B4 I Cum" have also been likened to [[Prince (musician)|Prince]].<ref name="Sentimental"/><ref name="RSguide">Brackett, Nathan. Hoard, Christian. p. 610</ref> "Gasoline Dreams" has been classified as a "gritty rock scorcher" comparable to the work of [[Public Enemy]].<ref name="Crazy Horse183">Crazy Horse, p. 183</ref> David Bry of ''Vibe'' detected a "polished 80's pimp strut" in "So Fresh, So Clean" and an "appreciative, fat-ass bounce" in "We Luv Deez Hoes".<ref name="Best Group">{{cite web |url=https://books.google.com/books?id=xiUEAAAAMBAJ&q=stankonia+we+luv&pg=PA76 |title=Best Group: Outkast |last=Bry |first=David |work=[[Vibe (magazine)|Vibe]] |date=January 2002 |access-date=July 8, 2012}}{{Dead link|date=June 2024 |bot=InternetArchiveBot |fix-attempted=yes }}</ref> The album ends with three [[Psychedelic music|psychedelic]]-influenced tracks, "Toilet Tisha", "Slum Beautiful", and "Stankonia (Stank Love)".<ref name="Best Group"/> "Stankonia (Stank Love)" has also been described as an "homage of sorts" to gospel choirs and '60s [[doo-wop]] groups, while also including a slowed down coda reminiscent of [[Chopped and screwed|chopped and screwed hip hop]].<ref name="Brev">{{cite magazine |url=https://archive.org/details/bub_gb_uRAEAAAAMBAJ |page=[https://archive.org/details/bub_gb_uRAEAAAAMBAJ/page/n26 25] |quote=stankonia humble mumble. |title=Stankonia - Review |magazine=[[Billboard (magazine)|Billboard]] |date=November 4, 2000 |access-date=July 8, 2012}}</ref> ===Lyrics=== {{quote box|quoted = 1|quote=I think what's really interesting about this album is that it is absolutely [[Southern hip-hop]], but there is a part that is very conscious of the world around them. You're seeing these dichotomies play out, the sort of balance between mainstream hip-hop and the [[conscious hip-hop]] era. We have to remember that, at this particular time, those two genres are starting to branch off. And the thing is, ''Stankonia'' encompasses all that.|source=— Christina Lee, ''[[NPR Music]]''<ref>{{cite web |last1=Bradley |first1=Regina |last2=Lee |first2=Christina |last3=Godfrey |first3=Gavin |date=November 18, 2020 |url=https://www.npr.org/2020/11/18/934594401/outkast-stankonia-threw-us-to-the-wilderness |title=OutKast's 'Stankonia' Threw Us to the Wilderness |website=[[NPR Music]] |access-date=July 17, 2021}}</ref>|align=right|width=25em|style=padding:8px;|border=1px}} According to [[Miles Marshall Lewis]], ''Stankonia'' is among the most "eclectic" of mainstream [[progressive rap]] albums from its time.<ref name="lewis">{{cite news |last=Lewis |first=Miles Marshall |authorlink=Miles Marshall Lewis |date=August 9, 2007 |url=https://www.dallasobserver.com/music/common-6375880 |title=Common |newspaper=[[Dallas Observer]] |access-date=July 14, 2021}}</ref> [[Paul Lester]] of ''[[The Guardian]]'' described OutKast's lyrical style on the album by saying, "They are, in a way, post-hip-hop, combining [[PM Dawn]]'s kooky confections with the [[Pharcyde]]'s hallucinatory whimsy, [[Public Enemy]]'s hardline politicking with [[De La Soul]]'s cartoon dementia, to fashion something vital and new."<ref name="Rhyme">{{cite web |title=Partners in Rhyme: Outkast |last=Lester |first=Paul |author-link=Paul Lester |work=[[The Guardian]] |date=May 18, 2001 |url=https://www.rocksbackpages.com/Library/Article/partners-in-rhyme-outkast |url-access=subscription}} Hosted by rocksbackpages.com.</ref> "Gasoline Dreams" assails the "[[bling-bling]]" aspirations of contemporary black culture, instead presenting a sobering view of circumstances upending the world in Outkast's perspective ("I hear that Mother Nature's now on birth control / The coldest pimp be lookin' for somebody to hold").<ref name="Sarig"/> "Red Velvet" discusses the materialistic nature of the hip hop scene in particular,<ref name="Rhyme"/> while "Humble Mumble" addresses critics who make negative assumptions about hip hop based on preconceived notions; André 3000 raps in the song: "I met a critic / I made her shit her draws / She said she thought hip hop was only guns and alcohol / I said oh hell naw / but yet it's that too / You can't discrima-hate cause you done read a book or two."<ref name="Boyd59">Boyd, 2003. p. 59</ref> The album commonly features the words "stank" and "smell" in their [[blues]]-rooted definition to mean "low-down, blunt, pungent: a measure of authenticity".<ref name="Tucker"/> Outkast often incorporates [[word play]] into the lyrics, including "Humble Mumble"{{'}}s references to the "[[Underground Railroad|underground smellroad]]" and chants of "I stank I can, I stank I can", an allusion to ''[[The Little Engine That Could]]''.<ref name="Tucker"/> The duo offers encouragement for maturity and facing adversity on the song, beginning with Big Boi's verse advising that "everything in life don't always happen like it's supposed to" while referencing [[Isaiah 54]]:17 ("No weapon formed against me prospers"). Meanwhile, André 3000 frames his perspective in the context of progressing African Americans collectively: "The game changes every day, so obsolete is the fist and marches / Speeches only reaches those who already know about it". [[Erykah Badu]], his ex-girlfriend and friend at the time, concludes "Humble Mumble" with a "soaring [[metaphysical]] gospel verse that celebrate[s] the circle of life", as pop-culture writer Roni Sarig details.<ref name="Sarig">{{cite book |page=186 |last=Sarig |first=Roni |year=2007 |title=Third Coast: Outkast, Timbaland, and How Hip-hop Became a Southern Thing |publisher=[[Hachette Books]] |isbn=9780306814303}}</ref> Much of the album discusses the status of women in the South, and contrasts with the [[Misogyny in rap music|misogynistic attitudes common in hip hop music]]. In the book ''Classic Material: The Hip-Hop Album Guide'', contributing author Tony Green writes that songs such as "Slum Beautiful" and "Toilet Tisha" "reimagine 'round the way girls, not only as just more than one-dimensional accessories, but as objects of affection with lives and concerns that are worth exploring."<ref name="Wang133"/> In "Toilet Tisha", the duo empathizes with suicidal pregnant teenagers.<ref name="Rhyme"/> "Ms. Jackson" is dedicated to the mother of a mother of an out-of-wedlock child, which André 3000 refers to as "the baby's mama's mamas".<ref name="Sentimental"/><ref name="Allmusicrev"/> Inspired by his relationship with Badu, who had given birth to their son Seven, the song serves as an apology to a "baby mama"'s mother for causing her daughter pain.<ref name="Screen">{{cite web |url=https://books.google.com/books?id=-CcEAAAAMBAJ&q=ms.+jackson+erykah+badu&pg=PA164 |title=Talk Video: Ms. Jackson |last=Johnson Jr. |first=Billy |work=Vibe |publisher=Vibe Media Group |date=November 2000 |access-date=July 8, 2012}}{{Dead link|date=June 2024 |bot=InternetArchiveBot |fix-attempted=yes }}</ref> "I'll Call Before I Come" discusses the members putting a woman's sexual needs before their own.<ref name="iceage"/> ==Commercial performance== [[File:OutKast 2001.jpg|thumb|upright|left|Outkast performing in promotion of ''Stankonia'' at the [[Area Festival]] in 2001]] ''Stankonia'' debuted at number two on the [[Billboard 200|''Billboard'' 200]] album chart, selling 525,844 copies in its first week,<ref>{{cite web |url=http://www.canoe.com/MusicArtistsU2/nov8_u2-can.html |archive-url=https://web.archive.org/web/20041028043516/http://www.canoe.com/MusicArtistsU2/nov8_u2-can.html |url-status=dead |archive-date=October 28, 2004 |title=U2 debuts at #1 in Canada |date=November 8, 2000 |access-date=April 18, 2020}}</ref> behind [[Jay-Z]]'s ''[[The Dynasty: Roc La Familia]]''; which sold 557,789 copies, and ahead of [[U2]]'s ''[[All That You Can't Leave Behind]]'', which finished in third place in the U.S. The album was certified [[RIAA certification|gold]] by the [[Recording Industry Association of America]] (RIAA) within its first week of release.<ref name="iceage">{{cite web |url=https://books.google.com/books?id=YzBMbiDVcKoC&q=stankonia&pg=PA85 |title=The End of the Ice Age? |last=Jenkins |first=Sacha |date=March 2001 |access-date=July 8, 2012 |work=Spin |publisher=Bob Guccione, Jr.}}</ref> It also reached number two on the ''Billboard'' R&B/Hip-Hop albums chart, remaining on the chart for 45 weeks.<ref name="bbcharts">{{cite magazine |url={{BillboardURLbyName |artist=outkast |chart=all}} |title=Chart History: Outkast - Stankonia |magazine=Billboard |access-date=July 11, 2012}}</ref> By February 2002, the album has sold 3.79 million copies, according to [[Nielsen SoundScan]].<ref name="Basham">{{cite web |last=Basham |first=David |date=February 28, 2002 |url=http://www.mtv.com/news/articles/1452682/got-charts-o-brother-sales-boost-likely.jhtml |archive-url=https://web.archive.org/web/20121111120425/http://www.mtv.com/news/articles/1452682/got-charts-o-brother-sales-boost-likely.jhtml |url-status=dead |archive-date=November 11, 2012 |title=Got Charts? Expect 'O Brother' Sales Boost After Unexpected Win |publisher=MTV News |access-date=July 12, 2012}}</ref> On November 3, 2003, ''Stankonia'' was certified quadruple platinum, for shipments of four million copies.<ref name="RIAA_cert">{{cite web |url=https://www.riaa.com/goldandplatinumdata.php?artist=%22Stankonia%22 |publisher=[[Recording Industry Association of America]] |title=Gold & Platinum RIAA Certifications 2003 |date=November 3, 2003 |access-date=July 10, 2012}}</ref> In Canada, the album peaked at number four, and was certified double platinum by the [[Canadian Recording Industry Association]] on September 23, 2003, for shipments of over 200,000 units.<ref name="bbcharts"/><ref name="CanadianCert">{{cite web |title=Gold & Platinum Certification - Outkast |publisher=[[Canadian Recording Industry Association]] |url=http://www.musiccanada.com/GPSearchResult.aspx?st=&ica=False&sa=Outkast&sl=&smt=0&sat=-1&ssb=Artist |access-date=May 19, 2007 |archive-date=May 2, 2012 |archive-url=https://web.archive.org/web/20120502114144/http://musiccanada.com/GPSearchResult.aspx?st=&ica=False&sa=outkast&sl=&smt=0&sat=-1&ssb=Artist |url-status=dead}}</ref> The record also became a top ten hit in Germany, Finland, and Norway, reaching the number six, number eight, and number eight spots on the countries' official charts, respectively.<ref name="germanycharts">{{cite web |url=http://www.officialcharts.de/album.asp?artist=OutKast&title=Stankonia&country=de |archive-url=https://archive.today/20140707095402/http://www.officialcharts.de/album.asp?artist=OutKast&title=Stankonia&country=de |url-status=dead |archive-date=July 7, 2014 |title=Chartverfolgung / Outkast / Longplay |language=de |publisher=[[Media Control]]. PhonoNet GmbH |access-date=August 22, 2011}}</ref><ref name="finchart">{{cite web |url=http://finnishcharts.com/showitem.asp?interpret=OutKast&titel=Stankonia&cat=a |title=Outkast – Stankonia |language=nl |publisher=[[The Official Finnish Charts]]. Hung Medien |access-date=August 18, 2011}}</ref><ref name="norchart">{{cite web |url=http://norwegiancharts.com/showitem.asp?interpret=OutKast&titel=Stankonia&cat=a |title=Outkast – Stankonia |language=fr |publisher=[[VG-lista]]. Hung Medien |access-date=August 18, 2011}}</ref> The lead single released from ''Stankonia'', "B.O.B", peaked at number 69 on the R&B/Hip-Hop songs chart.<ref name="BOBcharts">{{cite magazine |url={{BillboardURLbyName |artist=outkast |chart=all}} |title=Chart History: Outkast - B.O.B |magazine=Billboard |access-date=July 11, 2012}}</ref> However, the single was banned from many urban Top 40 radio stations due to its title and the subject matter it was assumed to have.<ref name="Hess465"/> On February 3, 2001, "Ms. Jackson" topped the R&B/Hip-Hop songs chart, and then on February 17, the single also reached number one on the Hot 100, remaining on the chart for 22 weeks.<ref name="jacksoncharts">{{cite magazine |url={{BillboardURLbyName |artist=outkast |chart=all}} |title=Chart History: Outkast - Ms. Jackson |magazine=Billboard |access-date=July 11, 2012}}</ref> The song also reached number 13 on the ''Billboard'' Pop Songs chart, as well as number three on the magazine's Radio Songs chart.<ref name="jacksoncharts"/> The third single, "So Fresh, So Clean", peaked at number 30 on the Hot 100, and stayed on the chart for 20 weeks.<ref name="sofreshcharts">{{cite magazine |url={{BillboardURLbyName |artist=outkast |chart=all}} |title=Chart History: Outkast - So Fresh, So Clean |magazine=Billboard |access-date=July 11, 2012}}</ref> The single also peaked at number ten on the ''Billboard'' R&B/Hip-Hop songs chart, and number 24 on the Radio songs chart.<ref name="sofreshcharts"/> {{Clear}} ==Critical reception== {{Music ratings | MC = 95/100<ref name="MC">{{cite web |url=http://www.metacritic.com/music/stankonia/outkast |title=Reviews for Stankonia by Outkast |publisher=[[Metacritic]] |access-date=April 5, 2013}}</ref> | rev1 = [[AllMusic]] |rev1Score = {{Rating|5|5}}<ref name="Huey">{{cite web |url=http://www.allmusic.com/album/stankonia-mw0000252371 |title=Stankonia – OutKast |work=[[AllMusic]] |access-date=March 31, 2010 |last=Huey |first=Steve}}</ref> | rev2 = ''[[Alternative Press (magazine)|Alternative Press]]'' | rev2score = 5/5<ref name="AlternativePress">{{cite magazine |title=OutKast: Stankonia |magazine=[[Alternative Press (magazine)|Alternative Press]] |issue=149 |date=December 2000 |location=Cleveland |page=108}}</ref> | rev3 = ''[[Entertainment Weekly]]'' | rev3Score = A<ref name="Tucker">{{cite magazine |url=https://ew.com/article/2000/10/30/stankonia/ |title=Stankonia |magazine=[[Entertainment Weekly]] |date=October 30, 2000 |access-date=August 25, 2023 |last=Tucker |first=Ken |author-link=Ken Tucker}} The archived link [https://web.archive.org/web/20151129131005/http://www.ew.com/article/2000/11/03/stankonia shows the 'A' score].</ref> | rev4 = ''[[The Guardian]]'' | rev4Score = {{Rating|5|5}}<ref>{{cite news |url=https://www.theguardian.com/friday_review/story/0,3605,394987,00.html |title=OutKast: Stankonia (Arista) |work=[[The Guardian]] |location=London |date=November 10, 2000 |access-date=March 3, 2016 |last=Lester |first=Paul}}</ref> | rev5 = ''[[Los Angeles Times]]'' | rev5Score = {{Rating|4|4}}<ref name="Latimes">{{cite news |url=https://www.latimes.com/archives/la-xpm-2000-nov-30-ca-59075-story.html |title=Time to Give 'Em an Earful |work=[[Los Angeles Times]] |date=November 30, 2000 |access-date=March 4, 2020 |archive-url=https://web.archive.org/web/20121013102121/http://articles.latimes.com/2000/nov/30/entertainment/ca-59075/2 |archive-date=October 13, 2012 |url-status=live}}</ref> | rev6 = ''[[NME]]'' | rev6Score = {{Rating|4.5|5}}<ref name="Bardowell">{{cite magazine |url=http://www.nme.com/reviews/outkast/3412 |title=Stankonia |magazine=[[NME]] |location=London |date=November 18, 2000 |access-date=July 11, 2012 |last=Bardowell |first=Derek A. |archive-url=https://web.archive.org/web/20121016211200/http://www.nme.com/reviews/outkast/3412 |archive-date=October 16, 2012 |url-status=dead |page=41}}</ref> | rev7 = ''[[Pitchfork (website)|Pitchfork]]'' | rev7Score = 9.5/10<ref>{{cite web |url=https://pitchfork.com/reviews/albums/outkast-stankonia/ |title=OutKast: Stankonia |work=[[Pitchfork (website)|Pitchfork]] |date=February 11, 2018 |access-date=February 11, 2018 |last=Ex |first=Kris}}</ref> | rev8 = ''[[Rolling Stone]]'' | rev8Score = {{Rating|4|5}}<ref name="Brackett">{{cite magazine |url=https://www.rollingstone.com/music/albumreviews/stankonia-20001026 |title=Stankonia |magazine=[[Rolling Stone]] |location=New York |date=October 26, 2000 |access-date=May 16, 2012 |last=Brackett |first=Nathan |archive-url=https://web.archive.org/web/20071012184415/http://www.rollingstone.com/artists/outkast/albums/album/302328/review/6067606/stankonia |archive-date=October 12, 2007 |url-status=live}}</ref> | rev9 = ''[[USA Today]]'' | rev9Score = {{Rating|4|4}}<ref>{{cite news |url=https://www.usatoday.com/life/music/music351.htm |title=Outkast visits new territory on 'Stankonia' |work=[[USA Today]] |location=McLean |date=October 31, 2000 |access-date=July 11, 2012 |last=Jones |first=Steve |archive-url=https://web.archive.org/web/20001109081200/http://www.usatoday.com/life/music/music351.htm |archive-date=November 9, 2000 |url-status=dead}}</ref> | rev10 = ''[[The Village Voice]]'' | rev10Score = A<ref name="Christgau">{{cite news |url=http://www.robertchristgau.com/xg/cg/cgv1100-00.php |title=Consumer Guide: Getting Bizzy |work=[[The Village Voice]] |location=New York |date=December 5, 2000 |access-date=April 5, 2013 |last=Christgau |first=Robert |author-link=Robert Christgau}}</ref> }} ''Stankonia'' received universal acclaim from contemporary [[music critics]]. At [[Metacritic]], which assigns a [[standard score|normalized]] rating out of 100 to reviews from mainstream critics, the album received an [[weighted mean|average]] score of 95, based on 20 reviews.<ref name="MC"/> Derek A. Bardowell of ''[[NME]]'' noted that with ''Stankonia'', OutKast "hit that rare balance of creative eccentricity and mass appeal" and wrote that the album contains "eternal qualities that will unravel in time on an emotional, intellectual and spiritual level."<ref name="Bardowell"/> Nathan Brackett of ''[[Rolling Stone]]'' called the record "one of the best albums of the year", noting that all of the tracks contain "a down-home generosity and accessibility" and that "even the most street-oriented songs have some sort of commentary in them."<ref name="Brackett"/> Tony Green of ''[[The Village Voice]]'' praised OutKast's "feel for sonics and structure" and stated, "they've moved toward harder, darker textures, in service of song designs that are often disarmingly subtle."<ref name="Green">{{cite news |url=http://www.villagevoice.com/2000-10-31/music/make-my-crunk-the-p-funk/1 |archive-url=https://web.archive.org/web/20081208172731/http://www.villagevoice.com/2000-10-31/music/make-my-crunk-the-p-funk/1 |url-status=dead |archive-date=December 8, 2008 |title=Make My Crunk the P-Funk |work=[[The Village Voice]] |location=New York |date=October 31, 2000 |access-date=October 10, 2009 |last=Green |first=Tony}}</ref> Steve Huey of [[AllMusic]] commented that, "given the variety of moods, it helps that the album is broken up by brief, usually humorous interludes, which serve as a sort of reset button. It takes a few listens to pull everything together, but given the immense scope, it's striking how few weak tracks there are".<ref name="Huey"/> Aishah Hight of ''[[PopMatters]]'' stated, "Within ''Stankonia'', Outkast successfully presented a southern perspective of life, liberty, and the pursuit of happiness. But on the surface, phat beats and pure funk should suffice."<ref name="Hight">{{cite web |url=http://www.popmatters.com/pm/review/outkast-stankonia/ |title=Outkast – Stankonia |work=[[PopMatters]] |access-date=October 10, 2009 |last=Hight |first=Aishah}}</ref> ''[[Alternative Press (magazine)|Alternative Press]]'' commented that "experienced, acclaimed groups rarely make albums as bold and confrontational as ''Stankonia'', because they have too much to lose", but felt that "OutKast don't care", writing that they "coalesced the political and societal challenges of hip hop's past into what is one of the genre's most artistically unorthodox releases so far."<ref name="AlternativePress"/> [[Robert Christgau]] of ''The Village Voice'' observed "more bounce-to-the-ounce and less molasses in the jams, more delight and less braggadocio in the raps", and opined that Big Boi and André 3000's "realism and high spirits drive each other higher".<ref name="Christgau"/> ''[[Entertainment Weekly]]''{{'}}s [[Ken Tucker]] wrote that "''Stankonia'' reeks of artful ambition rendered with impeccable skill" and described OutKast as "endlessly good-humored and imaginative even when dealing with the most grim and mind-deadening facets of ghetto life."<ref name="Tucker"/> [[Yahoo! Music]]'s Soren Baker commented that "Dre and Big Boi again reinvent themselves, this time as [[Parliament (band)|Parliament]]-inspired musicians who specialize on male-female relationships, boasting, and out-there lyrics."<ref name="Baker">{{cite web |url=http://ca.music.yahoo.com/read/review/12053892 |title=Stankonia |publisher=[[Yahoo! Music]]. [[Yahoo!]] |access-date=May 16, 2012 |last=Baker |first=Soren |archive-url=https://web.archive.org/web/20060925105559/http://ca.music.yahoo.com/read/review/12053892 |archive-date=September 25, 2006}}</ref> Baker concluded in his review, "With another nearly flawless album, OutKast arguably solidifies their reputation as one of the best hip-hop groups of all time."<ref name="Baker"/> The ''Los Angeles Times'' opined that "the record's most interesting moments are gorgeous Prince-style soul."<ref name="Latimes"/> [[Jon Pareles]] of ''[[The New York Times]]'' wrote that "OutKast's music savors the viscous propulsion of funk, with raps and tunes that never ignore the body and its instinctive desires ... Yet OutKast&nbsp;– taking cues from a band it obviously reveres, [[Parliament-Funkadelic]]&nbsp;– never forgets that bodies are attached to minds."<ref name="Pareles">{{cite news |url=https://www.nytimes.com/2000/10/29/arts/music-rappers-turn-dialectic-into-a-conversation.html |title=Rappers Turn Dialectic Into a Conversation |work=[[The New York Times]] |date=October 29, 2000 |access-date=October 10, 2009 |last=Pareles |first=Jon |author-link=Jon Pareles}}</ref> ''[[URB (magazine)|URB]]'' called the album "a complex tome that enmeshes contemporary hip-hop values with a timeless Southern soul, while pushing the envelope damn near off the table."<ref name="URB">{{cite magazine |title=OutKast: Stankonia |magazine=[[URB (magazine)|URB]] |volume=10 |issue=79 |date=November 2000 |page=134}}</ref> ''[[Mojo (magazine)|Mojo]]'' called it "hip hop with the power to convert even the most reactionary nonbelievers."<ref name="Mojoreview">{{cite magazine |title=OutKast: Stankonia |magazine=[[Mojo (magazine)|Mojo]] |location=London |issue=93 |date=August 2001 |page=107}}</ref> ==Legacy and influence== [[File:RaveOn.jpg|thumb|With the release of ''Stankonia'', OutKast became the first hip hop group to openly acknowledge [[rave culture]] as an influence.]] ''Stankonia'' has received many accolades and appeared on many magazines' "best of" lists; in his book ''Dirty South'', author Ben Westhoff noted that the album appeared on "every critical best-list worth mentioning."<ref name="Westhoff112"/> At the [[2002 Grammy Awards]], OutKast won [[Best Rap Album]] for ''Stankonia'' and [[Best Rap Performance by a Duo or Group]] for "Ms. Jackson".<ref name="Hess465"/> Despite OutKast's being expected favorites, [[Grammy Awards|The Recording Academy]] instead chose the 2000 soundtrack album ''[[O Brother, Where Art Thou? (soundtrack)|O Brother, Where Art Thou?]]'' for [[Grammy Award for Album of the Year|Album of the Year]].<ref name="Basham"/> Before the group's nominations, much of the hip hop community felt that rappers were not being awarded enough attention from The Recording Academy.<ref name="nolonger">{{cite web |url=https://www.usatoday.com/life/music/grammy2002/2002-02-12-rap.htm |title=Hip-hop no longer a Grammy outcast |last=Jones |first=Steve |work=USA Today |date=February 11, 2002 |access-date=July 12, 2012}}</ref> However, the album's musical diversity allowed the band to reach a wider audience and was credited for opening the academy up to more hip hop musicians.<ref name="nolonger"/> In 2006, ''[[Time (magazine)|Time]]'' named ''Stankonia'' as one of the 100 best albums of all time.<ref>{{cite magazine |url=http://www.time.com/time/2006/100albums/index.html |archive-url=https://web.archive.org/web/20061201085911/http://www.time.com/time/2006/100albums/index.html |url-status=dead |archive-date=December 1, 2006 |magazine=Time |title=All-Time 100 Albums |date=November 2, 2006}}</ref> ''[[Rolling Stone]]'' ranked the album number 16 on the magazine's list of the 100 Best Albums of the 2000s.<ref name="100best">{{cite magazine |url=https://www.rollingstone.com/music/lists/100-best-albums-of-the-2000s-20110718/outkast-stankonia-19691231 |title=100 Best Albums of the 2000s: Outkast, 'Stankonia' |magazine=Rolling Stone |date=July 18, 2011 |access-date=February 18, 2012}}</ref> In 2009, ''[[Pitchfork (website)|Pitchfork]]'' ranked ''Stankonia'' number 13 on its list of the top 200 albums of the 2000s, and [[Rhapsody (online music service)|Rhapsody]] ranked it at number 2 on its "100 Best Albums of the Decade" list.<ref>[http://pitchfork.com/features/staff-lists/7710-the-top-200-albums-of-the-2000s-20-1/1/ The Top 200 Albums of the 2000s: 13) ''Stankonia'']. ''[[Pitchfork (website)|Pitchfork]]''. Retrieved October 10, 2010.</ref><ref>[http://blog.rhapsody.com/2009/12/100-best-pop-albums-of-the-decade-10-1.html "Rhapsody's 100 Best Albums of the Decade"] {{webarchive|url=https://web.archive.org/web/20101102055657/http://blog.rhapsody.com/2009/12/100-best-pop-albums-of-the-decade-10-1.html |date=November 2, 2010 }} Retrieved January 12, 2010.</ref> Rhapsody also ranked the album number 6 on its "Hip-Hop's Best Albums of the Decade" list.<ref>[http://blog.rhapsody.com/2009/10/hiphopdecade.html "Hip-Hop's Best Albums of the Decade"] {{webarchive|url=https://web.archive.org/web/20120924071122/http://blog.rhapsody.com/2009/10/hiphopdecade.html |date=September 24, 2012 }} Retrieved January 12, 2010.</ref> ''Vibe'' ranked the record at number 23 on its list of the "100 Greatest Albums from 1985 to 2005".<ref name="100greatest"/> ''[[Entertainment Weekly]]'' put it on its end-of-the-decade "best-of" list, saying, "With hummable hits ('Ms. Jackson') and out-there experiments ('B.O.B.'), the rap duo gave us all a visa to the funky if fictional land of Stankonia in 2000."<ref>{{cite magazine |author=Staff |date=December 4, 2009 |url=https://ew.com/article/2009/12/04/100-greatest-movies-tv-shows-and-more/ |title=100 greatest movies, TV shows and more |magazine=[[Entertainment Weekly]] |access-date=January 16, 2023}}</ref> ''[[Q magazine|Q]]'' listed ''Stankonia'' as one of the best 50 albums of 2001.<ref>{{cite news |title=The Best 50 Albums of 2001 |magazine=Q |date=December 2001 |pages=60–65}}</ref> The album was also included in the book ''[[1001 Albums You Must Hear Before You Die]]''.<ref>{{cite book |first1=Robert |last1=Dimery |first2=Michael |last2=Lydon |title=1001 Albums You Must Hear Before You Die: Revised and Updated Edition |date=March 23, 2010 |publisher=Universe |isbn=978-0-7893-2074-2}}</ref> In 2024, [[Paste Magazine]] ranked ''Stankonia'' number 6 on its list of the greatest albums of all time.<ref>{{cite web |url=https://www.pastemagazine.com/music/greatest-albums/the-300-greatest-albums-of-all-time-2 |title=The 300 Greatest Albums of All Time |website=[[Paste (magazine)|Paste]] |last=Sharples |first=Grant |date=June 3, 2024 |access-date=December 12, 2024}}</ref> In 2015, ''[[Mic.com|Mic]]'' stated that "Stankonia helped hip-hop build its foundation in the mainstream," adding that in addition to the "irresistibly quotable" hit singles, "the deep cuts are still some of the most rewarding [[experimental hip-hop]] around."<ref name="mic">{{cite web |last1=Barnes |first1=Tom |title=5 Years Ago, Outkast Made an Album So Good It Completely Rewrote the Rules of Hip-Hop |url=https://www.mic.com/articles/127664/outkast-stankonia-15-year-anniversary |website=[[Mic.com|Mic]] |date=October 30, 2015 |access-date=January 25, 2022}}</ref> With ''Stankonia'', OutKast became the first hip hop act to openly acknowledge [[rave culture]] as an influence.<ref name="Reynolds333">Reynolds, 2007. p. 333</ref> During the late 1990s, rappers tended to embrace slow, laid-back beats in their productions. On several tracks on ''Stankonia'', the group employed faster, more chaotic tempos to reflect rave culture and the introduction of new drugs such as ecstasy into the hip hop scene.<ref name="Reynolds333"/> Boston-based DJ [[Armand Van Helden]] recalls, "In the nineties, the bpms in hip-hop got slower and the clubs were moody&nbsp;... it just kind of dragged. I really missed that kind of hands-in-the-air shit."<ref name="Reynolds333"/> A remix of "B.O.B" created by [[Rage Against the Machine]]'s [[Zack de la Rocha]] received airplay on alternative radio stations, expanding the group's fanbase beyond hip hop and urban listeners.<ref name="Pride">{{cite magazine |url=http://www.ew.com/ew/article/0,,278443,00.html |title=The Pride of Funkenstein |last=Brunner |first=Rob |date=November 10, 2000 |access-date=July 12, 2012 |magazine=Entertainment Weekly |archive-date=February 20, 2009 |archive-url=https://web.archive.org/web/20090220183120/http://www.ew.com/ew/article/0,,278443,00.html |url-status=dead}}</ref> Despite containing anti-war sentiments, "B.O.B" became popular amongst American troops deployed in Afghanistan.<ref name="Westhoff112" /> While working on her acclaimed album ''[[The ArchAndroid]]'' (2010), American [[R&B]] singer [[Janelle Monáe]] cited ''Stankonia'''s experimental nature as an influence.<ref name="Lewis">{{cite web |url=http://www.bluesandsoul.com/feature/554/janelle_monae_funky_sensation/ |title=Janelle Monáe: Funky Sensation |last=Lewis |first=Pete |work=[[Blues & Soul]] |access-date=July 10, 2012}}</ref> Rapper [[Pill (rapper)|Pill]] also acknowledged ''Stankonia'', and particularly the production of Organized Noize, as an inspiration: "The sounds, the instrumentation of the samples, the different horns—everything about the tracks were great to me."<ref name="Pillcomplex">{{cite web |url=http://www.complex.com/music/2010/05/pill-on-the-influence-of-organized-noize |title=Pill On The Influence Of Organized Noize |work=[[Complex (magazine)|Complex]] |date=May 12, 2010 |access-date=July 10, 2012}}</ref> ==Track listing== All tracks are produced by [[Earthtone III]] (Outkast and [[Mr. DJ]]), except where noted. {{Track listing | extra_column = Producer(s) | title1 = Intro | writer1 = {{hlist|[[Andre Benjamin]]|[[Antwan Patton]]|[[David Sheats]]}} | extra1 = | length1 = 1:09 | title2 = Gasoline Dreams | note2 = featuring [[Khujo]] | writer2 = {{hlist|Benjamin|Patton|Sheats|[[Khujo|Willie Knighton]]}} | extra2 = | length2 = 3:34 | title3 = I'm Cool | note3 = interlude | length3 = 0:42 | title4 = [[So Fresh, So Clean]] | writer4 = {{hlist|[[Organized Noize]]|Benjamin|Patton}} | extra4 = Organized Noize | length4 = 4:00 | title5 = [[Ms. Jackson]] | writer5 = {{hlist|Benjamin|Patton|Sheats}} | extra5 = | length5 = 4:30 | title6 = Snappin' & Trappin{{'-}} | note6 = featuring [[Killer Mike]] and J-Sweet | writer6 = {{hlist|Benjamin|Patton|Sheats|[[Michael Render]]|John E.E. Smith|[[BlackOwned C-Bone|Cory Andrews]]}} | extra6 = | length6 = 4:19 | title7 = D.F. | note7 = interlude | length7 = 0:27 | title8 = Spaghetti Junction | writer8 = {{hlist|Organized Noize|Benjamin|Patton}} | extra8 = Organized Noize | length8 = 3:57 | title9 = Kim & Cookie | note9 = interlude | length9 = 1:12 | title10 = I'll Call Before I Come | note10 = featuring [[Gangsta Boo]] and Eco | writer10 = {{hlist|Benjamin|Patton|Sheats|[[Gangsta Boo|Lola Mitchell]]|Rashida Roberts}} | extra10 = | length10 = 4:18 | title11 = [[B.O.B (song)|B.O.B]] | writer11 = {{hlist|Benjamin|Patton|Sheats}} | extra11 = | length11 = 5:04 | title12 = Xplosion | note12 = featuring [[B-Real]] | writer12 = {{hlist|Benjamin|Patton|Sheats|[[Louis Freese]]|[[Witchdoctor (rapper)|Erin Johnson]]}} | extra12 = | length12 = 4:08 | title13 = Good Hair | note13 = interlude | length13 = 0:14 | title14 = We Luv Deez Hoez | note14 = featuring Backbone and [[Big Gipp]] | extra14 = Organized Noize | writer14 = {{hlist|Organized Noize|Benjamin|Patton|Jamahr Williams|[[Cameron Gipp]]|Bolivar Troncoso}} | length14 = 4:10 | title15 = Humble Mumble | note15 = featuring [[Erykah Badu]] | writer15 = {{hlist|Benjamin|Patton|Sheats|[[Erica Wright]]}} | extra15 = | length15 = 4:50 | title16 = Drinkin' Again | note16 = interlude | length16 = 0:24 | title17 = ? | writer17 = {{hlist|Benjamin|Patton|Sheats}} | extra17 = | length17 = 1:28 | title18 = Red Velvet | writer18 = {{hlist|Benjamin|Patton|Sheats}} | extra18 = | length18 = 3:52 | title19 = Cruisin' in the ATL | note19 = interlude | length19 = 0:19 | title20 = Gangsta Shit | note20 = featuring Slimm Calhoun, [[C-Bone]] and [[T-Mo]] | writer20 = {{hlist|Carlton Mahone|Benjamin|Patton|Sheats|[[T-Mo|Robert Barnett]]|Brian Loving|Andrews}} | extra20 = {{hlist|Carl Mo|Earthtone III{{ref|a|[a]}}}} | length20 = 4:41 | title21 = Toilet Tisha | writer21 = {{hlist|Benjamin|Patton|Sheats}} | extra21 = | length21 = 4:24 | title22 = Slum Beautiful | note22 = featuring [[CeeLo Green|Cee-Lo]] | writer22 = {{hlist|Benjamin|Patton|Sheats|[[CeeLo Green|Thomas Burton]]}} | extra22 = | length22 = 4:07 | title23 = Pre-Nump | note23 = interlude | length23 = 0:27 | title24 = Stankonia (Stanklove) | note24 = featuring [[Big Rube]] and [[Sleepy Brown]] | writer24 = {{hlist|Benjamin|Patton|Sheats|[[Sleepy Brown|Patrick Brown]]|[[Big Rube|Ruben Bailey]]}} | extra24 = | length24 = 6:51 | total_length = 73:07 }} '''Notes''' * {{sup|{{note|a|[a]}}}} signifies a co-producer. * "So Fresh, So Clean" contains a sample of "Before the Night is Over" by [[Joe Simon (musician)|Joe Simon]]. * "Ms. Jackson" contains a sample of "Strawberry Letter #23" by [[The Brothers Johnson]]. * "We Luv Deez Hoez" contains a sample of "Worldwide" by [[Allen Toussaint]]. {{Track listing | headline = 2020 deluxe edition | title25 = Ms. Jackson | note25 = Mr. Drunk remix | length25 = 4:45 | title26 = So Fresh, So Clean | note26 = Stankonia remix) (featuring [[Snoop Dogg]] and Sleepy Brown | writer26 = {{hlist|Benjamin|Patton|Sheats|Brown|[[Calvin Broadus]]}} | length26 = 4:37 | title27 = B.O.B. (Bombs Over Baghdad) | note27 = [[Zack de la Rocha]] remix | length27 = 4:36 | title28 = Ms. Jackson | note28 = [[a cappella]] | length28 = 3:54 | title29 = So Fresh, So Clean | note29 = a cappella | length29 = 3:53 | title30 = B.O.B. (Bombs Over Baghdad) | note30 = a cappella | length30 = 2:58 | total_length = 97:50 }} {{Track listing | headline = 2025 deluxe edition | total_length = 112:18 | title25 = Speed Ballin{{'-}} | writer25 = {{hlist|Benjamin|Patton|Sheats}} | length25 = 5:04 | title26 = Sole Sunday | note26 = Dirty Mix) (featuring [[Goodie Mob]] | writer26 = {{hlist|Benjamin|Patton|Sheats|Gipp|Knighton}} | length26 = 4:39 | title27 = So Fresh, So Clean | note27 = Stankonia remix) (featuring Snoop Dogg and Sleepy Brown | length27 = 4:37 | title28 = B.O.B. (Bombs Over Baghdad) | note28 = Zack de la Rocha remix | length28 = 4:36 | title29 = B.O.B. (Bombs Over Baghdad) | note29 = Cutmaster Swiff remix | length29 = 6:08 | title30 = B.O.B. (Bombs Over Baghdad) | note30 = Beat Bullies remix | length30 = 4:21 | title31 = So Fresh, So Clean | note31 = instrumental | length31 = 4:39 | title32 = B.O.B. (Bombs Over Baghdad) | note32 = instrumental | length32 = 5:07 }} ==Personnel== {{col-begin}} {{col-2}} '''OutKast''' * [[Big Boi]] (Antwan Patton) – vocals, [[Record producer|production]] * [[André 3000]] (Andre Benjamin) – vocals, [[synthesizer]]s, guitar, production * [[Mr. DJ]] (David Sheats) – production '''Guest performers''' * [[Sleepy Brown]] * [[Khujo Goodie]] * [[Killer Mike]] * J-Sweet * [[Gangsta Boo]] * Eco * [[B-Real]] * [[Erykah Badu]] * Backbone * [[Big Gipp]] * Slimm Calhoun * C-Bone * T-Mo Goodie * [[Cee-Lo Green]] * Big Rube * [[Joi (singer)|Joi]] {{col-2}} '''Musicians''' * Donnie Mathis – guitar * David "Whild" Brown – guitar * Jason Freeman – [[French horn|horns]] * Jerry Freeman – horns * Sleepy Brown – piano, synthesised bass * Marvin "Chanz" Parkman – piano, keyboards * Earthtone III – keyboards * Organized Noize – keyboards * Preston Crump – bass guitar, synthesized bass * Aaron Mills – bass guitar * Robert Grister – bass guitar * Dookie Blossumgame – bass guitar * Victor Alexander – drums * Rosalin Heard – backing vocals * Paul Douglas-Feddon – backing vocals * [[Myrna "Screechy Peach" Crenshaw]] – backing vocals * Cutmaster Swiff – cuts '''Design''' * [[Michael Lavine]] – photography {{col-end}} ==Charts== {{col-begin}} {{col-2}} ===Weekly charts=== {| class="wikitable sortable plainrowheaders" style="text-align:center;" |- !Chart (2000–2001) !Peak<br />position |- {{album chart|Australia|33|artist=Outkast|album=Stankonia|rowheader=true|access-date=August 17, 2020}} |- ! scope="row"| Australian Urban Albums ([[ARIA Charts|ARIA]])<ref>{{cite journal |url=http://pandora.nla.gov.au/pan/23790/20020221-0000/www.aria.com.au/issue593.pdf |archive-url=https://webarchive.nla.gov.au/awa/20080222222432/http://pandora.nla.gov.au/pan/23790/20020221-0000/www.aria.com.au/issue593.pdf |url-status=dead |archive-date=February 22, 2008 |title=ARIA Urban Chart – Week Commencing 9th July 2001 |journal=[[Australian Recording Industry Association]] |issue=593 |page=14 |date=July 9, 2001 |access-date=April 16, 2023 |via=[[Pandora Archive]]}} {{cbignore|bot=medic}}{{cbignore}}</ref> |5 |- {{album chart|Austria|16|artist=Outkast|album=Stankonia|rowheader=true|access-date=August 17, 2020}} |- {{album chart|Flanders|25|artist=Outkast|album=Stankonia|rowheader=true|access-date=August 17, 2020}} |- {{album chart|BillboardCanada|4|artist=Outkast|rowheader=true|access-date=August 17, 2020}} |- ! scope="row"|Canadian R&B Albums ([[Nielsen SoundScan]])<ref>{{cite web |url=http://canoe.com/JamMusicCharts/RANDB.html |title=R&B : Top 50 |website=[[Jam!]] |date=August 19, 2000 |access-date=January 27, 2023 |archive-url=https://web.archive.org/web/20001119201200/http://canoe.com:80/JamMusicCharts/RANDB.html |archive-date=November 19, 2000}}</ref> |style="text-align:center;"|1 |- {{album chart|Denmark|17|artist=Outkast|album=Stankonia|rowheader=true|access-date=August 17, 2020}} |- {{album chart|Netherlands|20|artist=Outkast|album=Stankonia|rowheader=true|access-date=August 17, 2020}} |- {{album chart|Finland|8|artist=Outkast|album=Stankonia|rowheader=true|access-date=August 17, 2020}} |- {{album chart|France|26|artist=Outkast|album=Stankonia|rowheader=true|access-date=August 17, 2020}} |- {{album chart|Germany|6|id=3555|artist=Outkast|album=Stankonia|rowheader=true|access-date=August 17, 2020}} |- {{album chart|Ireland2|29|artist=Outkast|album=Stankonia|rowheader=true|access-date=May 4, 2025}} |- {{album chart|New Zealand|17|artist=Outkast|album=Stankonia|rowheader=true|access-date=August 17, 2020}} |- {{album chart|Norway|8|artist=Outkast|album=Stankonia|rowheader=true|access-date=August 17, 2020}} |- {{album chart|Scotland|14|date=20010211|rowheader=true|access-date=May 4, 2025}} |- {{album chart|Sweden|15|artist=Outkast|album=Stankonia|rowheader=true|access-date=August 17, 2020}} |- {{album chart|Switzerland|14|artist=Outkast|album=Stankonia|rowheader=true|access-date=August 17, 2020}} |- {{album chart|UK|10|artist=OutKast|rowheader=true|access-date=September 17, 2014}} |- {{album chart|UKR&B|1|date=20010211|rowheader=true|access-date=May 4, 2025}} |- {{album chart|US|10|artist=OutKast|rowheader=true|access-date=September 17, 2014}} |- {{album chart|USR&B|1|date=20010211|rowheader=true|access-date=May 4, 2025}} |- {{album chart|Billboard200|2|artist=Outkast|rowheader=true|access-date=August 17, 2020}} |- {{album chart|BillboardRandBHipHop|2|artist=Outkast|rowheader=true|access-date=August 17, 2020}} |} {{col-2}} === Year-end charts === {| class="wikitable sortable plainrowheaders" style="text-align:center;" |- !Chart (2000) !Position |- ! scope="row"|Canadian Albums (Nielsen SoundScan)<ref>{{cite web |archiveurl=https://web.archive.org/web/20040906184459/http://www.jamshowbiz.com/JamMusicCharts/2000_2.html |archivedate=September 6, 2004 |url=http://www.jamshowbiz.com/JamMusicCharts/2000_2.html |title=Canada's Top 200 Albums of 2000 |website=[[Jam!]] |accessdate=March 29, 2022}}</ref> | 101 |- !scope="row"|US ''Billboard'' 200<ref>{{cite magazine |url=https://www.billboard.com/charts/year-end/2000/top-billboard-200-albums |title=Top Billboard 200 Albums – Year-End 2000 |magazine=Billboard |access-date=August 17, 2020}}</ref> |104 |- !scope="row"|US Top R&B/Hip-Hop Albums (''Billboard'')<ref>{{cite magazine |url=https://www.billboard.com/charts/year-end/2000/top-r-and-b-hip-hop-albums |title=Top R&B/Hip-Hop Albums – Year-End 2000 |magazine=Billboard |access-date=August 17, 2020}}</ref> |51 |} {| class="wikitable sortable plainrowheaders" style="text-align:center;" |- !Chart (2001) !Position |- !scope="row"|Canadian Albums (Nielsen SoundScan)<ref>{{cite web |archiveurl=https://web.archive.org/web/20031212202406/http://jamshowbiz.com/JamMusicCharts/200-1_2001.html |archivedate=December 12, 2003 |url=http://jamshowbiz.com/JamMusicCharts/200-1_2001.html |title=Canada's Top 200 Albums of 2001 (based on sales) |website=[[Jam!]] |accessdate=March 26, 2022}}</ref> | 80 |- ! scope="row"|Canadian R&B Albums (Nielsen SoundScan)<ref>{{cite web |archive-url=https://web.archive.org/web/20021122000500/http://www.jamshowbiz.com/JamMusicCharts/2001_r&b.html |date=January 8, 2002 |archive-date=November 22, 2002 |url=http://www.jamshowbiz.com/JamMusicCharts/2001_r&b.html |title=Canada's Top 200 R&B; albums of 2001 |website=[[Jam!]] |accessdate=January 22, 2023}}</ref> |19 |- !scope="row"|Canadian Rap Albums (Nielsen SoundScan)<ref>{{cite web |archive-url=https://web.archive.org/web/20021122000815/http://www.jamshowbiz.com/JamMusicCharts/2001_rap.html |date=January 8, 2002 |archive-date=November 22, 2002 |url=http://www.jamshowbiz.com/JamMusicCharts/2001_rap.html |title=Top 100 rap albums of 2001 in Canada |website=[[Jam!]] |accessdate=January 26, 2023}}</ref> |9 |- ! scope="row"| European Albums (''Music & Media'')<ref>{{cite magazine |url=https://www.americanradiohistory.com/UK/Music-and-Media/00s/2001/MM-2001-12-22.pdf |title=Year in Review – European Top 100 Albums 2001 |magazine=Music & Media |volume=19 |issue=52 |date=December 22, 2001 |page=15 |oclc=29800226 |access-date=March 4, 2020 |via=American Radio History}}</ref> |100 |- !scope="row"|German Albums (Offizielle Top 100)<ref>{{cite web |url=https://www.offiziellecharts.de/charts/album-jahr/for-date-2001 |title=Top 100 Album-Jahrescharts |language=de |publisher=[[GfK Entertainment]] |access-date=August 17, 2020}}</ref> |80 |- ! scope="row"|New Zealand Albums (RMNZ)<ref>{{cite web |url=https://aotearoamusiccharts.co.nz/archive/annual-albums/2001-12-31 |title=Top Selling Albums of 2001 |website=The Official NZ Music Charts |access-date=August 29, 2018}}</ref> | 44 |- !scope="row"|UK Albums (OCC)<ref>{{cite web |url=https://www.officialcharts.com/charts/end-of-year-artist-albums-chart/20010107/37502/ |title=End of Year Album Chart Top 100 – 2001 |publisher=Official Charts Company |access-date=August 17, 2020}}</ref> |100 |- !scope="row"|US Albums (RIAA)<ref>{{cite web |url=https://www.riaa.com/charts/end-of-year-artist-albums-chart/20010107/37502/ |title=End of Year Album Chart Top 100 – 2001 |publisher=RIAA Charts |access-date=August 17, 2020}}</ref> |100 |- !scope="row"|US ''Billboard'' 200<ref>{{cite magazine |url=https://www.billboard.com/charts/year-end/2001/top-billboard-200-albums |title=Top Billboard 200 Albums – Year-End 2001 |magazine=Billboard |access-date=August 17, 2020}}</ref> |16 |- !scope="row"|US Top R&B/Hip-Hop Albums (''Billboard'')<ref>{{cite magazine |url=https://www.billboard.com/charts/year-end/2001/top-r-and-b-hip-hop-albums |title=Top R&B/Hip-Hop Albums – Year-End 2001 |magazine=Billboard |access-date=August 17, 2020}}</ref> |6 |} {| class="wikitable sortable plainrowheaders" style="text-align:center;" |- !Chart (2002) !Position |- ! scope="row"|Canadian R&B Albums (Nielsen SoundScan)<ref>{{cite web |archiveurl=https://web.archive.org/web/20031106073523/http://www.jamshowbiz.com/JamMusicCharts/2002_r&b2.html |archivedate=November 6, 2003 |url=http://www.jamshowbiz.com/JamMusicCharts/2002_r&b2.html |title=Canada's Top 200 R&B; albums of 2002 |website=[[Jam!]] |accessdate=March 28, 2022}}</ref> | 185 |- ! scope="row"|Canadian Rap Albums (Nielsen SoundScan)<ref>{{cite web |archiveurl=https://web.archive.org/web/20031012032336/http://www.jamshowbiz.com/JamMusicCharts/2002_rap.html |archivedate=October 12, 2003 |url=http://www.jamshowbiz.com/JamMusicCharts/2002_rap.html |title=Top 100 rap albums of 2002 in Canada |website=[[Jam!]] |accessdate=March 28, 2022}}</ref> | 91 |} ===Decade-end charts=== {| class="wikitable sortable plainrowheaders" style="text-align:center;" |- ! scope="col"| Chart (2000–2009) ! scope="col"| Position |- !scope="row"| US ''Billboard'' 200<ref>{{cite magazine |url=https://worldradiohistory.com/Archive-All-Music/Billboard/00s/2009/BB-2009-12-19.pdf |title=The Decade in Music - Charts - Top Billboard 200 Albums |via=World Radio History |magazine=Billboard |page=163 |access-date=June 27, 2021}} ''Digit page 167 on the PDF archive.''</ref> |75 |} {{col-end}} ==Certifications== {{Certification Table Top}} {{Certification Table Entry|region=Australia|type=album|title=Stankonia|artist=Outkast|award=Gold|relyear=2000|certyear=2020|access-date=April 29, 2021}} {{Certification Table Entry|region=Canada|type=album|title=Stankonia|artist=Outkast|award=Platinum|number=3|relyear=2000|certyear=2025|access-date=July 9, 2023}} {{Certification Table Entry|region=New Zealand|type=album|title=Stankonia|artist=Outkast|award=Gold|id=2001-03-16|source=newchart|access-date=November 20, 2024|relyear=2000}} {{Certification Table Entry|region=Norway|type=album|artist=Outkast|title=Stankonia|award=Gold|relyear=2000|certyear=2004|access-date=October 4, 2021}} {{Certification Table Entry|region=United Kingdom|type=album|artist=Outkast|title=Stankonia|award=Platinum|id=11337-1847-2|relyear=2000|certyear=2025|access-date=December 19, 2025}} {{Certification Table Entry|region=United States|type=album|title=Stankonia|artist=Outkast|award=Platinum|number=5|relyear=2000|certyear=2021|accessdate=November 22, 2021}} {{Certification Table Bottom|streaming=true}} == See also == * [[Progressive rap]] ==References== {{Reflist}} ===Bibliography=== * {{cite book |editor-last=Boyd |editor-first=Todd |year=2003 |title=The New H.N.I.C.: The Death of Civil Rights and the Reign of Hip Hop |publisher=NYU Press |isbn=978-0-8147-9895-9}} * {{cite book |editor-last=Brackett |editor-first=Nathan |year=2004 |title=The New Rolling Stone Album Guide: Completely Revised and Updated 4th Edition |publisher=Fireside Books |isbn=0-7432-0169-8 |url-access=registration |url=https://archive.org/details/newrollingstonea00brac}} * {{cite book |editor-last=Crazy Horse |editor-first=Kandia |year=2004 |title=Rip It Up: The Black Experience in Rock 'n Roll |publisher=Palgrave Macmillan |isbn=978-1-4039-6243-0}} * {{cite book |editor-last=Hess |editor-first=Mickey |year=2007 |title=Icons of Hip Hop: An Encyclopedia of the Movement, Music, and Culture |publisher=[[ABC-CLIO]] |isbn=978-0-313-33903-5 |url-access=registration |url=https://archive.org/details/iconsofhiphopenc0000unse}} * {{cite book |editor-last=Moon |editor-first=Tom |year=2008 |title=1,000 Recordings to Hear Before You Die: A Listener's Life List |publisher=Workman Publishing Company, Inc.}} * {{cite book |editor-last=Reynold |editor-first=Simon |year=2007 |title=Bring the Noise: 20 Years of Writing About Hip Rock & Hip-Hop |publisher=Faber & Faber}} * {{cite book |editor-last=Wang |editor-first=Oliver |title=Classic Material: The Hip-Hop Album Guide |publisher=[[ECW Press]] |date=May 1, 2003 |isbn=1-55022-561-8}} * {{cite book |last=Westhoff |first=Ben |date=May 1, 2011 |title=Dirty South: OutKast, Lil Wayne, Soulja Boy, and the Southern Rappers Who Reinvented Hip-Hop |publisher=[[Chicago Review Press]] |isbn=978-1-56976-606-4}} ==External links== * {{discogs master|26124}} * {{Metacritic album}} * {{Musicbrainz release group|00d2cd53-21c9-3738-b683-56847b7b0040}} * [http://www.stylusmagazine.com/articles/playing_god/outkast-stankonia.htm Playing God: Stankonia] {{Webarchive|url=https://web.archive.org/web/20080917020537/http://www.stylusmagazine.com/articles/playing_god/outkast-stankonia.htm |date=September 17, 2008 }} at [[Stylus Magazine]] * [http://mikerush.prosite.com/37215/gallery Graphic Designer, J. Michael Rush] {{OutKast}} {{Grammy Award for Best Rap Album}} {{Authority control}} {{Good article}} [[Category:2000 albums]] [[Category:Outkast albums]] [[Category:LaFace Records albums]] [[Category:Albums produced by André 3000]] [[Category:Albums produced by Earthtone III]] [[Category:Albums produced by Organized Noize]] [[Category:Grammy Award for Best Rap Album]] [[Category:Progressive rap albums]] [[Category:Funk albums by American artists]] 1datk8sh00hnirdqb9qhdr15o6kjs97 Testing some translate related stuff 0 76439 739100 338502 2026-04-22T15:55:03Z ~2026-24687-17 73660 739100 wikitext text/x-wiki <languages /> <translate> <!--T:1--> Some long text to be tested. Nothing significant. Test == The first section == <!--T:2--> <!--T:3--> Really. It's just a [[<tvar|1>Special:MyLanguage/test</>|test]]. Nothing of any importance. == The middle section == <!--T:4--> <!--T:5--> In the middle section is the description of middle section. The middle section consists of the heading of the middle section and the text of the middle section. It has no footer of the middle section just because there are no such a thing as a footer of a section. <!--T:6--> Here is the second [[<tvar|1>Special:MyLanguage/paragraph</>|paragraph]] of the middle section. It is not so long as the first one but still will do for the testing. == The last section == <!--T:7--> <!--T:8--> It's the last section in this revision of this testing page. I believe 3 will do for my testings. If not I'd add more. Obviously, isn't it? == See also == <!--T:9--> <!--T:10--> * [[<tvar|mw>:mw:Extension:Translate</>|Extension:Translate]] </translate> <translate> <!--T:11--> * [[<tvar|m>:m:</>|Meta Wiki]] </translate>I am adding a link here<translate> <!--T:12--> * [[<tvar|en>:en:</>|English Wikipedia]] </translate> [[Category:Test pages]] ky6ldx0u188l1o6sycttdxt1l5dkmck முதற் பக்கம் 0 91847 739173 690956 2026-04-23T10:29:58Z ~2026-23062-17 73557 739173 wikitext text/x-wiki :''மேலும் பார்க்க: [[test2wiki:|test2.wikipedia.org]], [[testwikidata:|test.wikidata.org]]'' __NOEDITSECTION____NOTOC__ இது மீடியாவிக்கி மென்பொருளில் இயங்கக்கூடிய '''சோதனை விக்கி'''. விக்கிமீடியாவின் மற்ற விக்கிகள் இயங்கும் அதே பதிப்பிலேயே இதுவும் இயங்குகிறது. ஆயினும், இங்குள்ள சில வசதிகள் சோதனைமுறையில் இயக்கப்படக்கூடும். இந்த தளத்தில் உள்ள உள்ளடக்கத்தில் வழு இருக்கவும் கூடும். <div id="mp-tfa"> இந்த விக்கியின் தற்போதைய பதிப்பு {{CURRENTVERSION}}. [[wikitech:testwiki|சோதனைவிக்கி]] என்னும் பக்கத்தில் இதை கட்டமைப்பது எப்படி என்பதை அறியலாம். [https://duckduckgo.com] ==இங்கு பங்களிப்பதற்கு முன் படித்தறிய வேண்டியவை== ===அணுக்கக் கோரிக்கைகள்=== ==விக்கிமீடியத் திட்டங்கள்== <div class="plainlinks" id="mf-spr" title="சகோதரத் திட்டங்கள்"> {| class="plainlinks" style="background-color: transparent; text-align: left; width: 100%;" | align="center" | [[File:Wikipedia-logo-v2.svg|35x35px|link=http://en.wikipedia.org|logo Wikipedia]] | கட்டற்ற கலைக்களஞ்சியமான '''[//en.wikipedia.org/ விக்கிப்பீடியா]''' | align="center" | [[File:Wiktionary-logo.svg |35x35px|link=http://www.wiktionary.org|logo Wiktionary]] | கட்டற்ற அகரமுதலியான '''[http://www.wiktionary.org/ விக்சனரி]''' | align="center" | [[File:Wikinews-logo.svg|35x35px|link=http://www.wikinews.org|logo Wikinews]] | கட்டற்ற செய்தியூடகமான '''[http://www.wikinews.org/ விக்கிசெய்தி]''' | align="center" | [[File:Wikiquote-logo.svg|35x35px|link=http://www.wikiquote.org|logo Wikiquote]] | கட்டற்ற மேற்கோள்மூலமான '''[http://www.wikiquote.org/ விக்கிமேற்கோள்]''' |- | align="center" | [[File:Wikibooks-logo.svg|35x35px|link=http://www.wikibooks.org|logo Wikibooks]] | கட்டற்ற நூல்களைக் கொண்ட '''[http://www.wikibooks.org/ விக்கிநூல்கள்]''' | align="center" | [[File:Wikispecies-logo.svg|35x35px|link=http://species.wikimedia.org|logo Wikispecies]] | உயிரினங்களைப் பற்றிய கட்டற்ற '''[http://species.wikimedia.org/ விக்கியுயிரினங்கள்]''' | align="center" | [[File:Wikisource-logo.svg|35x35px|link=http://wikisource.org|logo Wikisource]] | கட்டற்ற மூலங்களைக் கொண்ட '''[http://wikisource.org/ விக்கிமூலம்]''' | align="center" | [[File:MediaWiki-logo.svg|35x35px|link=http://mediawiki.org|logo MediaWiki]] | '''[http://mediawiki.org/ மீடியாவிக்கி]''' மென்பொருள் |- | align="center" | [[File:Wikiversity-logo.svg|35x35px|link=http://www.wikiversity.org|logo Wikiversity]] | கட்டற்ற கல்வி ஆதாரங்களைக் கொண்ட '''[http://www.wikiversity.org/ விக்கிப்பல்கலைக்கழகம்]''' | align="center" | [[File:Commons-logo.svg|35x35px|link=http://commons.wikimedia.org|logo Commons]] | கட்டற்ற ஊடகங்களை கொண்ட'''[http://commons.wikimedia.org/ விக்கிப் பொதுவகம்]''' | align="center" | [[File:Wikimedia Community Logo.svg|35x35px|link=http://meta.wikimedia.org|logo Meta-Wiki]] | விக்கிமீடியத் திட்டங்களின் கூட்டமைப்பான '''[http://meta.wikimedia.org/ மேல் விக்கி]''' | align="center" | [[File:Wikidata-logo.svg|35x35px|link=http://www.wikidata.org|logo Wikidata]] | கட்டற்ற தரவுகளைக் கொண்ட '''[http://www.wikidata.org/ விக்கித்தரவு]''' |}</div> {{HomePages}} [[Category:Article Feedback Pilot]] tinf4wmxcr112t79rcgtkzb1l0mzdz5 Ariana Grande 0 106204 739120 675953 2026-04-22T19:38:13Z ~2026-24668-01 73666 739120 wikitext text/x-wiki {{Short description|American singer and actress (born 1993)}} {{Use American English|date=January 2024}} {{Use mdy dates|date=February 2026}} {{Infobox person | name = Ariana Grande | image = Ariana Grande promoting Wicked (2024).jpg | alt = Ariana Grande in 2024, wearing pink suit while promoting the film Wicked | caption = Grande in 2024 | birth_name = <!-- Do not delete "Butera". This is for her birth name, not her stage name. --> Ariana Grande-Butera | birth_date = {{Birth date and age|1993|6|26}} | birth_place = [[Boca Raton, Florida]], U.S. | occupation = {{flatlist| * Singer * songwriter * actress }} | organization = [[R.E.M. Beauty]] | years_active = 2008–present | spouse = {{marriage|Dalton Gomez|2021|2024|end=divorced}} | works = {{hlist|[[Ariana Grande discography|Discography]]|[[List of songs recorded by Ariana Grande|songs recorded]]|[[Ariana Grande videography|videography]]|[[List of Ariana Grande live performances|performances]]}} | relatives = [[Frankie Grande]] (half-brother) | awards = [[List of awards and nominations received by Ariana Grande|Full list]] | signature = Ariana Grande autograph.svg | module = {{Infobox musical artist|embed=yes | instruments = Vocals | genre = {{hlist|[[Pop music|Pop]]|[[Contemporary R&B|R&B]]}}<!--Reliable sources must classify artist/their overall music as listed genre(s)--> | label = {{hlist|[[Republic Records|Republic]]}} }} | website = {{URL|https://arianagrande.com/}} }} '''Ariana Grande-Butera'''<!-- Do NOT delete "Butera" here. This is for her full name, not her stage name. Please provide a reliable, independent source when changing her name. --> ({{IPAc-en|ˌ|ɑr|i|ˈ|ɑː|n|ə|_|ˈ|ɡ|r|ɑː|n|d|ei|_|b|j|ʊ|ˈ|t|ɛ|ə|r|ə|audio=LL-Q1860 (eng)-Flame, not lame-Ariana Grande.wav}} {{Respell|AR|ee|AH|nə|_|GRAHN|day|_|byuu|TAIR|ə}};{{notetag|Grande pronounces her surname with the final syllable being similar to the pronunciation for "day". She explained in an interview for [[Beats 1]] that the pronunciation with the final syllable like "dee" was used by her grandfather.<ref>{{cite web |url=https://music.apple.com/us/station/the-ariana-grande-interview/ra.1430351850 |title=The Ariana Grande Interview |work=Beats 1 |via=Apple Music |last=Darden |first=Ebro |access-date=June 1, 2022 |archive-date=June 1, 2022 |archive-url=https://web.archive.org/web/20220601220004/https://music.apple.com/us/station/the-ariana-grande-interview/ra.1430351850 |url-status=live}}</ref>}} born June 26, 1993) is an American singer, songwriter, and actress.<!--NOTE: Only include occupation(s) that reliable sources consider notable/integral to artist's career --> Known for her four-octave [[vocal range]], which extends into the [[whistle register]], she is regarded as an influential figure in [[popular music]]. Publications such as ''[[Rolling Stone]]'' and [[Billboard (magazine)|''Billboard'']] have deemed Grande one of the greatest artists in history, while ''[[Time (magazine)|Time]]'' included her on its list of the world's [[Time 100|100 most influential people]] in 2016 and 2019. Grande's career began as a teenager in the [[Broadway theatre|Broadway]] musical ''[[13 (musical)|13]]'' (2008) before she gained prominence as [[Cat Valentine (Victorious)|Cat Valentine]] in the [[Nickelodeon]] television series ''[[Victorious]]'' (2010–2013) and its spin-off ''[[Sam & Cat]]'' (2013–2014). After signing with [[Republic Records]], she released her debut studio album, ''[[Yours Truly (Ariana Grande album)|Yours Truly]]'' (2013), a [[retro]]-inspired [[pop music|pop]] and [[Contemporary R&B|R&B]] record that debuted atop the [[Billboard 200|''Billboard'' 200]]. She incorporated elements of [[electronic music|electronic]] on her next two albums, ''[[My Everything (Ariana Grande album)|My Everything]]'' (2014) and ''[[Dangerous Woman]]'' (2016), which both achieved international success, spawning the singles "[[Problem (Ariana Grande song)|Problem]]", "[[Break Free (song)|Break Free]]", "[[Bang Bang (Jessie J, Ariana Grande and Nicki Minaj song)|Bang Bang]]", "[[One Last Time (Ariana Grande song)|One Last Time]]", "[[Into You (Ariana Grande song)|Into You]]", and "[[Side to Side]]". Personal struggles influenced Grande's albums ''[[Sweetener (album)|Sweetener]]'' (2018) and ''[[Thank U, Next]]'' (2019), both of which delved into [[trap music|trap]]. The latter garnered the US [[Billboard Hot 100|''Billboard'' Hot 100]] number-one singles "[[Thank U, Next (song)|Thank U, Next]]" and "[[7 Rings]]". With the [[Positions (song)|title track]] of her R&B-infused album ''[[Positions (album)|Positions]]'' (2020), as well as the collaborations "[[Stuck with U]]" and "[[Rain on Me (Lady Gaga and Ariana Grande song)|Rain on Me]]", she achieved the [[List of Billboard Hot 100 chart achievements and milestones#Most number-one debuts|most number-one debuts]] in the US. After a musical hiatus, she explored [[dance music|dance]] on ''[[Eternal Sunshine (album)|Eternal Sunshine]]'' (2024), which yielded the US number-one songs "[[Yes, And?]]" and "[[We Can't Be Friends (Wait for Your Love)]]". She returned to acting with the political satire ''[[Don't Look Up]]'' (2021) and portrayed [[Glinda]] in the fantasy musical film ''[[Wicked (2024 film)|Wicked]]'' (2024), which earned her an [[Academy Award]] nomination, as well as its sequel ''[[Wicked: For Good]]'' (2025). Grande is one of the [[List of best-selling music artists#80 million to 99 million records|best-selling music artists of all time]], with estimated sales of over 90 million records. The [[Forbes list of the world's highest-paid musicians#Female|highest-paid female musician]] in 2020, [[List of awards and nominations received by Ariana Grande|her accolades]] include three [[Grammy Awards]], a [[Brit Award]], two [[Billboard Music Awards|''Billboard'' Music Awards]], three [[American Music Awards]], forty ''[[Guinness World Records]]'', and thirteen [[MTV Video Music Awards]]. Six of Grande's albums have reached number one on the ''Billboard'' 200, while nine of her songs have topped the ''Billboard'' Hot 100. Outside of music and acting, she has worked with many charitable organizations and advocates for [[animal rights]], [[mental health]], and [[Gender equality|gender]], [[Racial equality|racial]], and [[LGBT rights in the United States|LGBT equality]]. Her business ventures include the cosmetics brand [[R.E.M. Beauty]] and a fragrance line that has earned over $1 billion in global retail sales. She has a large social media following, being the [[List of most-followed Instagram accounts|sixth-most-followed individual]] on [[Instagram]]. {{TOC limit|4}} == Early life == Ariana Grande-Butera was born on June 26, 1993, in [[Boca Raton, Florida]].<ref name="AllMusicBio">{{cite web |url=https://www.allmusic.com/artist/ariana-grande-mn0002264745/biography |title=Ariana Grande Biography |author-link=Stephen Thomas Erlewine |first=Stephen Thomas |last=Erlewine |publisher=[[AllMusic]] |access-date=August 28, 2014 |archive-date=May 2, 2019 |archive-url=https://web.archive.org/web/20190502120402/https://www.allmusic.com/artist/ariana-grande-mn0002264745/biography |url-status=live}}{{bsn|date=March 2026}}</ref> She is the daughter of Joan Grande, the [[Brooklyn]]-born CEO of Hose-McCann Communications, a manufacturer of marine communications equipment owned by the Grande family since 1964,<ref name=CoolDiva>{{cite news |last=McLean |first=Craig |date=October 17, 2014 |title=Ariana Grande: 'If you want to call me a diva I'll say: cool' |url=https://www.telegraph.co.uk/culture/music/11159510/Ariana-Grande-interview-Big-Sean-diva.html |url-status=live |archive-url=https://web.archive.org/web/20141208054853/https://www.telegraph.co.uk/culture/music/11159510/Ariana-Grande-interview-Big-Sean-diva.html |archive-date=December 8, 2014 |access-date=October 20, 2015 |newspaper=[[The Daily Telegraph]]}}</ref> and Edward Butera, a graphic design firm owner in Boca Raton.<ref name="DailyNews1">{{cite news |last=Farber |first=Jim |title=Ariana Grande owes her stardom to singing, not sex appeal |url=http://www.nydailynews.com/entertainment/ariana-grande-owes-stardom-singing-not-sex-appeal-article-1.1902829 |newspaper=[[New York Daily News]] |date=August 14, 2014 |access-date=February 7, 2015 |archive-url=https://web.archive.org/web/20160130010137/http://www.nydailynews.com/entertainment/ariana-grande-owes-stardom-singing-not-sex-appeal-article-1.1902829 |archive-date=January 30, 2016 |url-status=live}}</ref><ref name="BillboardFreaky">{{cite magazine |last=Goodman |first=Lizzy |title=''Billboard'' Cover: Ariana Grande on Fame, Freddy Krueger and Her Freaky Past |url=https://www.billboard.com/articles/news/6221482/billboard-cover-ariana-grande-on-fame-freddy-krueger-and-her-freaky-past |magazine=[[Billboard (magazine)|Billboard]] |date=August 15, 2014 |access-date=September 1, 2014 |archive-url=https://web.archive.org/web/20141206040004/https://www.billboard.com/articles/news/6221482/billboard-cover-ariana-grande-on-fame-freddy-krueger-and-her-freaky-past |archive-date=December 6, 2014 |url-status=live}}</ref> Grande is of Italian<ref name="Savage">{{cite news |last=Savage |first=Mark |url=https://www.bbc.com/news/entertainment-arts-40005064 |title=Ariana Grande: The diva with a heart |publisher=[[BBC]] |date=May 23, 2017 |access-date=October 25, 2017 |archive-url=https://web.archive.org/web/20170524080653/https://www.bbc.com/news/entertainment-arts-40005064 |archive-date=May 24, 2017 |url-status=live}}</ref> descent and has described herself as an Italian American with [[Sicilians|Sicilian]] and [[Abruzzo|Abruzzese]] roots.<ref>{{cite tweet |url=https://mobile.twitter.com/arianagrande/status/40266680152240128 |user=ArianaGrande |number=40266680152240128 |date=February 22, 2011 |last=Grande |first=Ariana |title=I am Italian American, half Sicilian and half Abruzzese xx RT @_mylifestory @ArianaGrande What is your nationality? :) |access-date=November 29, 2018 |archive-url=https://web.archive.org/web/20150724112011/https://twitter.com/ArianaGrande/status/40266680152240128 |archive-date=July 24, 2015 }}</ref> She has an older half-brother, [[Frankie Grande]], who is an entertainer and producer.<ref>{{cite news |last=Gonzales |first=Erica |url=http://www.harpersbazaar.com/celebrity/latest/news/a19403/ariana-grande-reaction-frankie-grade-gay |title=Ariana Grande Had the Perfect Response When Her Brother Came Out |work=[[Harpers Bazaar]] |date=December 14, 2016 |archive-url=https://web.archive.org/web/20161215123806/http://www.harpersbazaar.com/celebrity/latest/news/a19403/ariana-grande-reaction-frankie-grade-gay/ |archive-date=December 15, 2016 |access-date=December 14, 2016 |url-status=live}}</ref> Her family moved from New York to Florida before her birth, and her parents separated when she was eight or nine years old.<ref name="BillboardFreaky"/> Grande had a close relationship with her maternal grandmother, Marjorie Grande.<ref>{{Cite news |title=Ariana Grande had the cutest date at the AMAs: Her Grandma! |url=http://www.people.com/article/ariana-grande-grandmother-nonna-steals-show-at-the-american-music-awards |archive-url=https://web.archive.org/web/20151126043141/http://www.people.com/article/ariana-grande-grandmother-nonna-steals-show-at-the-american-music-awards |archive-date=November 26, 2015 |access-date=November 25, 2015 |work=[[People (magazine)|People]]}}</ref> At age eight, she sang "[[The Star-Spangled Banner]]" at the [[Florida Panthers]]'s home game against the [[Chicago Blackhawks]] on January 16, 2002.<ref>{{cite AV media |url=https://www.youtube.com/watch?v=QEwwhklDbVo |title=Ariana Grande at 8 years old singing National Anthem (via Ariana Grande Official Artist Channel) |via=[[YouTube]] |access-date=October 28, 2021 |date=June 8, 2011 |archive-url=https://web.archive.org/web/20221220120825/https://www.youtube.com/watch?v=QEwwhklDbVo |archive-date=December 20, 2022 |url-status=live}}</ref> As a young child, Grande performed with the [[Fort Lauderdale]] Children's Theater,<ref>{{cite news |last=Geggis |first=Anne |date=August 31, 2012 |title=America's Tweetheart: Boca-born singer/actress big on Twitter |url=http://articles.sun-sentinel.com/2012-08-31/news/fl-boca-ariana-grande-20120830_1_twitter-nickelodeon-social-media |archive-url=https://web.archive.org/web/20180806182101/http://articles.sun-sentinel.com/2012-08-31/news/fl-boca-ariana-grande-20120830_1_twitter-nickelodeon-social-media |archive-date=August 6, 2018 |access-date=September 13, 2014 |work=[[South Florida Sun-Sentinel]] |location=Florida}}</ref> playing her first role as the title character in the musical ''[[Annie (musical)|Annie]]''. She also performed in their productions of ''[[Adaptations of The Wizard of Oz|The Wizard of Oz]]'' and ''[[Beauty and the Beast (musical)|Beauty and the Beast]]''.<ref name="Savage"/><ref name="Complex">{{cite magazine |last=Nostro |first=Lauren |title=Who Is Ariana Grande? – Growing Up and Starting to Sing |url=http://www.complex.com/music/2013/08/who-is-ariana-grande/growing-up-and-starting-to-sing |magazine=Complex |access-date=June 11, 2014 |archive-date=July 19, 2019 |archive-url=https://web.archive.org/web/20190719140117/https://www.complex.com/music/2013/08/who-is-ariana-grande/growing-up-and-starting-to-sing |url-status=live}}</ref> At age eight, she performed at a karaoke lounge on a cruise ship and with orchestras such as South Florida's Philharmonic, Florida Sunshine Pops and Symphonic Orchestras.<ref name="AboutGrande">{{cite web |title=About Ariana Grande |url=http://www.mtv.com/artists/ariana-grande/biography/ |archive-url=https://web.archive.org/web/20170216080254/http://www.mtv.com/artists/ariana-grande/biography/ |archive-date=February 16, 2017 |access-date=August 28, 2014 |publisher=MTV}}</ref> During this time, she attended the [[Pine Crest School]] and later [[North Broward Preparatory]].<ref>{{cite magazine |last=Wilson |first=Olivia |url=http://www.teen.com/2014/12/09/celebrities/celebrities-who-went-to-boarding-prep-school/#1 |title=16 Celebrities You Didn't Know Went to Boarding or Prep School |magazine=[[Teen (magazine)|Teen]] |date=December 9, 2014 |access-date=May 31, 2016 |archive-url=https://web.archive.org/web/20170815024411/http://www.teen.com/2014/12/09/celebrities/celebrities-who-went-to-boarding-prep-school/#1 |archive-date=August 15, 2017 }}</ref> == Career == === 2008–2013: Career beginnings and Nickelodeon === {{Main|Victorious|l1=''Victorious''|Sam & Cat|l2=''Sam & Cat''}} When she first arrived in [[Los Angeles]], California, to meet with her managers, she expressed a desire to record an [[contemporary R&B|R&B]] album: "I was like, 'I want to make an R&B album,' They were like 'Um, that's a helluva goal! Who is going to buy a 14-year-old's R&B album?!'"<ref name="BillboardFreaky"/> In 2008, Grande was cast as cheerleader Charlotte in the Broadway musical ''[[13 (musical)|13]]''.<ref>{{cite news |url=https://www.nytimes.com/2008/10/06/theater/reviews/06bran.html |title=Stranger in Strange Land: The Acne Years |newspaper=[[The New York Times]] |last=Brantley |first=Ben |date=October 6, 2008 |access-date=September 11, 2014 |archive-date=February 9, 2018 |archive-url=https://web.archive.org/web/20180209162616/http://www.nytimes.com/2008/10/06/theater/reviews/06bran.html |url-status=live}}</ref><ref>{{cite magazine |url=http://www.timeforkids.com/news/ariana-grande/133541 |title=Ariana Grande |magazine=[[Time for Kids]] |date=December 5, 2013 |access-date=September 7, 2014 |archive-url=https://web.archive.org/web/20131218235254/https://www.timeforkids.com/news/ariana-grande/133541/ |archive-date=December 18, 2013}}</ref> [[File:Ariana Grande by David Shankbone (cropped).jpg|thumb|upright|Grande at the 2010 [[Tribeca Film Festival]]]] Grande was cast in the [[Nickelodeon]] television show ''[[Victorious]]'' along with ''13'' co-star [[Elizabeth Gillies]] in 2009.<ref name="Liz2009">{{cite magazine |url=http://www.seventeen.com/cosmogirl/five-questions-elizabeth-gillies |title=Elizabeth Gillies from Victorious Interview |last=Brown |first=Lauren |magazine=[[Seventeen (American magazine)|Seventeen]] |date=April 21, 2010 |access-date=August 30, 2014 |archive-date=September 3, 2014 |archive-url=https://web.archive.org/web/20140903232248/http://www.seventeen.com/cosmogirl/five-questions-elizabeth-gillies |url-status=live}}</ref> In the sitcom, set at a [[performing arts]] high school, she played the "adorably dimwitted" [[List of Victorious characters#Cat Valentine|Cat Valentine]].<ref name="Savage"/><ref name="Liz2009"/> She had to dye her hair red every other week for the role, which damaged it.<ref>{{cite magazine |url=https://www.allure.com/story/ariana-grande-hair-down-no-ponytail-photos |title=Ariana Grande Wore Her Hair Down Again, and Fans Still Can't Handle It |magazine=[[Allure (magazine)|Allure]] |last=Mueller |first=Marissa G. |date=June 7, 2019 |quote=Since people give me such a hard time about my hair I thought I'd take the time to explain the whole situation to everybody," she wrote on Facebook. "I had to bleach my hair and dye it red every other week for the first 4 years of playing Cat... as one would assume, that completely destroyed my hair. |access-date=December 23, 2019 |archive-date=December 23, 2019 |archive-url=https://web.archive.org/web/20191223183214/https://www.allure.com/story/ariana-grande-hair-down-no-ponytail-photos |url-status=live}}</ref> The show premiered in March 2010 to the second-largest audience for a live-action series in Nickelodeon, with 5.7 million viewers.<ref>{{cite news |url=https://www.nytimes.com/2010/03/26/arts/television/26victor.html |title=First the Tween Heart, Now the Soul |last=Wyatt |first=Edward |newspaper=The New York Times |date=March 25, 2010 |access-date=August 30, 2014 |archive-date=June 17, 2012 |archive-url=https://web.archive.org/web/20120617164647/http://www.nytimes.com/2010/03/26/arts/television/26victor.html |url-status=live}}</ref><ref name="rat2">{{cite web |last=Seidman |first=Robert |date=March 29, 2010 |title=Nickelodeon Scores 2nd Biggest "Kids' Choice Awards"; "Victorious" Bows to 5.7 Million |url=http://tvbythenumbers.zap2it.com/2010/03/29/nickelodeon-scores-2nd-biggest-kids-choice-awards-victorious-bows-to-5-7-million/46493/ |archive-url=https://web.archive.org/web/20150711234226/http://tvbythenumbers.zap2it.com/2010/03/29/nickelodeon-scores-2nd-biggest-kids-choice-awards-victorious-bows-to-5-7-million/46493/ |archive-date=July 11, 2015 |access-date=September 3, 2014 |publisher=TV by the Numbers}}</ref> The role helped propel Grande to [[teen idol]] status, but she was more interested in a music career, saying that acting is "fun, but music has always been first and foremost with me."<ref>{{cite magazine |last=Greene |first=Andy |title=How Ariana Grande and Max Martin Made 'Problem' the Song of the Summer |url=https://www.rollingstone.com/music/news/how-ariana-grande-and-max-martin-made-problem-the-song-of-the-summer-20140522 |magazine=[[Rolling Stone]] |date=May 22, 2014 |access-date=September 2, 2014 |archive-date=April 7, 2018 |archive-url=https://web.archive.org/web/20180407224107/https://www.rollingstone.com/music/news/how-ariana-grande-and-max-martin-made-problem-the-song-of-the-summer-20140522 }}</ref> After the first season of ''Victorious'' wrapped, Grande wanted to focus on her music career and began working on her debut album in August 2010.<ref>{{cite web |last=Hyman |first=Dan |title=Life Is Grande: Ariana Grande On Her Debut Album and the Thrill of Hearing Herself on the Radio |url=http://www.elle.com/news/culture/ariana-grande-interview |website=[[Elle (magazine)|Elle]] |date=August 22, 2013 |access-date=August 30, 2014 |archive-date=November 8, 2014 |archive-url=https://web.archive.org/web/20141108153902/http://www.elle.com/news/culture/ariana-grande-interview |url-status=live}}</ref> The second season premiered in April 2011 to 6.2 million viewers, becoming the show's highest-rated episode.<ref>{{cite web |last=Seidman |first=Robert |title=Cable Top 25: 'Kids' Choice Awards,' 'Pawn Stars,' 'WWE RAW' and 'Victorious' Top Weekly Cable Viewing |url=http://tvbythenumbers.zap2it.com/2011/04/05/cable-top-25-kids-choice-awards-pawn-stars-wwe-raw-and-victorious-top-weekly-cable-viewing/88284/ |archive-url=https://web.archive.org/web/20110408070942/http://tvbythenumbers.zap2it.com/2011/04/05/cable-top-25-kids-choice-awards-pawn-stars-wwe-raw-and-victorious-top-weekly-cable-viewing/88284 |archive-date=April 8, 2011 |publisher=[[TV by the Numbers]] |date=April 5, 2011 |access-date=September 3, 2014}}</ref> In May 2011, Grande appeared in [[Greyson Chance]]'s video for the song "Unfriend You" from his album ''[[Hold On 'til the Night]]'' (2011), portraying his ex-girlfriend. She made her first musical appearance on the track "Give It Up" from the [[Victorious: Music from the Hit TV Show|''Victorious'' soundtrack]] in August 2011. While filming ''Victorious'', Grande made several recordings of herself singing covers of songs by [[Adele]], [[Whitney Houston]] and [[Mariah Carey]], and uploaded them to [[YouTube]].<ref name="GrandeDeal">{{cite news |url=https://www.reuters.com/article/2011/08/11/idUS232814+11-Aug-2011+BW20110811$495411498 |title=Universal Republic Records Announces the Signing of Ariana Grande |work=Reuters |date=August 11, 2011 |access-date=August 29, 2014 |archive-url=https://web.archive.org/web/20141026170358/http://www.reuters.com/article/2011/08/11/idUS232814+11-Aug-2011+BW20110811$495411498 |archive-date=October 26, 2014}}</ref> A friend of [[Monte Lipman]], chief executive officer (CEO) of [[Republic Records]], came across one of the videos. Impressed by her vocals, he sent the links to Lipman, who signed her to a recording contract.<ref name="BillboardFreaky"/> Grande voiced the title role in the English dub of the [[Spanish-language]] animated film ''[[Snowflake, the White Gorilla]]'' in November 2011.<ref>{{cite web |last=Dinh |first=James |title=Greyson Chance Gets Revenge In 'Unfriend You' Video |url=http://www.mtv.com/news/1666573/greyson-chance-unfriend-you-video/ |publisher=[[MTV]] |date=June 28, 2011 |access-date=July 10, 2015 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319213315/http://www.mtv.com/news/1666573/greyson-chance-unfriend-you-video/ }}</ref><ref name="Spanos7">{{cite magazine |last=Spanos |first=Brittany |url=https://www.rollingstone.com/music/lists/ariana-grande-7-forgotten-screen-cameos-20160520/snowflake-the-white-gorilla-2011-20160520 |title=Ariana Grande: 7 Forgotten Screen Cameos |magazine=[[Rolling Stone]] |date=May 20, 2016 |access-date=August 24, 2017 |archive-date=August 31, 2017 |archive-url=https://web.archive.org/web/20170831132453/https://www.rollingstone.com/music/lists/ariana-grande-7-forgotten-screen-cameos-20160520/snowflake-the-white-gorilla-2011-20160520 |url-status=live}}</ref> From 2011 to 2013, she was cast in the role of fairy Princess Diaspro in the [[List of Winx Club episodes#Revived series 2|Nickelodeon revival]] of ''[[Winx Club]]''.<ref>{{cite press release |url=http://www.thefutoncritic.com/news/2011/06/09/global-hit-animated-series-winx-club-comes-to-nickelodeon-starting-monday-june-27-at-8-pm-219312/20110609nickelodeon01/ |title=Global hit animated series 'Winx Club' comes to Nickelodeon, starting Monday, June 27, at 8pm |via=[[The Futon Critic]] |date=June 9, 2011 |author=Nickelodeon |access-date=August 13, 2016 |archive-date=September 11, 2020 |archive-url=https://web.archive.org/web/20200911034336/http://www.thefutoncritic.com/news/2011/06/09/global-hit-animated-series-winx-club-comes-to-nickelodeon-starting-monday-june-27-at-8-pm-219312/20110609nickelodeon01/ |url-status=live}}</ref> In December 2011, Grande released her first single, "[[Put Your Hearts Up]]", which was recorded for a potential teen-oriented pop album that was never issued. She later disowned the track for its [[bubblegum pop]] sound, saying she had no interest in recording music of that genre.<ref name="AllMusicBio"/> The song was later certified Gold by the [[Recording Industry Association of America]] (RIAA).<ref>{{cite web |url=https://www.riaa.com/gold-platinum/?tab_active=default-award&ar=ARIANA+GRANDE&ti=PUT+YOUR+HEARTS+UP |title=Put Your Hearts Up – RIAA's Gold & Platinum Program searchable database |publisher=Recording Industry Association of America |access-date=March 31, 2016 |archive-date=October 9, 2016 |archive-url=https://web.archive.org/web/20161009205906/http://www.riaa.com/gold-platinum/?tab_active=default-award&ar=Ariana+Grande&ti=Put+Your+Hearts+Up |url-status=live}}</ref> On a second soundtrack, ''[[Victorious 2.0]]'', released on June 5, 2012, as an [[extended play]], she supplied vocals as part of the show's cast for the song "5 Fingaz to the Face".<ref>{{cite web |url=https://www.allmusic.com/album/victorious-20-more-music-from-the-hit-tv-show-original-tv-soundtrack-mw0002392649 |title=Victorious 2.0: More Music from the Hit TV Show |last=Phares |first=Heather |publisher=[[AllMusic]] |date=June 5, 2012 |access-date=August 31, 2014 |archive-date=April 3, 2019 |archive-url=https://web.archive.org/web/20190403231415/https://www.allmusic.com/album/victorious-20-more-music-from-the-hit-tv-show-original-tv-soundtrack-mw0002392649 |url-status=live}}</ref> The third and final soundtrack, ''[[Victorious 3.0]]'', was released on November 6, 2012, which featured a duet by Grande and [[Victoria Justice]] titled "[[L.A. Boyz (song)|L.A. Boyz]]", with an accompanying music video being released shortly after.<ref>{{cite web |url=http://www.nick.com/videos/clip/victorious-la-boyz-music-video.html |archive-url=https://web.archive.org/web/20141016121251/http://www.nick.com/videos/clip/victorious-la-boyz-music-video.html |archive-date=October 16, 2014 |title=Victoria Justice & Ariana Grande: "L.A. Boyz" |publisher=[[Nick.com]] |access-date=August 31, 2014}}</ref> In December 2012, Grande collaborated on the single version of "[[Popular Song (Mika song)|Popular Song]]", a duet with British singer and songwriter [[Mika (singer)|Mika]].<ref>{{cite news |last=Depland |first=Michael |date=April 29, 2013 |title=New Video: Mika Featuring Ariana Grande, 'Popular Song' |publisher=[[MTV]] |url=http://buzzworthy.mtv.com/2013/04/29/mika-ariana-grande-popular-song-video/ |access-date=May 5, 2013 |archive-date=May 3, 2013 |archive-url=https://web.archive.org/web/20130503012439/http://buzzworthy.mtv.com/2013/04/29/mika-ariana-grande-popular-song-video }}</ref> After four seasons, ''Victorious'' was not renewed,<ref>{{cite web |date=August 11, 2012 |title='Victorious': Nickelodeon Cancels Victoria Justice Series After 3 Seasons |url=https://www.huffingtonpost.com/2012/08/11/victorious-cancelled-nickelodeon_n_1768125.html |url-status=live |archive-url=https://web.archive.org/web/20170707202840/http://www.huffingtonpost.com/2012/08/11/victorious-cancelled-nickelodeon_n_1768125.html |archive-date=July 7, 2017 |access-date=September 14, 2014 |work=[[HuffPost]]}}</ref> with the finale airing in February 2013. Grande starred as [[Snow White]] in the [[pantomime]]-style musical theatre production ''[[A Snow White Christmas (musical)|A Snow White Christmas]]'' with [[Charlene Tilton]] and [[Neil Patrick Harris]] at the [[Pasadena Playhouse]].<ref>{{Cite web |last=Denette |first=Kelsey |title=Ariana Grande, Charlene Tilton and Neil Patrick Harris Headline A Snow White Christmas at Pasadena Playhouse, 12/13-23 |url=https://www.broadwayworld.com/los-angeles/article/Ariana-Grande-Charlene-Tilton-and-Neil-Patrick-Harris-Headline-A-SNOW-WHITE-CHRISTMAS-at-Pasadena-Playhouse-1213-23-20120907 |archive-url=https://web.archive.org/web/20131013014801/https://www.broadwayworld.com/los-angeles/article/Ariana-Grande-Charlene-Tilton-and-Neil-Patrick-Harris-Headline-A-SNOW-WHITE-CHRISTMAS-at-Pasadena-Playhouse-1213-23-20120907 |archive-date=October 13, 2013 |access-date=April 1, 2024 |publisher=[[BroadwayWorld]]}}</ref>{{unreliable source|sure=yes|date=March 2026}} She played Amanda Benson in ''[[Swindle (2013 film)|Swindle]]'', a 2013 Nickelodeon film adaptation of the children's [[Swindle (novel)|book of the same name]].<ref name="Spanos7"/><ref>{{cite magazine |last=Marechal |first=AJ |date=October 3, 2012 |title=Nick stars set to 'Swindle' |url=https://variety.com/2012/tv/news/nick-stars-set-to-swindle-1118060202/ |url-status=live |archive-url=https://web.archive.org/web/20231026185028/https://variety.com/2012/tv/news/nick-stars-set-to-swindle-1118060202/ |archive-date=October 26, 2023 |access-date=February 27, 2013 |magazine=[[Variety (magazine)|Variety]]}}</ref> Meanwhile, Nickelodeon created ''[[Sam & Cat]]'', an ''[[iCarly]]'' and ''Victorious'' spin-off starring [[Jennette McCurdy]] and Grande.<ref>{{cite magazine |last=Snierson |first=Dan |date=August 2, 2012 |title=Nickelodeon greenlights spin-off pilots for 'iCarly,' 'Victorious' from creator Dan Schneider – EXCLUSIVE |url=http://insidetv.ew.com/2012/08/02/nickelodeon-icarly-spinoff-victorious/ |url-status=live |archive-url=https://web.archive.org/web/20141216025119/http://insidetv.ew.com/2012/08/02/nickelodeon-icarly-spinoff-victorious/ |archive-date=December 16, 2014 |access-date=September 3, 2014 |magazine=[[Entertainment Weekly]]}}</ref> Grande and McCurdy reprised their roles as Cat Valentine and [[Sam Puckett (iCarly Character)|Sam Puckett]] on the buddy sitcom, which paired the characters as roommates who form an after-school babysitting business.<ref>{{cite news |date=August 3, 2012 |title=Nickelodeon greenlights an 'iCarly' spinoff and other new shows |url=https://www.latimes.com/entertainment/tv/showtracker/la-et-st-nickelodeon-greenlights-icarly-spinoff-20120803,0,3715048.story |url-status=live |archive-url=https://web.archive.org/web/20120807002502/http://www.latimes.com/entertainment/tv/showtracker/la-et-st-nickelodeon-greenlights-icarly-spinoff-20120803,0,3715048.story |archive-date=August 7, 2012 |access-date=August 12, 2012 |newspaper=Los Angeles Times}}</ref> === 2013–2015: ''Yours Truly'' and ''My Everything'' === {{Main|Yours Truly (Ariana Grande album)|l1=''Yours Truly'' (Ariana Grande album)|My Everything (Ariana Grande album)|l2=''My Everything'' (Ariana Grande album)}} [[File:ArianaGrandeDecember2013 ohne Hintergrund.jpg|thumb|left|upright|Grande in 2013]] Grande released her debut album, ''Yours Truly'', on August 30, 2013.<ref name="itunesgb">{{cite web |last=Grande |first=Ariana |date=August 30, 2013 |title=Yours Truly |url=https://music.apple.com/gb/album/yours-truly/685617992 |archive-url=https://web.archive.org/web/20131014170604/https://itunes.apple.com/gb/album/yours-truly/id685617992 |archive-date=October 14, 2013 |access-date=August 3, 2021 |url-status=live |publisher=[[iTunes Store]]}}</ref> A pop and [[contemporary R&B|R&B]] record influenced by 1950s [[doo-wop]], ''Yours Truly'' debuted at number one on the US [[Billboard 200|''Billboard'' 200]] albums chart, with 138,000 copies sold in its first week.<ref>{{cite magazine |url=https://pitchfork.com/reviews/albums/18591-ariana-grande-yours-truly/ |title=Ariana Grande Yours Truly |last=Ryce |first=Andre |magazine=[[Pitchfork (website)|Pitchfork]] |access-date=June 7, 2020 |date=September 23, 2013 |archive-url=https://web.archive.org/web/20131124214449/https://pitchfork.com/reviews/albums/18591-ariana-grande-yours-truly/ |archive-date=November 24, 2013 |url-status=live}}</ref><ref>{{cite magazine |last=Caulfield |first=Keith |title=Ariana Grande Debuts At No. 1 On ''Billboard'' 200 |url=https://www.billboard.com/articles/news/5687364/ariana-grande-debuts-at-no-1-on-billboard-200 |magazine=[[Billboard (magazine)|Billboard]] |date=September 11, 2013 |access-date=September 11, 2013 |archive-date=April 3, 2019 |archive-url=https://web.archive.org/web/20190403070409/https://www.billboard.com/articles/news/5687364/ariana-grande-debuts-at-no-1-on-billboard-200 |url-status=live}}</ref><ref>{{cite web |title=Ariana Grande, Tamar Braxton Score Top Debuts |url=http://www.rap-up.com/2013/09/11/ariana-grande-tamar-braxton-score-top-debuts/ |work=Rap-Up |date=September 11, 2014 |access-date=August 29, 2014 |archive-date=June 24, 2019 |archive-url=https://web.archive.org/web/20190624155737/https://www.rap-up.com/2013/09/11/ariana-grande-tamar-braxton-score-top-debuts/ |url-status=live}}</ref> ''Yours Truly'' also debuted in the top ten in several other countries, including Australia,<ref>{{cite web |title=Week Commencing 9 September, 2013 |url=http://www.ariacharts.com.au/chart/download/1478/albums |publisher=ARIA |archive-url=https://web.archive.org/web/20130921055715/http://www.ariacharts.com.au/chart/download/1478/albums |archive-date=September 21, 2013}}</ref> the UK,<ref>{{cite web |last=Lane |first=Daniel |title=The 1975 score debut Number 1 album |url=http://www.officialcharts.com/chart-news/the-1975-score-debut-number-1-album-2474/ |publisher=[[Official Charts Company]] |access-date=September 8, 2013 |archive-date=October 18, 2014 |archive-url=https://web.archive.org/web/20141018151324/http://www.officialcharts.com/chart-news/the-1975-score-debut-number-1-album-2474/ |url-status=live}}</ref> Ireland,<ref>{{cite web |url=http://www.chart-track.co.uk/index.jsp?c=p%252Fmusicvideo%252Fmusic%252Farchive%252Findex_test.jsp&ct=240002&arch=t&lyr=2013&year=2013&week=36 |title=GFK Chart-Track – Irish Album Chart 5 September 2013 |website=chart-track.co.uk |access-date=March 31, 2016 |archive-url=https://web.archive.org/web/20181214135218/http://www.chart-track.co.uk/index.jsp?c=p%2Fmusicvideo%2Fmusic%2Farchive%2Findex_test.jsp&ct=240002&arch=t&lyr=2013&year=2013&week=36 |archive-date=December 14, 2018 }}</ref> and the Netherlands.<ref>{{cite web |title=Yours Truly |url=http://www.dutchcharts.nl/showitem.asp?interpret=Ariana+Grande&titel=Yours+Truly&cat=a |publisher=Dutch Charts |access-date=November 15, 2014 |archive-date=November 29, 2019 |archive-url=https://web.archive.org/web/20191129164106/https://dutchcharts.nl/showitem.asp?interpret=Ariana+Grande&titel=Yours+Truly&cat=a |url-status=live}}</ref> Its lead single, "[[The Way (Ariana Grande song)|The Way]]", featuring [[Pittsburgh]] rapper [[Mac Miller]], debuted at number ten on the US [[Billboard Hot 100|''Billboard'' Hot 100]],<ref name="billboard1">{{cite magazine |url=https://www.billboard.com/articles/news/1555888/macklemore-ryan-lewis-top-hot-100-imagine-dragons-ariana-grande-hit-top-10 |title=Macklemore & Ryan Lewis Top Hot 100; Imagine Dragons, Ariana Grande Hit Top 10 |magazine=[[Billboard (magazine)|Billboard]] |date=February 16, 2008 |access-date=May 5, 2013 |archive-date=June 13, 2019 |archive-url=https://web.archive.org/web/20190613170813/https://www.billboard.com/articles/news/1555888/macklemore-ryan-lewis-top-hot-100-imagine-dragons-ariana-grande-hit-top-10 |url-status=live}}</ref> eventually peaking at number nine for two weeks.<ref>{{cite magazine |title=The song, featuring T.I. and Pharrell, zips 6–1 to become Thicke's first Hot 100 No. 1. Plus, Ariana Grande returns to the top 10 at a new peak and Miley Cyrus debuts at No. 11 |url=https://www.billboard.com/articles/news/1566519/robin-thickes-blurred-lines-hits-no-1-on-hot-100 |magazine=[[Billboard (magazine)|Billboard]] |date=June 12, 2013 |access-date=August 29, 2014 |archive-date=June 14, 2018 |archive-url=https://web.archive.org/web/20180614154532/https://www.billboard.com/articles/news/1566519/robin-thickes-blurred-lines-hits-no-1-on-hot-100 |url-status=live}}</ref> Grande was later sued by Minder Music for copying the line "What we gotta do right here is go back, back in time" from the 1972 song "[[Troglodyte (Cave Man)]]" by [[The Jimmy Castor Bunch]].<ref>{{cite web |title=Ariana Grande faces lawsuit over allegedly copying song lyrics |url=https://www.digitalspy.com/music/news/a538118/ariana-grande-faces-lawsuit-over-allegedly-copying-song-lyrics.html |last=Corner |first=Lewis |work=[[Digital Spy]] |date=December 13, 2013 |access-date=August 31, 2014 |archive-date=September 24, 2015 |archive-url=https://web.archive.org/web/20150924051923/http://www.digitalspy.com/music/news/a538118/ariana-grande-faces-lawsuit-over-allegedly-copying-song-lyrics.html |url-status=live}}</ref> The album's second single, "[[Baby I]]", was released in July.<ref>{{cite web |url=https://itunes.apple.com/us/album/baby-i-single/id675752389 |title=iTunes – Music – Baby I – Single by Ariana Grande |publisher=[[Apple Music]] |date=July 22, 2013 |access-date=September 1, 2013 |archive-url=https://web.archive.org/web/20130822154339/https://itunes.apple.com/us/album/baby-i-single/id675752389 |archive-date=August 22, 2013}}</ref> Its third single, "[[Right There (Ariana Grande song)|Right There]]", featuring [[Detroit]] rapper [[Big Sean]], was released in August 2013.<ref>{{cite magazine |url=https://www.billboard.com/music/music-news/ariana-grande-big-sean-masquerade-in-right-there-video-watch-5770708/ |title=Ariana Grande, Big Sean Masquerade in 'Right There' Video: Watch |last=Lipshutz |first=Jason |date=October 30, 2013 |magazine=[[Billboard (magazine)|Billboard]] |access-date=January 14, 2014 |archive-date=July 12, 2019 |archive-url=https://web.archive.org/web/20190712031345/https://www.billboard.com/articles/columns/pop-shop/5770708/ariana-grande-big-sean-masquerade-in-right-there-video-watch |url-status=live}}</ref> They respectively peaked at number 21 and 84 on the ''Billboard'' Hot 100.<ref>{{cite magazine |last=Lipshutz |first=Jason |title=Ariana Grande Unveils 'Yours Truly' Artwork, Confirms Release Date |url=https://www.billboard.com/music/music-news/ariana-grande-unveils-yours-truly-artwork-confirms-release-date-5380950/ |magazine=[[Billboard (magazine)|Billboard]] |date=July 31, 2013 |access-date=July 31, 2013 |archive-date=June 14, 2018 |archive-url=https://web.archive.org/web/20180614102412/https://www.billboard.com/articles/columns/pop-shop/5380950/ariana-grande-unveils-yours-truly-artwork-confirms-release-date |url-status=live}}</ref> Grande recorded the duet "[[Almost Is Never Enough]]" with [[Nathan Sykes]] of [[The Wanted]], which was released as a promotional single in August 2013. She also joined [[Justin Bieber]] on his [[Believe Tour]] for three shows and kicked off her own headlining mini-tour, [[The Listening Sessions]].<ref>{{cite web |url=http://www.mtv.com/news/1711445/ariana-grande-justin-bieber-believe-tour-prep/ |title=Ariana Grande 'Working Out A Lot' Before Justin Bieber Tour |last=Vena |first=Jocelyn |publisher=[[MTV]] |date=July 29, 2013 |access-date=August 30, 2014 |archive-date=September 12, 2019 |archive-url=https://web.archive.org/web/20190912203314/http://www.mtv.com/news/1711445/ariana-grande-justin-bieber-believe-tour-prep/ }}</ref> At the 2013 [[American Music Awards of 2013|American Music Awards]], she won the award for [[American Music Award for New Artist of the Year|New Artist of the Year]].<ref>{{cite magazine |url=http://music-mix.ew.com/2013/11/25/amas-2013-winners-list/ |title=AMAs 2013: See the complete winners list |magazine=Entertainment Weekly |date=November 25, 2013 |access-date=November 25, 2013 |archive-date=January 13, 2015 |archive-url=https://web.archive.org/web/20150113203900/http://music-mix.ew.com/2013/11/25/amas-2013-winners-list/ |url-status=live}}</ref><ref>{{cite magazine |last=Gallo |first=Phil |title=Ariana Grande, Taylor Swift Lead AMAs to Record Twitter Traffic (Exclusive) |url=https://www.billboard.com/articles/news/5800827/amas-twitter-traffic-ariana-grande-taylor-swift |magazine=[[Billboard (magazine)|Billboard]] |date=November 26, 2013 |access-date=December 15, 2013 |archive-date=July 9, 2018 |archive-url=https://web.archive.org/web/20180709075151/https://www.billboard.com/articles/news/5800827/amas-twitter-traffic-ariana-grande-taylor-swift |url-status=live}}</ref> She released a four-song Christmas EP, ''[[Christmas Kisses (EP)|Christmas Kisses]]'' in December 2013.<ref>{{cite web |url=http://www.digitalspy.co.uk/music/news/a529329/ariana-grande-to-release-new-music-in-the-lead-up-to-christmas.html |title=Ariana Grande to release new music in the lead-up to Christmas |work=[[Digital Spy]] |date=November 6, 2013 |access-date=August 30, 2014 |archive-date=September 24, 2015 |archive-url=https://web.archive.org/web/20150924155746/http://www.digitalspy.co.uk/music/news/a529329/ariana-grande-to-release-new-music-in-the-lead-up-to-christmas.html }}</ref> Grande received the Breakthrough Artist of the Year award from the [[Music Business Association]], recognizing her achievements throughout 2013.<ref name="BillArtist13">{{cite magazine |url=https://www.billboard.com/biz/articles/news/legal-and-management/6052301/ariana-grande-to-be-awarded-breakthrough-artist-of |title=Ariana Grande to be Awarded 'Breakthrough Artist of the Year' by Music Business Association |last=Trakin |first=Roy |date=April 14, 2014 |magazine=[[Billboard (magazine)|Billboard]] |access-date=August 30, 2014 |archive-date=January 27, 2015 |archive-url=https://web.archive.org/web/20150127075710/http://www.billboard.com/biz/articles/news/legal-and-management/6052301/ariana-grande-to-be-awarded-breakthrough-artist-of |url-status=live}}</ref> By January 2014, Grande had begun recording her second studio album, with singer-songwriter [[Ryan Tedder]] and record producers [[Benny Blanco]] and [[Max Martin]].<ref>{{cite web |url=http://www.musictimes.com/articles/3392/20140113/ariana-grande-twitter-announces-shes-working-second-album-studio.htm |title=Ariana Grande Twitter announces she's working on second album in studio |last=Menyes |first=Carolyn |date=January 13, 2014 |work=Music Times |access-date=January 14, 2014 |archive-date=April 5, 2019 |archive-url=https://web.archive.org/web/20190405004711/https://www.musictimes.com/articles/3392/20140113/ariana-grande-twitter-announces-shes-working-second-album-studio.htm |url-status=live}}</ref> The same month, she earned the Favorite Breakout Artist award at the [[40th People's Choice Awards|People's Choice Awards 2014]].<ref name="BillArtist13"/> In March 2014, Grande sang at the [[White House]] concert, "Women of Soul: In Performance at the White House".<ref>{{cite magazine |url=https://www.billboard.com/articles/news/5923162/aretha-franklin-ariana-grande-set-for-first-ladys-women-of-soul-concert |title=Aretha Franklin, Ariana Grande Set for First Lady's 'Women of Soul' Concert |date=March 4, 2014 |magazine=[[Billboard (magazine)|Billboard]] |access-date=March 5, 2014 |archive-date=July 9, 2018 |archive-url=https://web.archive.org/web/20180709084218/https://www.billboard.com/articles/news/5923162/aretha-franklin-ariana-grande-set-for-first-ladys-women-of-soul-concert |url-status=live}}</ref> The following month, President [[Barack Obama]] and First Lady [[Michelle Obama]] invited Grande again to perform at the White House for the [[Easter Egg Roll]] event.<ref>{{cite news |url=http://au.ibtimes.com/articles/549011/20140422/ariana-grande-without-knicker-easter-egg-roll.htm |title=Ariana Grande Sexy Legs on Display at Easter Egg Roll Event: Gushes About Jim Carrey |last=Singh |first=Sonalee |date=April 22, 2014 |newspaper=International Business Times |access-date=April 22, 2014 |archive-url=https://web.archive.org/web/20140424142618/http://au.ibtimes.com/articles/549011/20140422/ariana-grande-without-knicker-easter-egg-roll.htm |archive-date=April 24, 2014}}</ref>{{unreliable source|sure=yes|date=March 2026}} Grande released her second studio album ''[[My Everything (Ariana Grande album)|My Everything]]'' on August 25, 2014; it debuted atop the ''Billboard'' 200 with 169,000 copies and received generally positive reviews.<ref>{{cite news |date=September 3, 2014 |title=Ariana Grande scores second chart-topping album on Billboard 200 |work=Reuters |url=https://www.reuters.com/article/us-music-arianagrande-charts-idINKBN0GY2DQ20140903 |access-date=July 26, 2023 |archive-date=July 26, 2023 |archive-url=https://web.archive.org/web/20230726002854/https://www.reuters.com/article/us-music-arianagrande-charts-idINKBN0GY2DQ20140903 |url-status=live}}</ref><ref>Attributed to: * {{cite magazine |last=Sheffield |first=Rob |title=Ariana Grande's New Album: My Everything |url=https://www.rollingstone.com/music/albumreviews/ariana-grande-my-everything-20140826 |archive-url=https://web.archive.org/web/20180617093135/https://www.rollingstone.com/music/albumreviews/ariana-grande-my-everything-20140826 |archive-date=June 17, 2018 |access-date=August 23, 2014 |magazine=[[Rolling Stone]] |pages=59–60 |volume=August 28, 2014 |issue=1216 |issn=0035-791X}} * {{cite web |last=Wood |first=Mikael |date=August 29, 2014 |title=Review: Ariana Grande makes big things happen on 'My Everything' |url=http://www.latimes.com/entertainment/music/posts/la-et-ms-review-ariana-grande-makes-big-things-happen-on-my-everything-20140829-story.html |url-status=live |archive-url=https://web.archive.org/web/20141006215304/http://www.latimes.com/entertainment/music/posts/la-et-ms-review-ariana-grande-makes-big-things-happen-on-my-everything-20140829-story.html |archive-date=October 6, 2014 |access-date=August 30, 2014 |work=[[Los Angeles Times]]}} * {{cite web |last=Gardner |first=Elysa |date=August 25, 2014 |title=Ariana's 'My Everything' is all things to all fans |url=https://www.usatoday.com/story/life/music/2014/08/25/ariana-grande-my-everything-review-listen-up/14547907/ |url-status=live |archive-url=https://web.archive.org/web/20140825073145/http://www.usatoday.com/story/life/music/2014/08/25/ariana-grande-my-everything-review-listen-up/14547907/ |archive-date=August 25, 2014 |access-date=August 25, 2014 |newspaper=[[USA Today]]}} * {{cite web |last=Garvey |first=Meaghan |date=August 29, 2014 |title=Ariana Grande: My Everything &#124; Album Reviews |url=http://pitchfork.com/reviews/albums/19765-ariana-grande-my-everything/ |url-status=live |archive-url=https://web.archive.org/web/20140830043900/http://pitchfork.com/reviews/albums/19765-ariana-grande-my-everything/ |archive-date=August 30, 2014 |access-date=August 30, 2013 |website=[[Pitchfork (website)|Pitchfork]]}}</ref> She explored [[Electronic dance music|EDM]], [[dance-pop]], and [[Electro (music)|electro]] genres on the album.<ref>Attributed to: * {{cite magazine |title=My Everything – Billboard Review |url=http://www.billboard.com/articles/review/6229287/ariana-grande-my-everything-billboard-album-review |url-status=live |archive-url=https://web.archive.org/web/20180625133909/https://www.billboard.com/articles/review/6229287/ariana-grande-my-everything-billboard-album-review |archive-date=June 25, 2018 |access-date=November 6, 2016 |magazine=[[Billboard (magazine)|Billboard]]}} * {{cite news |title=Ariana Grande's 'My Everything': Album Review |url=http://www.nydailynews.com/entertainment/music/stars-ariana-grande-article-1.1912013 |url-status=live |archive-url=https://web.archive.org/web/20161107010724/http://www.nydailynews.com/entertainment/music/stars-ariana-grande-article-1.1912013 |archive-date=November 7, 2016 |access-date=November 6, 2016 |newspaper=[[New York Daily News]] |location=New York}} * {{cite news |last1=Sawdey |first1=Evan |date=August 25, 2014 |title=Ariana Grande: My Everything &#124; PopMatters |url=http://www.popmatters.com/review/185041-ariana-grande-my-everything |url-status=live |archive-url=https://web.archive.org/web/20160918071621/http://www.popmatters.com/review/185041-ariana-grande-my-everything/ |archive-date=September 18, 2016 |access-date=November 6, 2016 |work=[[PopMatters]]}} * {{cite magazine |last=Lipshutz |first=Jason |date=April 28, 2014 |title=Ariana Grande Talks 'Problem' Single & Second Album, Due Out August/September |url=https://www.billboard.com/music/music-news/ariana-grande-talks-problem-single-second-album-due-out-6070079/ |url-status=live |archive-url=https://web.archive.org/web/20140501095225/http://www.billboard.com/articles/columns/pop-shop/6070079/ariana-grande-talks-problem-single-second-album-due-out |archive-date=May 1, 2014 |access-date=June 29, 2014 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> Its lead single, "[[Problem (Ariana Grande song)|Problem]]" featuring Australian rapper [[Iggy Azalea]], peaked at number two on the ''Billboard'' Hot 100,<ref>{{cite magazine |last1=Trust |first1=Gary |title=Iggy Azalea Tops Hot 100 With 'Fancy,' Matches Beatles' Historic Mark |url=http://www.billboard.com/articles/news/6099390/iggy-azalea-tops-hot-100-fancy-matches-beatles |url-status=live |archive-url=https://web.archive.org/web/20150429012119/http://www.billboard.com/articles/news/6099390/iggy-azalea-tops-hot-100-fancy-matches-beatles |archive-date=April 29, 2015 |access-date=June 14, 2014 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> and became Grande's first number-one on [[UK singles chart|the UK]] and [[Official Aotearoa Music Charts|New Zealand singles]] charts.<ref>{{cite web |last=Lane |first=Dan |date=July 6, 2014 |url=http://www.officialcharts.com/chart-news/ariana-grande-earns-a-place-in-official-chart-history-with-problem-3146/ |title=Ariana Grande earns a place in Official Chart history with Problem |archive-url=https://web.archive.org/web/20170601175201/http://www.officialcharts.com/chart-news/ariana-grande-earns-a-place-in-official-chart-history-with-problem__4302/ |archive-date=June 1, 2017 |publisher=[[Official Charts Company]] |access-date=November 23, 2015}}</ref><ref>{{cite web |date=May 5, 2014 |title=NZ Top 40 Singles Chart |url=https://aotearoamusiccharts.co.nz/archive/singles/2014-05-02 |url-status=live |archive-url=https://web.archive.org/web/20140502133815/http://nztop40.co.nz/chart/singles?chart=2493 |archive-date=May 2, 2014 |access-date=May 2, 2014 |publisher=[[Recorded Music NZ]]}}</ref> Selling 438,000 digital copies in its opening week, it achieved the highest first-week sales numbers of 2014<ref>{{cite magazine |last=Trust |first=Gary |date=May 7, 2014 |title=Hot 100: John Legend's "All Of Me" Hits No. 1, Ariana Grande's "Problem" Debuts At No. 3 |url=http://www.billboard.com/articles/news/6077635/hot-100-john-legend-all-of-me-ariana-grande-iggy-azalea |url-status=live |archive-url=https://web.archive.org/web/20140510180721/http://www.billboard.com/articles/news/6077635/hot-100-john-legend-all-of-me-ariana-grande-iggy-azalea |archive-date=May 10, 2014 |access-date=May 7, 2014 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> and made Grande the youngest woman, at 20 years old, to debut with over 400,000 downloads at the time.<ref>{{cite magazine |last=Caulfield |first=Keith |title=Ariana Grande's 'Problem' Set for Record Sales Debut |url=http://www.billboard.com/articles/news/6077517/ariana-grande-problem-record-sales-debut-hot-100-chart |url-status=live |archive-url=https://web.archive.org/web/20180623010312/https://www.billboard.com/articles/news/6077517/ariana-grande-problem-record-sales-debut-hot-100-chart |archive-date=June 23, 2018 |access-date=May 6, 2014 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> "Problem" became 2014's eighth-best-selling digital single globally, with over 9 million copies sold, according to the [[International Federation of the Phonographic Industry]] (IFPI).<ref>{{cite web |date=April 14, 2015 |title=IFPI publishes Digital Music Report 2015 |url=http://www.ifpi.org/news/Global-digital-music-revenues-match-physical-format-sales-for-first-time |url-status=live |archive-url=https://web.archive.org/web/20150414194629/http://www.ifpi.org/news/Global-digital-music-revenues-match-physical-format-sales-for-first-time |archive-date=April 14, 2015 |access-date=April 15, 2015 |publisher=International Federation of the Phonographic Industry |page=12}}</ref> The album's second single, "[[Break Free (song)|Break Free]]", featuring German musician and producer [[Zedd]],<ref>{{cite magazine |url=https://www.billboard.com/music/music-news/ariana-grande-break-free-zedd-interview-video-new-single-problem-6128769/ |title=Ariana Grande's 'Break Free': Zedd Discusses The 'Problem' Follow-Up |last=Lipshutz |first=Jason |magazine=[[Billboard (magazine)|Billboard]] |date=June 23, 2014 |access-date=July 28, 2014 |archive-date=June 17, 2018 |archive-url=https://web.archive.org/web/20180617125940/https://www.billboard.com/articles/columns/pop-shop/6128769/ariana-grande-break-free-zedd-interview-video-new-single-problem |url-status=live}}</ref> was released on July 3 and reached number four in the United States.<ref name="TripleHot100">{{cite magazine |last=Trust |first=Gary |title=Ariana Grande, Iggy Azalea Triple Up In Hot 100's Top 10, MAGIC! Still No. 1 |url=https://www.billboard.com/articles/news/6221978/hot-100-ariana-grande-iggy-azalea-top-10-magic |magazine=[[Billboard (magazine)|Billboard]] |date=August 20, 2014 |access-date=August 20, 2014 |archive-date=June 13, 2018 |archive-url=https://web.archive.org/web/20180613083134/https://www.billboard.com/articles/news/6221978/hot-100-ariana-grande-iggy-azalea-top-10-magic |url-status=live}}</ref> She performed the song as the opening of the [[2014 MTV Video Music Awards]], and won [[Best Pop Video]] for "Problem".<ref>{{cite web |last=Ehrlich |first=Brenna |url=http://www.mtv.com/news/1909975/ariana-grande-best-pop-video-vma |title=Ponytail Princess Ariana Grande Wins Best Pop Video VMA |publisher=[[MTV]] |date=August 24, 2014 |access-date=September 2, 2014 |archive-date=September 16, 2019 |archive-url=https://web.archive.org/web/20190916084543/http://www.mtv.com/news/1909975/ariana-grande-best-pop-video-vma/ }}</ref> Grande and [[Nicki Minaj]] provided guest vocals on "[[Bang Bang (Jessie J, Ariana Grande and Nicki Minaj song)|Bang Bang]]", the lead single from [[Jessie J]]'s album ''[[Sweet Talker (Jessie J album)|Sweet Talker]]'',<ref>{{cite magazine |last=Lipshutz |first=Jason |title=Jessie J, Ariana Grande, Nicki Minaj Combine For 'Bang Bang' Single |url=https://www.billboard.com/music/music-news/jessie-j-ariana-grande-nicki-minaj-bang-bang-single-6141209/ |date=July 1, 2014 |magazine=[[Billboard (magazine)|Billboard]] |access-date=August 20, 2014 |archive-date=June 17, 2018 |archive-url=https://web.archive.org/web/20180617124228/https://www.billboard.com/articles/columns/pop-shop/6141209/jessie-j-ariana-grande-nicki-minaj-bang-bang-single |url-status=live}}</ref> which peaked at number one in the UK and at number three in the US.<ref name="TripleHot100"/> The song was added to the deluxe version of ''My Everything'', serving as the third single from the album.<ref>{{cite magazine |last=Crow |first=Jones |date=April 28, 2015 |title=Five Hits, One Album: The Strategy Behind Ariana Grande's Singles From 'My Everything' |url=https://www.billboard.com/pro/five-hits-one-album-the-strategy-behind-ariana-grandes-singles/ |access-date=September 6, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=March 25, 2024 |archive-url=https://web.archive.org/web/20240325010234/https://www.billboard.com/pro/five-hits-one-album-the-strategy-behind-ariana-grandes-singles/ |url-status=live}}</ref> It was certified diamond by the RIAA in May 2024, for selling over 10 million units in the US; it marked the first all-female collaboration to achieve the certification.<ref>{{Cite magazine |last=Trapp |first=Malcom |date=May 23, 2024 |title=Jessie J, Nicki Minaj, And Ariana Grande's 'Bang Bang' Becomes First All-Female Collaboration To Be RIAA-Certified Diamond |url=https://www.rap-up.com/2024/05/23/nicki-minaj-earns-her-second-diamond-certification-with-bang-bang/ |access-date=September 6, 2024 |magazine=[[Rap-Up]] |archive-date=May 25, 2024 |archive-url=https://web.archive.org/web/20240525174028/https://www.rap-up.com/2024/05/23/nicki-minaj-earns-her-second-diamond-certification-with-bang-bang/ |url-status=live}}</ref> With the singles "Problem", "Break Free", and "Bang Bang", Grande became the second female artist in chart history, joining [[Adele]], with three top-ten singles simultaneously on the ''Billboard'' Hot 100 as a lead artist.<ref name="TripleHot100"/> Grande was the musical performer on ''[[Saturday Night Live]]'', with [[Chris Pratt]] as the host on September 27, 2014.<ref>{{cite magazine |last=Reed |first=Ryan |title=Ariana Grande, Chris Pratt Set for 'Saturday Night Live' Premiere |url=https://www.rollingstone.com/tv/news/ariana-grande-chris-pratt-set-for-saturday-night-live-premiere-20140910 |magazine=[[Rolling Stone]] |date=September 10, 2014 |access-date=September 17, 2014 |archive-date=September 12, 2014 |archive-url=https://web.archive.org/web/20140912222951/http://www.rollingstone.com/tv/news/ariana-grande-chris-pratt-set-for-saturday-night-live-premiere-20140910 }}</ref> That same month, the fourth single from ''My Everything'', "[[Love Me Harder]]", featuring Canadian recording artist [[the Weeknd]], was released and peaked at number seven in the United States.<ref>{{cite magazine |last=Trust |first=Gary |title=Hot 100 Chart Moves: Ed Sheeran, Ariana Grande, Fergie Debut |url=https://www.billboard.com/pro/hot-100-ed-sheeran-ariana-grande-fergie/ |magazine=[[Billboard (magazine)|Billboard]] |date=October 17, 2014 |access-date=April 20, 2020 |archive-date=June 23, 2018 |archive-url=https://web.archive.org/web/20180623040146/https://www.billboard.com/articles/columns/chart-beat/6289067/hot-100-ed-sheeran-ariana-grande-fergie |url-status=live}}</ref> In November 2014, Grande was featured in [[Major Lazer]]'s song "[[All My Love (Major Lazer song)|All My Love]]" from the [[The Hunger Games: Mockingjay, Part 1 – Original Motion Picture Soundtrack|soundtrack album]] for the film ''[[The Hunger Games: Mockingjay – Part 1]]'' (2014).<ref name="spin">{{cite news |last=Carley |first=Brennan |date=November 13, 2014 |title=Major Lazer and Ariana Grande Team Up for Piercing 'Mockingjay' Cut |work=[[Spin (magazine)|Spin]] |url=https://www.spin.com/2014/11/ariana-grande-major-lazer-mockingjay-all-my-love-stream/ |access-date=May 18, 2018 |archive-date=August 17, 2023 |archive-url=https://web.archive.org/web/20230817074515/https://www.spin.com/2014/11/ariana-grande-major-lazer-mockingjay-all-my-love-stream/ |url-status=live}}</ref> Later that month, Grande released the Christmas song "[[Santa Tell Me]]" as a single from the [[reissue]] of her first Christmas EP, ''Christmas Kisses'' (2014).<ref>{{cite web |last1=White |first1=Caitlin |title=Ariana Grande's 'Santa Tell Me' Is Officially Here, and It Sounds Like Christmas Came Early! |url=http://www.mtv.com/news/2007283/ariana-grande-santa-tell-me/ |publisher=[[MTV]] |date=November 24, 2014 |access-date=November 30, 2014 |archive-date=April 1, 2019 |archive-url=https://web.archive.org/web/20190401033750/http://www.mtv.com/news/2007283/ariana-grande-santa-tell-me/ }}</ref> The track became a modern [[Standard (music)|Christmas standard]], significantly rising in popularity on streaming services during the holiday season every year.<ref>{{Cite magazine |last=Beck |first=Lia |date=November 2, 2022 |title=These Are the Best 33 Modern Christmas Songs to Add to Your Holiday Playlist |url=https://www.cosmopolitan.com/entertainment/music/a34287825/best-modern-christmas-songs/ |access-date=November 20, 2022 |magazine=[[Cosmopolitan (magazine)|Cosmopolitan]] |archive-date=September 18, 2025 |archive-url=https://web.archive.org/web/20250918153926/https://www.cosmopolitan.com/entertainment/music/a34287825/best-modern-christmas-songs/ |url-status=live}}</ref> A decade after its release, it reached number five on the Hot 100 issue dated January 4, 2025—being the first Christmas song released in the 21st century to appear in the chart's top-five region.<ref>{{Cite magazine |last=Trust |first=Gary |date=December 30, 2024 |title=Mariah Carey's 'All I Want for Christmas Is You' Adds 18th Week at No. 1 on Billboard Hot 100 |url=https://www.billboard.com/lists/mariah-carey-all-i-want-for-christmas-is-you-hot-100-number-one-18-weeks/christmas-streams-airplay-sales-4/ |access-date=December 31, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=January 2, 2025 |archive-url=https://web.archive.org/web/20250102213414/https://www.billboard.com/lists/mariah-carey-all-i-want-for-christmas-is-you-hot-100-number-one-18-weeks/christmas-streams-airplay-sales-4/ |url-status=live}}</ref><ref>{{Cite magazine |last=Trust |first=Gary |date=December 30, 2024 |title=Here's Every Holiday Hit That Has Jingled to the Billboard Hot 100's Top 10 |url=https://www.billboard.com/lists/holiday-songs-hot-100-top-10/ |access-date=December 31, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=December 30, 2024 |archive-url=https://web.archive.org/web/20241230224013/https://www.billboard.com/lists/holiday-songs-hot-100-top-10/ |url-status=live}}</ref> The following month, she appeared on Nicki Minaj's third album ''[[The Pinkprint]]'', with the song "[[Get on Your Knees (Nicki Minaj song)|Get on Your Knees]]". She later released the fifth and the final single from ''My Everything'', "[[One Last Time (Ariana Grande song)|One Last Time]]", which peaked at number 13 in the US.<ref>{{cite magazine |url=https://www.billboard.com/artist/ariana-grande/chart-history/hot-100 |title=Ariana Grande – Chart History: The Hot 100 |magazine=[[Billboard (magazine)|Billboard]] |access-date=January 29, 2019 |archive-date=November 21, 2021 |archive-url=https://web.archive.org/web/20211121103915/https://www.billboard.com/artist/ariana-grande/chart-history/hot-100/ |url-status=live}}</ref> [[File:Ariana Grande - The Honeymoon Tour Live Jakarta (3).jpg|thumb|upright|Grande performing on [[the Honeymoon Tour]] in 2015]] In February 2015, Grande embarked on her first worldwide concert tour, [[The Honeymoon Tour]], to further promote ''My Everything'', with shows in North America, Europe, Asia and South America.<ref>{{cite news |last=Perdani |first=Yuliasri |title=Ariana Grande to debut in Jakarta soon |url=http://www.thejakartapost.com/news/2015/06/16/ariana-grande-debut-jakarta-soon.html |newspaper=[[The Jakarta Post]] |date=June 16, 2015 |access-date=June 29, 2015 |archive-date=October 24, 2019 |archive-url=https://web.archive.org/web/20191024222129/https://www.thejakartapost.com/news/2015/06/16/ariana-grande-debut-jakarta-soon.html |url-status=live}}</ref> Grande was featured on [[Cashmere Cat]]'s song [[Adore (Cashmere Cat song)|"Adore"]], which was released in March 2015.<ref>{{cite web |last1=McDermott |first1=Maeve |last2=Ryan |first2=Patrick |url=https://www.usatoday.com/story/life/music/2015/12/22/songs-of-the-year-2015/77689258/ |title=The 50 best songs of 2015 |work=[[USA Today]] |date=December 22, 2015 |access-date=August 24, 2017 |archive-date=December 9, 2019 |archive-url=https://web.archive.org/web/20191209190650/https://www.usatoday.com/story/life/music/2015/12/22/songs-of-the-year-2015/77689258/ |url-status=live}}</ref> In the spring, she signed an exclusive publishing contract with the [[Universal Music Publishing Group]], covering her entire music catalog.<ref>{{cite magazine |url=https://www.billboard.com/articles/news/6583126/ariana-grande-signs-with-universal-music-publishing-group |title=Ariana Grande Signs with Universal Music Publishing Group |magazine=[[Billboard (magazine)|Billboard]] |date=June 1, 2015 |access-date=April 20, 2020 |archive-date=October 26, 2023 |archive-url=https://web.archive.org/web/20231026185044/https://pixels.ad.gt/api/v1/getpixels?tagger_id=fbf4aef3db1f9d87b19a37e2c9c2dc7f&url=https%3A%2F%2Fwww.billboard.com%2Fmusic%2Fmusic-news%2Fariana-grande-signs-with-universal-music-publishing-group-6583126%2F&code=%27none%27 |url-status=live}} and {{cite web |last1=Stassen |first1=Murray |title=Ariana Grande signs worldwide publishing deal with UMPG |url=http://www.musicweek.com/news/read/ariana-grande-signs-worldwide-publishing-deal-with-umpg/061935 |website=[[Music Week]] |date=June 2, 2015 |access-date=June 12, 2015 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319213250/http://www.musicweek.com/news/read/ariana-grande-signs-worldwide-publishing-deal-with-umpg/061935 |url-status=live}}</ref> Grande also filmed an episode for the [[Fox Broadcasting Company]] reality TV series ''[[Knock Knock Live]]'' (2015),<ref name="KKL">{{cite web |last=Holloway |first=Daniel |url=https://www.thewrap.com/justin-bieber-ariana-grande-to-appear-on-ryan-seacrests-knock-knock-live |title=Justin Bieber, Ariana Grande to Appear on Ryan Seacrest's ''Knock Knock Live'' |website=[[TheWrap]] |date=July 14, 2015 |access-date=October 30, 2016 |archive-date=April 20, 2021 |archive-url=https://web.archive.org/web/20210420181148/https://www.thewrap.com/justin-bieber-ariana-grande-to-appear-on-ryan-seacrests-knock-knock-live/ |url-status=live}}</ref> but the show was canceled before her episode aired.<ref>{{cite web |last=Wagmeister |first=Elizabeth |url=https://variety.com/2015/tv/news/knock-knock-live-fox-cancelled-ryan-seacrest-1201553836/ |title=Fox Pulls Ryan Seacrest's ''Knock Knock Live'' After Two Episodes |work=[[Variety (magazine)|Variety]] |date=July 30, 2015 |access-date=December 10, 2017 |archive-date=November 22, 2019 |archive-url=https://web.archive.org/web/20191122013451/https://variety.com/2015/tv/news/knock-knock-live-fox-cancelled-ryan-seacrest-1201553836/ |url-status=live}}</ref> She also guest-starred on several episodes of the Fox [[comedy-horror]] television series ''[[Scream Queens (2015 TV series)|Scream Queens]]'' as [[Sonya Herfmann]]/Chanel #2 from September to November 2015.<ref name="ScreamQueens">{{cite magazine |last=Stack |first=Tim |date=April 24, 2015 |title=First Look: Ariana Grande on the set of Scream Queens |url=https://www.ew.com/article/2015/04/24/first-look-ariana-grande-scream-queens |archive-url=https://web.archive.org/web/20210419215425/https://ew.com/article/2015/04/24/first-look-ariana-grande-scream-queens/ |archive-date=April 19, 2021 |access-date=April 20, 2020 |magazine=[[Entertainment Weekly]]}}</ref> She recorded the duet "[[E Più Ti Penso]]" with Italian recording artist [[Andrea Bocelli]], which was released in October 2015 as the lead single from Bocelli's album ''[[Cinema (Andrea Bocelli album)|Cinema]]'' (2015),<ref>{{cite web |last=Mallenbaum |first=Carly |url=https://www.usatoday.com/story/life/entertainthis/2015/10/14/ariana-grande-andrea-bocelli/73929168/ |title=Ariana Grande has Italian duet with Andrea Bocelli. Of course it's good |work=[[USA Today]] |date=October 14, 2015 |access-date=August 24, 2017 |archive-date=December 8, 2019 |archive-url=https://web.archive.org/web/20191208022423/https://www.usatoday.com/story/life/entertainthis/2015/10/14/ariana-grande-andrea-bocelli/73929168/ |url-status=live}}</ref> and covered the song "Zero to Hero", originally from the [[animated film]] ''[[Hercules (1997 film)|Hercules]]'' (1997), for the compilation album ''[[We Love Disney (2015 album)|We Love Disney]]'' (2015).<ref>{{cite web |last=Glein |first=Kelsey |url=http://www.instyle.com/news/ariana-grande-gwen-stefani-we-love-disney-album |title=Gwen Stefani, Ariana Grande, and More Reimagine Your Favorite Disney Songs on New Album |work=[[InStyle]] |date=October 30, 2015 |access-date=October 30, 2015 |archive-date=June 26, 2019 |archive-url=https://web.archive.org/web/20190626184549/https://www.instyle.com/news/ariana-grande-gwen-stefani-we-love-disney-album }}</ref> Grande also released her second Christmas EP, ''[[Christmas & Chill]]'' in December 2015.<ref>{{cite magazine |last=Spanos |first=Brittany |url=https://www.rollingstone.com/music/news/hear-ariana-grandes-surprise-released-ep-christmas-chill-20151217 |title=Hear Ariana Grande's Surprise-Released EP 'Christmas & Chill' |magazine=[[Rolling Stone]] |date=December 17, 2015 |access-date=August 24, 2017 |archive-date=June 16, 2018 |archive-url=https://web.archive.org/web/20180616204319/https://www.rollingstone.com/music/news/hear-ariana-grandes-surprise-released-ep-christmas-chill-20151217 }}</ref> ===2015–2018: ''Dangerous Woman'' and ''Sweetener''=== {{See also|Dangerous Woman {{!}} ''Dangerous Woman''|Manchester Arena bombing|One Love Manchester|Sweetener (album) {{!}} ''Sweetener'' (album)}} Grande began recording songs for her third studio album, ''[[Dangerous Woman]]'', originally titled ''Moonlight'', in 2015.<ref>{{cite web |last=Roth |first=Madeline |title=Ariana Grande Revealed Her New Album Title – And It's Literally Out of This World |url=http://www.mtv.com/news/2173375/ariana-grande-third-album-title/ |publisher=[[MTV]] |access-date=May 30, 2015 |archive-url=https://web.archive.org/web/20150530221938/http://www.mtv.com/news/2173375/ariana-grande-third-album-title/ |archive-date=May 30, 2015 |date=May 30, 2015}}</ref> In October of that year, she released the single "[[Focus (Ariana Grande song)|Focus]]", initially intended as the lead single from the album; the song debuted at number seven on the ''Billboard'' Hot 100.<ref>{{cite magazine |last=Trust |first=Gary |url=https://www.billboard.com/pro/adele-hello-hot-100-second-week/ |title=Adele's 'Hello' Tops Hot 100 for Second Week; Ariana Grande, Meghan Trainor Hit Top 10 |magazine=[[Billboard (magazine)|Billboard]] |date=November 9, 2015 |access-date=April 20, 2020 |archive-date=May 7, 2016 |archive-url=https://web.archive.org/web/20160507132105/http://www.billboard.com/articles/columns/chart-beat/6754159/adele-hello-hot-100-second-week |url-status=live}}</ref> The next month American singer [[Who Is Fancy]] released the single "[[Boys Like You (Who Is Fancy song)|Boys Like You]]", which features Ariana Grande and [[Meghan Trainor]].<ref>{{cite web |url=http://www.m-magazine.com/posts/ariana-grande-teams-with-who-is-fancy-for-boys-like-you-song-77005 |title=Ariana Grande Teams With Who is Fancy For 'Boys Like You' Song |work=[[M Magazine]] |date=November 23, 2015 |access-date=November 23, 2015 |archive-url=https://web.archive.org/web/20151116015553/http://www.m-magazine.com/posts/ariana-grande-teams-with-who-is-fancy-for-boys-like-you-song-77005 |archive-date=November 16, 2015 |last=Thompson |first=Heather}}</ref> She was featured in the remix version of "[[Over and Over Again]]", a song by English singer [[Nathan Sykes]] from his solo debut studio album ''[[Unfinished Business (Nathan Sykes album)|Unfinished Business]]'', which was released in January 2016.<ref>{{cite magazine |last=Mallenbaum |first=Carly |url=https://www.rollingstone.com/music/music-news/hear-ariana-grande-join-ex-boyfriend-nathan-sykes-on-over-and-over-again-178484/ |title=Hear Ariana Grande Join Ex-Boyfriend Nathan Sykes on 'Over and Over Again' |magazine=[[Rolling Stone]] |date=January 16, 2016 |access-date=October 18, 2020 |archive-date=July 15, 2021 |archive-url=https://web.archive.org/web/20210715173115/https://www.rollingstone.com/music/music-news/hear-ariana-grande-join-ex-boyfriend-nathan-sykes-on-over-and-over-again-178484/ |url-status=live}}</ref> In March 2016, Grande released "[[Dangerous Woman (song)|Dangerous Woman]]" as the lead single from the retitled album of the same name.<ref>{{cite magazine |last=Nolfi |first=Joey |url=https://www.ew.com/article/2016/03/10/ariana-grande-dangerous-woman |title=Hear Ariana Grande's sultry new single 'Dangerous Woman' |magazine=Entertainment Weekly |date=March 10, 2016 |access-date=April 20, 2020 |archive-date=March 16, 2022 |archive-url=https://web.archive.org/web/20220316225641/https://ew.com/article/2016/03/10/ariana-grande-dangerous-woman/ |url-status=live}}; {{cite web |last=Geffen |first=Sasha |url=http://www.mtv.com/news/2753217/ariana-grande-dangerous-woman-single/ |title=Ariana Grande's 'Dangerous Woman' Is Here and It Deserves Its Own Spy Movie |publisher=[[MTV]] |date=March 11, 2016 |access-date=March 12, 2016 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319213308/http://www.mtv.com/news/2753217/ariana-grande-dangerous-woman-single/ }}</ref><ref>{{cite web |url=https://music.apple.com/us/album/dangerous-woman/1440843597 |title=iTunes – Music – Dangerous Woman by Ariana Grande |publisher=[[iTunes Store]] (US) |access-date=March 10, 2016 |archive-date=March 27, 2019 |archive-url=https://web.archive.org/web/20190327111705/https://itunes.apple.com/us/album/dangerous-woman/id1091145606 |url-status=live}}</ref> The single debuted at number ten on the ''Billboard'' Hot 100, making her the first artist to have the lead single from each of their first three albums debut in the top ten.<ref name="FirstThree">{{cite magazine |last=Trust |first=Gary |url=https://www.billboard.com/pro/rihanna-hot-100-no-1-fifth-week-ariana-grande-debuts/ |title=Rihanna Rules Hot 100 for Fifth Week, Ariana Grande Debuts at No. 10 |magazine=[[Billboard (magazine)|Billboard]] |date=March 21, 2016 |access-date=April 20, 2020 |archive-date=May 6, 2021 |archive-url=https://web.archive.org/web/20210506170226/https://www.billboard.com/articles/columns/chart-beat/7263992/rihanna-hot-100-no-1-fifth-week-ariana-grande-debuts |url-status=live}}</ref> The same month, Grande appeared as host and musical guest of ''Saturday Night Live'', where she performed "Dangerous Woman" and debuted the promotional single "[[Be Alright (Ariana Grande song)|Be Alright]]",<ref>{{Cite magazine |date=February 25, 2016 |title=Ariana Grande to Host and Perform on 'Saturday Night Live' |url=https://time.com/4237667/ariana-grande-saturday-night-live-dangerous-woman-be-alright/ |access-date=April 3, 2024 |magazine=Time |archive-date=April 3, 2024 |archive-url=https://web.archive.org/web/20240403065746/https://time.com/4237667/ariana-grande-saturday-night-live-dangerous-woman-be-alright/ |url-status=live}}</ref> which charted at number 43 on the ''Billboard'' Hot 100.<ref>{{cite magazine |last=Trust |first=Gary |url=https://www.billboard.com/pro/hot-100-chart-moves-iggy-azalea-ariana-grande-debut/ |title=Hot 100 Chart Moves: Iggy Azalea & Ariana Grande Debut |magazine=[[Billboard (magazine)|Billboard]] |date=March 31, 2016 |access-date=April 20, 2020 |archive-date=October 26, 2023 |archive-url=https://web.archive.org/web/20231026185029/https://www.billboard.com/pro/hot-100-chart-moves-iggy-azalea-ariana-grande-debut/ |url-status=live}}</ref> Grande garnered positive reviews for her appearance on the show, including praise for her impressions of various singers,<ref>{{cite web |date=March 14, 2016 |title=Ariana Grande Incredibly Imitates Whitney, Celine, Britney and More |url=http://shows.huffingtonpost.com/video/ariana-grande-incredibly-imitates-whitney-celine-britney-and-more-519579275 |archive-url=https://web.archive.org/web/20231026185030/https://www.huffpost.com/section/video |archive-date=October 26, 2023 |access-date=March 15, 2016 |work=[[HuffPost]]}}</ref><ref>{{cite news |url=https://time.com/4257737/ariana-grande-saturday-night-live-review/ |title=Ariana Grande's Saturday Night Live Performance Was a Triumph |last1=D'Addario |first1=Daniel |access-date=March 15, 2016 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319213248/http://time.com/4257737/ariana-grande-saturday-night-live-review/ |url-status=live}}</ref> some of which she had done on ''[[The Tonight Show Starring Jimmy Fallon]]''.<ref>{{cite magazine |url=https://www.billboard.com/music/pop/ariana-grande-celebrity-impressions-watch-7256256/ |title=Watch All of Ariana Grande's Celebrity Impressions |last1=Iasimone |first1=Ashley |magazine=[[Billboard (magazine)|Billboard]] |date=March 13, 2016 |access-date=April 20, 2020 |archive-date=January 13, 2020 |archive-url=https://web.archive.org/web/20200113130800/https://www.billboard.com/articles/columns/pop/7256256/ariana-grande-celebrity-impressions-watch |url-status=live}}</ref> [[File:Dangerous Woman Tour2.jpg|thumb|left|upright|Grande performing on the [[Dangerous Woman Tour]] in 2017]] Grande released ''Dangerous Woman'' on May 20, 2016, which debuted at number two on the ''Billboard'' 200.<ref>{{cite magazine |last=Caulfield |first=Keith |url=https://www.billboard.com/pro/drake-views-no-1-on-billboard-200-album-chart-ariana-grande-blake-shelton/ |title=Drake's ''Views'' Still No. 1 on ''Billboard'' 200, Ariana Grande and Blake Shelton Debut at Nos. 2 & 3 |magazine=[[Billboard (magazine)|Billboard]] |date=May 29, 2016 |access-date=April 20, 2020 |archive-date=May 30, 2016 |archive-url=https://web.archive.org/web/20160530124854/https://www.billboard.com/articles/columns/chart-beat/7386082/drake-views-no-1-on-billboard-200-album-chart-ariana-grande-blake-shelton |url-status=live}}</ref> It also debuted at number two in Japan,<ref>{{cite web |url=http://www.oricon.co.jp/rank/ja/w/2016-05-30/ |title=週間 CDアルバムランキング: 2016年05月16日〜2016年05月22 |publisher=[[Oricon]] |archive-url=https://web.archive.org/web/20160525023530/http://www.oricon.co.jp/rank/ja/w/2016-05-30/ |archive-date=May 25, 2016}}</ref> and at number one in several other markets, including Australia, the Netherlands, Ireland, Italy, New Zealand and the UK.<ref>{{cite web |url=http://australian-charts.com/showitem.asp?interpret=Ariana+Grande&titel=Dangerous+Woman&cat=a |title=Ariana Grande – ''Dangerous Woman'' |website=australian-charts.com |access-date=May 29, 2016 |archive-date=May 4, 2019 |archive-url=https://web.archive.org/web/20190504013646/https://australian-charts.com/showitem.asp?interpret=Ariana+Grande&titel=Dangerous+Woman&cat=a |url-status=live}}; {{cite web |url=http://www.dutchcharts.nl/showitem.asp?interpret=Ariana+Grande&titel=Dangerous+Woman&cat=a |title=Ariana Grande – ''Dangerous Woman'' |website=dutchcharts.nl |access-date=May 28, 2016 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319220316/https://dutchcharts.nl/showitem.asp?interpret=Ariana+Grande&titel=Dangerous+Woman&cat=a |url-status=live}}; {{cite web |url=http://www.chart-track.co.uk/index.jsp?c=p%2Fmusicvideo%2Fmusic%2Farchive%2Findex_test.jsp&ct=240002&arch=t&lyr=2016&year=2016&week=21 |title=Top 100 Artist Album, Week Ending 26 May 2016 |work=Irish Music Charts Archive |access-date=May 29, 2016 |archive-url=https://web.archive.org/web/20181116092852/http://www.chart-track.co.uk/index.jsp?c=p%2Fmusicvideo%2Fmusic%2Farchive%2Findex_test.jsp&ct=240002&arch=t&lyr=2016&year=2016&week=21 |archive-date=November 16, 2018 }}; {{cite web |url=http://www.fimi.it/classifiche#/category:album/id:2256 |title=Album – Classifica settimanale WK 21 |publisher=[[Federazione Industria Musicale Italiana]] |access-date=May 28, 2016 |language=it |archive-date=February 3, 2019 |archive-url=https://web.archive.org/web/20190203185228/http://www.fimi.it/classifiche#/category:album/id:2256 |url-status=live}}; {{cite web |url=https://aotearoamusiccharts.co.nz/archive/albums/2011-11-11 |title=New Zealand Top 40 Albums Chart |archive-url=https://www.webcitation.org/67eErXXv7?url=http://nztop40.co.nz/chart/albums |archive-date=May 14, 2012 |publisher=Recorded Music New Zealand |access-date=May 29, 2016}}</ref><ref>{{cite web |last1=White |first1=Jack |publisher=[[Official Charts Company]] |title=Ariana Grande scores first Number 1 album with Dangerous Woman |url=http://www.officialcharts.com/chart-news/ariana-grande-scores-first-number-1-album-with-dangerous-woman__15171 |date=May 27, 2016 |access-date=June 1, 2016 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319213259/https://www.officialcharts.com/chart-news/ariana-grande-scores-first-number-1-album-with-dangerous-woman__15171/ |url-status=live}}</ref> Mark Savage, writing for ''BBC News'', called the album "a mature, confident record".<ref name="Savage"/> In August, Grande released a third single from the album, "[[Side to Side]]", featuring rapper [[Nicki Minaj]], her eighth top ten entry on the Hot 100, which peaked at number four on that chart.<ref>{{cite magazine |url=https://www.billboard.com/charts/hot-100/2016-12-03 |title=The Hot 100: The Week of December 3, 2016 |magazine=[[Billboard (magazine)|Billboard]] |date=November 23, 2016 |access-date=April 20, 2020 |archive-date=August 12, 2020 |archive-url=https://web.archive.org/web/20200812162501/https://www.billboard.com/charts/hot-100/2016-12-03 |url-status=live}}</ref> ''Dangerous Woman'' was nominated for [[Grammy Award for Best Pop Vocal Album]] and the title track for [[Best Pop Solo Performance]].<ref name="GrammyNoms2017">{{cite magazine |url=https://www.billboard.com/articles/news/7597556/grammys-nominees-complete-list-2017 |title=Here Is the Complete List of Nominees for the 2017 Grammys |magazine=[[Billboard (magazine)|Billboard]] |date=December 6, 2016 |access-date=April 20, 2020 |archive-date=December 6, 2016 |archive-url=https://web.archive.org/web/20161206151125/http://www.billboard.com/articles/news/7597556/grammys-nominees-complete-list-2017 |url-status=live}}</ref> Aside from music, Grande played Penny Pingleton in the NBC television broadcast ''[[Hairspray Live!]]'', which aired in December 2016.<ref>{{cite magazine |last=Saraiya |first=Sonia |url=https://variety.com/2016/tv/reviews/tv-review-hairspray-live-jennifer-hudson-ariana-grande-1201936567 |title=TV Review: ''Hairspray Live!'' |magazine=Variety |date=December 7, 2016 |access-date=December 10, 2017 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319213944/https://variety.com/2016/tv/reviews/tv-review-hairspray-live-jennifer-hudson-ariana-grande-1201936567/ |url-status=live}}</ref> Grande recorded [[Beauty and the Beast (Disney song)#Ariana Grande and John Legend version|the title track]] of the soundtrack for the [[Beauty and the Beast (2017 film)|2017 live-action remake]] of Disney's 1991 animated film ''[[Beauty and the Beast (1991 film)|Beauty and the Beast]]''. The recording was released as a duet with American singer [[John Legend]] in February 2017.<ref>{{cite web |last=Stutz |first=Colin |url=https://www.hollywoodreporter.com/news/ariana-grande-john-legend-record-beauty-beast-duet-disney-film-963725 |title=Ariana Grande and John Legend to Record 'Beauty and the Beast' Duet for Disney Film |work=[[The Hollywood Reporter]] |date=January 11, 2017 |access-date=March 31, 2021 |archive-date=April 22, 2021 |archive-url=https://web.archive.org/web/20210422142238/https://www.hollywoodreporter.com/news/ariana-grande-john-legend-record-beauty-beast-duet-disney-film-963725 |url-status=live}}</ref> The same month, Grande embarked on her third concert tour, the [[Dangerous Woman Tour]], to promote the album.<ref>{{cite web |last=Kelemen |first=Matt |url=https://lasvegasmagazine.com/entertainment/2017/jan/27/ariana-grande-mgm-grand |title=Ariana Grande Is a Dangerous Talent |work=Las Vegas |date=January 27, 2017 |access-date=January 28, 2017 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319213301/https://lasvegasmagazine.com/entertainment/2017/jan/27/ariana-grande-mgm-grand/ |url-status=live}}</ref> On May 22, 2017, [[Manchester Arena bombing|her concert]] at [[Manchester Arena]] was the target of a [[suicide bombing]]. An [[Islamic extremist]], motivated by [[Muslim]] casualties from [[American-led intervention in the Syrian Civil War|US intervention in the Syrian Civil War]], detonated a [[nail bomb|shrapnel-laden]] [[homemade bomb]] as people were leaving the arena. The [[Manchester Arena bombing]], which occurred at the City Room, caused 22 deaths and injured over a thousand more. Grande suspended the remainder of the tour and held a televised benefit concert, [[One Love Manchester]], on June 4,<ref>{{cite web |url=https://www.hollywoodreporter.com/news/ariana-grandes-manchester-benefit-concert-draws-biggest-uk-tv-audience-2017-1010106 |title=Ariana Grande's Manchester Benefit Concert Draws Biggest U.K. TV Audience of 2017 |work=The Hollywood Reporter |date=June 5, 2017 |access-date=June 5, 2017 |archive-date=April 25, 2021 |archive-url=https://web.archive.org/web/20210425053824/https://www.hollywoodreporter.com/news/ariana-grandes-manchester-benefit-concert-draws-biggest-uk-tv-audience-2017-1010106 |url-status=live}}</ref> helping to raise $23 million to aid the bombing's victims and affected families.<ref name="FundsRaised">{{cite magazine |last=Blistein |first=Jon |url=https://www.rollingstone.com/music/news/families-of-ariana-grande-concert-attack-victims-to-receive-324000-w498012 |title=Families of Ariana Grande Concert Attack Victims to Receive $324,000 |magazine=[[Rolling Stone]] |date=August 15, 2017 |access-date=August 24, 2017 |archive-date=June 16, 2018 |archive-url=https://web.archive.org/web/20180616230556/https://www.rollingstone.com/music/news/families-of-ariana-grande-concert-attack-victims-to-receive-324000-w498012 }}</ref> The concert featured performances from Grande, as well as [[Liam Gallagher]], [[Robbie Williams]], [[Justin Bieber]], [[Katy Perry]], [[Miley Cyrus]] and other artists.<ref>{{cite magazine |last=Smirke |first=Richard |url=https://www.billboard.com/music/pop/one-love-manchester-concert-ariana-grande-bravery-resilience-7817617/ |title=Bravery, Resilience Shine as Ariana Grande Leads All-Star Benefit Concert for Victims of Manchester Bombing |magazine=[[Billboard (magazine)|Billboard]] |date=June 4, 2017 |access-date=April 20, 2020 |archive-date=April 22, 2021 |archive-url=https://web.archive.org/web/20210422142238/https://www.billboard.com/articles/columns/pop/7817617/one-love-manchester-concert-ariana-grande-bravery-resilience |url-status=live}}</ref> To recognize her efforts, the [[Manchester City Council]] named Grande the first [[honorary citizen]] of [[Manchester]]<ref>{{cite web |last=Macguire |first=Eoghan |url=https://www.nbcnews.com/storyline/manchester-concert-explosion/manchester-names-ariana-grande-honorary-citizen-n781711 |title=Manchester Names Ariana Grande Honorary Citizen |publisher=NBC News |date=July 12, 2017 |access-date=April 20, 2020 |archive-date=August 7, 2020 |archive-url=https://web.archive.org/web/20200807051027/https://www.nbcnews.com/storyline/manchester-concert-explosion/manchester-names-ariana-grande-honorary-citizen-n781711 |url-status=live}}</ref><ref name="FundsRaised"/> and, later in the year, she was reported to have declined an honorary UK [[dame]]hood. The tour resumed on June 7 in Paris and ended in September 2017.<ref>{{cite web |last=Lynch |first=Jess |url=http://www.cosmopolitan.com.au/celebrity/ariana-grande-resumes-dangerous-woman-world-tour-22609 |title=Ariana Grande proves she's an unstoppable force as she resumes her world tour |work=[[Cosmopolitan (magazine)|Cosmopolitan]] |date=June 7, 2017 |access-date=June 8, 2017 |archive-url=https://web.archive.org/web/20170608060705/http://www.cosmopolitan.com.au/celebrity/ariana-grande-resumes-dangerous-woman-world-tour-22609 |archive-date=June 8, 2017 }}; and {{cite web |last=Gonzalez |first=Sandra |url=http://www.cnn.com/2017/06/07/entertainment/ariana-grande-tour-resumes |title=Ariana Grande honors 'angels' as tour resumes |publisher=CNN |date=June 7, 2017 |access-date=June 7, 2017 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319215158/https://www.cnn.com/2017/06/07/entertainment/ariana-grande-tour-resumes |url-status=live}}; and {{cite magazine |url=https://www.billboard.com/articles/news/international/7949934/ariana-grande-first-tour-mainland-china |title=Ariana Grande Wraps Up First Tour of Mainland China |last=[[Billboard (magazine)|Billboard]] |magazine=[[Billboard (magazine)|Billboard]] |date=September 1, 2017 |access-date=April 20, 2020 |archive-date=April 27, 2021 |archive-url=https://web.archive.org/web/20210427032405/https://www.billboard.com/articles/news/international/7949934/ariana-grande-first-tour-mainland-china |url-status=live}}</ref><ref>{{cite web |last=Lakshmin |first=Deepa |url=http://www.mtv.com/news/3037300/ariana-grande-goodbye-dangerous-woman-tour |title=Ariana Grande Wrote A Beautiful Goodbye Note To Her Dangerous Woman Tour |publisher=[[MTV]] |date=September 21, 2017 |access-date=September 22, 2017 |archive-date=June 26, 2019 |archive-url=https://web.archive.org/web/20190626184557/http://www.mtv.com/news/3037300/ariana-grande-goodbye-dangerous-woman-tour/ }}</ref> In August 2017, Grande appeared in an [[Apple Music]] ''[[Carpool Karaoke]]'' episode, singing [[musical theatre]] songs with American entertainer [[Seth MacFarlane]].<ref name="Carpool">{{cite web |last=Fierberg |first=Ruthie |url=http://www.playbill.com/article/ariana-grande-and-seth-macfarlane-sing-little-shops-suddenly-seymour-on-carpool-karaoke |title=Ariana Grande and Seth MacFarlane Sing ''Little Shop's'' 'Suddenly Seymour' on ''Carpool Karaoke'' |work=[[People (magazine)|People]] |date=August 22, 2017 |access-date=August 23, 2017 |archive-date=September 7, 2019 |archive-url=https://web.archive.org/web/20190907084955/http://www.playbill.com/article/ariana-grande-and-seth-macfarlane-sing-little-shops-suddenly-seymour-on-carpool-karaoke |url-status=live}}</ref> In December 2017, ''[[Billboard (magazine)|Billboard]]'' magazine named her "Female Artist of the Year".<ref>{{cite web |last=McNeilage |first=Ross |url=https://www.mtv.co.uk/news/8pbxid/ariana-grande-is-billboards-female-artist-of-the-year |title=Ariana Grande Is Billboard's Female Artist of the Year |publisher=[[MTV]] |date=December 2, 2017 |access-date=December 13, 2017 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319213256/http://www.mtv.co.uk/ariana-grande/news/ariana-grande-is-billboards-female-artist-of-the-year |url-status=live}}</ref> Grande began working on songs for her fourth studio album, ''[[Sweetener (album)|Sweetener]]'' with [[Pharrell Williams]] in 2016.<ref>{{cite magazine |url=https://www.billboard.com/articles/news/8470827/pharrell-on-working-with-ariana-grande-on-sweetener |title=Pharrell on Working With Ariana Grande on 'Sweetener': 'She Really Unzipped' |date=August 17, 2018 |access-date=September 20, 2018 |first=Rania |last=Aniftos |magazine=[[Billboard (magazine)|Billboard]] |archive-date=September 12, 2019 |archive-url=https://web.archive.org/web/20190912234835/https://www.billboard.com/articles/news/8470827/pharrell-on-working-with-ariana-grande-on-sweetener |url-status=live}}</ref> Grande released "[[No Tears Left to Cry]]" as the lead single from ''Sweetener'' in April 2018,<ref>{{cite magazine |last=Reed |first=Ryan |url=https://www.rollingstone.com/music/news/hear-ariana-grandes-uplifting-new-song-no-tears-left-to-cry-w519323 |title=Hear Ariana Grande's Uplifting New Song 'No Tears Left to Cry' |magazine=[[Rolling Stone]] |date=April 20, 2018 |access-date=April 20, 2018 |archive-date=June 12, 2018 |archive-url=https://web.archive.org/web/20180612140413/https://www.rollingstone.com/music/news/hear-ariana-grandes-uplifting-new-song-no-tears-left-to-cry-w519323 }}</ref> with the song debuting at number three on the ''Billboard'' Hot 100, making Grande the only artist to have debuted the lead single of her first four albums in the top ten of the Hot 100.<ref>{{cite magazine |last=Trust |first=Gary |url=https://www.billboard.com/pro/drake-nice-for-what-hot-100-number-one-ariana-grande-j-cole/ |title=Drake Leads ''Billboard'' Hot 100, Ariana Grande Arrives at No. 3 & J. Cole Collects Record Three Debuts in Top 10 |magazine=[[Billboard (magazine)|Billboard]] |date=April 30, 2018 |access-date=May 1, 2018 |archive-date=March 29, 2019 |archive-url=https://web.archive.org/web/20190329054545/https://www.billboard.com/articles/columns/chart-beat/8412480/drake-nice-for-what-hot-100-number-one-ariana-grande-j-cole |url-status=live}}</ref><ref>{{cite web |last=Nelson |first=Jeff |url=https://people.com/music/ariana-grande-the-light-is-coming-music-video-nicki-minaj |title=Ariana Grande Drops 'The Light Is Coming' Video, Frolics in the Woods with Nicki Minaj |work=[[People (magazine)|People]] |date=June 20, 2018 |access-date=June 20, 2018 |archive-date=June 28, 2019 |archive-url=https://web.archive.org/web/20190628170338/https://people.com/music/ariana-grande-the-light-is-coming-music-video-nicki-minaj/ |url-status=live}}</ref> In June 2018, she was featured in "[[Bed (Nicki Minaj song)|Bed]]", the second single from [[Nicki Minaj]]'s fourth studio album ''[[Queen (Nicki Minaj album)|Queen]]''.<ref>{{cite web |last=Kiefer |first=Halle |url=https://www.teenvogue.com/story/ariana-grande-nicki-minaj-just-released-their-new-single-bed |title=Ariana Grande and Nicki Minaj Just Released Their New Single, "Bed" |work=Teen Vogue |date=June 14, 2018 |access-date=October 18, 2020 |archive-date=September 28, 2020 |archive-url=https://web.archive.org/web/20200928202534/https://www.teenvogue.com/story/ariana-grande-nicki-minaj-just-released-their-new-single-bed |url-status=live}}</ref> The same month, she was featured on [[Troye Sivan]]'s single "[[Dance to This]]" from his sophomore album [[Bloom (Troye Sivan album)|''Bloom'']]. The second single, "[[God Is a Woman]]",<ref>{{cite web |last=Kiefer |first=Halle |url=https://www.vulture.com/2018/07/listen-to-ariana-grandes-new-song-god-is-a-woman.html |title=Listen to Ariana Grande's New Song 'God is a woman' |work=Vulture |date=July 13, 2018 |access-date=July 13, 2018 |archive-date=July 13, 2018 |archive-url=https://web.archive.org/web/20180713072630/http://www.vulture.com/2018/07/listen-to-ariana-grandes-new-song-god-is-a-woman.html |url-status=live}}</ref><ref>{{cite magazine |last=Whittum |first=Connor |url=https://www.billboard.com/articles/news/8465375/ariana-grande-epic-god-is-a-woman-video-decoded |title=Ariana Grande's Epic 'God Is a Woman' Video, Decoded |magazine=[[Billboard (magazine)|Billboard]] |date=July 13, 2018 |access-date=July 13, 2018 |archive-date=June 8, 2019 |archive-url=https://web.archive.org/web/20190608205133/https://www.billboard.com/articles/news/8465375/ariana-grande-epic-god-is-a-woman-video-decoded |url-status=live}}</ref> peaked at number 8 on the Hot 100 and became Grande's tenth top ten single in the US.<ref name=10thArianaBB>{{cite magazine |last=Zellner |first=Xander |url=https://www.billboard.com/pro/ariana-grande-10th-top-10-hit-10-songs-billboard-hot-100-chart/ |title=Ariana Grande Earns 10th Top 10 Hit, Lands 10 Songs on ''Billboard'' Hot 100 |magazine=[[Billboard (magazine)|Billboard]] |date=August 27, 2018 |access-date=August 27, 2018 |archive-date=June 14, 2019 |archive-url=https://web.archive.org/web/20190614121011/https://www.billboard.com/articles/columns/chart-beat/8472538/ariana-grande-10th-top-10-hit-10-songs-billboard-hot-100-chart |url-status=live}}</ref> Released in August 2018,<ref>{{cite magazine |last=Blistein |first=Jon |url=https://www.rollingstone.com/music/news/hear-ariana-grande-tap-nicki-minaj-for-snappy-the-light-is-coming-w521757 |title=Hear Ariana Grande Tap Nicki Minaj for Snappy 'The Light Is Coming' |magazine=[[Rolling Stone]] |date=June 20, 2018 |access-date=June 20, 2018 |archive-date=June 20, 2018 |archive-url=https://web.archive.org/web/20180620074213/https://www.rollingstone.com/music/news/hear-ariana-grande-tap-nicki-minaj-for-snappy-the-light-is-coming-w521757 }}; {{cite magazine |url=https://www.billboard.com/articles/news/8461868/ariana-grande-the-light-is-coming-featuring-nicki-minaj-stream |title=Ariana Grande Switches on 'The Light Is Coming' Featuring Nicki Minaj: Stream It Here |magazine=[[Billboard (magazine)|Billboard]] |date=June 20, 2018 |access-date=June 20, 2018 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319224851/https://www.billboard.com/articles/news/8461868/ariana-grande-the-light-is-coming-featuring-nicki-minaj-stream |url-status=live}}</ref> ''Sweetener'' debuted at number one on the ''Billboard'' 200<ref>{{cite magazine |last=Kreps |first=Daniel |url=https://www.rollingstone.com/music/music-news/on-the-charts-ariana-grandes-sweetener-opens-at-number-one-715957 |title=On the Charts: Ariana Grande's ''Sweetener'' Opens at Number One |magazine=[[Rolling Stone]] |date=August 26, 2018 |access-date=August 26, 2018 |archive-date=September 19, 2019 |archive-url=https://web.archive.org/web/20190919233603/https://www.rollingstone.com/music/music-news/on-the-charts-ariana-grandes-sweetener-opens-at-number-one-715957/ |url-status=live}}</ref> and received acclaim from critics.<ref>{{cite web |url=https://www.metacritic.com/music/sweetener/ariana-grande |title=Reviews for Sweetener by Ariana Grande |publisher=[[Metacritic]] |access-date=August 28, 2018 |archive-date=July 13, 2022 |archive-url=https://web.archive.org/web/20220713142434/https://www.metacritic.com/music/sweetener/ariana-grande |url-status=live}}</ref> She simultaneously charted nine songs from the album on the Hot 100, along with a collaboration, making her the fourth female artist to reach the ten-song mark.<ref name=10thArianaBB/> Grande gave four concerts to promote the album, billed as [[The Sweetener Sessions]], in New York City, Chicago, Los Angeles, and London between August 20 and September 4, 2018.<ref>{{cite magazine |last=Legaspi |first=Althea |url=https://www.rollingstone.com/music/music-news/ariana-grande-details-intimate-sweetener-sessions-concerts-708392 |title=Ariana Grande Details Intimate ''Sweetener Sessions'' Concerts |magazine=[[Rolling Stone]] |date=August 8, 2018 |access-date=August 22, 2018 |archive-date=June 29, 2019 |archive-url=https://web.archive.org/web/20190629161609/https://www.rollingstone.com/music/music-news/ariana-grande-details-intimate-sweetener-sessions-concerts-708392/ }}</ref> In October 2018, Grande participated in the NBC broadcast, ''[[A Very Wicked Halloween]]'', singing "[[The Wizard and I]]" from the musical ''[[Wicked (musical)|Wicked]]''.<ref>{{cite magazine |last=Lenker |first=Maureen Lee |url=https://ew.com/tv/2018/10/29/the-5-best-moments-in-a-very-wicked-halloween |title=The 5 best moments in ''A Very Wicked Halloween'' |magazine=Entertainment Weekly |date=October 29, 2018 |access-date=October 30, 2018 |archive-date=July 31, 2019 |archive-url=https://web.archive.org/web/20190731222946/https://ew.com/tv/2018/10/29/the-5-best-moments-in-a-very-wicked-halloween/ |url-status=live}}</ref> The following month, the BBC aired a one-hour special, ''[[Ariana Grande at the BBC]]'', featuring interviews and performances.<ref>{{cite web |last=Blair |first=Olivia |url=https://www.cosmopolitan.com/uk/entertainment/a24255798/ariana-grande-bbc-special |title=Ariana Grande has a one hour special airing on the BBC this week and it's a dream |website=Cosmopolitan |date=October 29, 2018 |access-date=October 30, 2018 |archive-date=November 2, 2019 |archive-url=https://web.archive.org/web/20191102012807/https://www.cosmopolitan.com/uk/entertainment/a24255798/ariana-grande-bbc-special/ |url-status=live}}</ref><ref name="AtTheBBC">{{cite web |last=Sporn |first=Natasha |url=https://www.standard.co.uk/stayingin/tvfilm/ariana-grande-at-the-bbc-why-davina-mccall-s-chat-with-star-is-a-must-watch-a3978191.html |title=Ariana Grande at the BBC: Why Davina McCall's chat with star is a must watch |website=Evening Standard |date=November 1, 2018 |access-date=November 2, 2018 |archive-date=June 5, 2019 |archive-url=https://web.archive.org/web/20190605060909/https://www.standard.co.uk/stayingin/tvfilm/ariana-grande-at-the-bbc-why-davina-mccall-s-chat-with-star-is-a-must-watch-a3978191.html |url-status=live}}</ref> [[File:Ariana Grande - God Is A Woman VMA 2018 2.jpg|thumb|Grande performs "God Is A Woman" at the [[2018 MTV Video Music Awards]] in New York City.]] === 2018–2019: ''Thank U, Next'' === {{Main|Thank U, Next (album)|l1=''Thank U, Next'' (album)}} In November 2018, Grande released the single "[[Thank U, Next (song)|Thank U, Next]]" and announced her [[Thank U, Next|fifth studio album of the same name]].<ref>{{cite magazine |url=https://www.billboard.com/articles/news/8483065/ariana-grande-new-album-thank-u-next |title=Ariana Grande Teases New Album 'Thank U, Next' |last=Stiernberg |first=Bonnie |date=November 3, 2018 |magazine=[[Billboard (magazine)|Billboard]] |access-date=November 3, 2018 |archive-date=June 12, 2019 |archive-url=https://web.archive.org/web/20190612072957/https://www.billboard.com/articles/news/8483065/ariana-grande-new-album-thank-u-next |url-status=live}}</ref><ref>{{cite web |url=https://itunes.apple.com/us/album/thank-u-next/1441178207 |title=thank u, next – Single by Ariana Grande |date=November 3, 2018 |publisher=iTunes Store |access-date=November 4, 2018 |archive-date=November 4, 2018 |archive-url=https://web.archive.org/web/20181104135935/https://itunes.apple.com/us/album/thank-u-next/1441178207 }}</ref> The song debuted at number one on the ''Billboard'' Hot 100, becoming Grande's first chart-topping single in the United States, spending seven non-consecutive weeks atop.<ref>{{cite magazine |url=https://www.billboard.com/pro/ariana-grande-thank-u-next-hot-100-first-number-one-debut/ |title=Ariana Grande Achieves First Billboard Hot 100 No. 1 as 'Thank U, Next' Debuts on Top |magazine=[[Billboard (magazine)|Billboard]] |access-date=November 13, 2018 |archive-date=March 20, 2019 |archive-url=https://web.archive.org/web/20190320011137/https://www.billboard.com/articles/columns/chart-beat/8484401/ariana-grande-thank-u-next-hot-100-first-number-one-debut |url-status=live}}</ref><ref>{{cite magazine |url=https://www.billboard.com/artist/ariana-grande/chart-history/hsi/ |title=Chart History Ariana Grande |magazine=[[Billboard (magazine)|Billboard]] |access-date=February 2, 2020 |archive-date=November 22, 2021 |archive-url=https://web.archive.org/web/20211122194105/https://www.billboard.com/artist/ariana-grande/chart-history/hsi/ |url-status=live}}</ref> Since then, it has been certified eight-times platinum in the United States;<ref>{{cite news |url=https://www.riaa.com/gold-platinum/?tab_active=default-award&ar=Ariana+Grande&ti=Thank+U,+Next#search_section |title=Gold & Platinum – Ariana Grande – Thank U, Next |publisher=Recording Industry Association of America |access-date=November 29, 2018 |archive-date=June 26, 2019 |archive-url=https://web.archive.org/web/20190626184551/https://www.riaa.com/gold-platinum/?tab_active=default-award&ar=Ariana+Grande&ti=Thank+U,+Next#search_section |url-status=live}}</ref> the song's music video broke records for most-watched music video on YouTube within 24 hours of release<ref>{{cite magazine |url=https://www.billboard.com/music/pop/ariana-grande-thank-u-next-biggest-music-video-debut-youtube-8488652/ |title=Ariana Grande's 'Thank U, Next' Has the Biggest Music Video Debut in YouTube History |magazine=[[Billboard (magazine)|Billboard]] |access-date=December 9, 2018 |archive-date=December 5, 2018 |archive-url=https://web.archive.org/web/20181205054721/https://www.billboard.com/articles/columns/pop/8488652/ariana-grande-thank-u-next-biggest-music-video-debut-youtube |url-status=live}}</ref> and fastest Vevo video to reach 100 million views on YouTube, at the time.<ref>{{cite news |url=https://www.reuters.com/article/us-music-ariana-grande-idUSKBN1O32FZ |title=Grande's 'thank u, next' bests Adele to fastest 100 million views |date=December 4, 2018 |work=Reuters |access-date=December 4, 2018 |archive-date=December 5, 2018 |archive-url=https://web.archive.org/web/20181205003529/https://www.reuters.com/article/us-music-ariana-grande-idUSKBN1O32FZ |url-status=live}}</ref> On [[Spotify]], it became the fastest song to reach 100 million streams (11 days) and most-streamed song by a female artist in a 24-hour period, with 9.6 million streams, before being surpassed by her own "[[7 Rings]]" (nearly 15 million streams).<ref>{{cite news |url=https://www.thefader.com/2018/11/15/ariana-grande-100m-spotify-streams-thank-u-next |title=Ariana Grande breaks 100&nbsp;m Spotify streams record with "thank u, next" |work=[[Fader (magazine)|Fader]] |access-date=December 13, 2018 |archive-date=July 26, 2020 |archive-url=https://web.archive.org/web/20200726083850/https://www.thefader.com/2018/11/15/ariana-grande-100m-spotify-streams-thank-u-next |url-status=live}}</ref> "Thank U, Next" was the most-streamed song by a woman globally on [[Apple Music]] in 2019.<ref name="moststreamed2010s2">{{cite web |last=Amatulli |first=Jenna |date=December 3, 2019 |title=Ariana Grande Was The Most Streamed Female Artist Of The 2010s |url=https://www.huffpost.com/entry/ariana-grande-spotify-most-streamed-artist_n_5de6cd6ae4b0d50f32aa59af |access-date=June 19, 2020 |work=[[HuffPost]] |archive-date=May 22, 2020 |archive-url=https://web.archive.org/web/20200522200642/https://www.huffpost.com/entry/ariana-grande-spotify-most-streamed-artist_n_5de6cd6ae4b0d50f32aa59af |url-status=live}}</ref> Grande released, in collaboration with [[YouTube]], a four-part docuseries titled ''[[Ariana Grande: Dangerous Woman Diaries]]''. It shows behind the scenes and concert footage from Grande's [[Dangerous Woman Tour]], including moments from the [[One Love Manchester]] concert, and follows her professional life during the tour and the making of ''Sweetener''. The series debuted on November 29, 2018.<ref>{{cite magazine |url=https://www.hollywoodreporter.com/live-feed/ariana-grande-docuseries-dangerous-woman-diaries-stream-youtube-1164416 |title=Ariana Grande Docuseries to Stream on YouTube |last=Jarvey |first=Natalie |magazine=The Hollywood Reporter |date=November 28, 2018 |access-date=November 29, 2018 |archive-date=November 29, 2018 |archive-url=https://web.archive.org/web/20181129011939/https://www.hollywoodreporter.com/live-feed/ariana-grande-docuseries-dangerous-woman-diaries-stream-youtube-1164416 |url-status=live}}</ref> By the end of the year, she became the most-streamed female artist on Spotify,<ref>{{cite magazine |url=https://www.billboard.com/music/music-news/spotify-2018-wrapped-most-streamed-stats-drake-ariana-grande-8488027/ |title=Spotify Announces 2018 'Wrapped' Most Streamed Stats: Drake & Ariana Grande Top the List |magazine=[[Billboard (magazine)|Billboard]] |date=December 4, 2022 |access-date=January 5, 2022 |archive-date=January 5, 2022 |archive-url=https://web.archive.org/web/20220105152631/https://www.billboard.com/music/music-news/spotify-2018-wrapped-most-streamed-stats-drake-ariana-grande-8488027/ |url-status=live}}</ref> and was named [[Billboard Women in Music|''Billboard''<nowiki/>'s Woman of the Year]]. In January 2019, it was announced that Grande would be headlining the [[Coachella Valley Music and Arts Festival]],<ref>{{cite web |url=https://pitchfork.com/news/coachella-announces-2019-lineup-one-artist-at-a-time/ |title=Coachella 2019: Full Lineup Announced |website=Pitchfork |date=January 2, 2019 |access-date=January 3, 2019 |archive-date=July 4, 2019 |archive-url=https://web.archive.org/web/20190704125803/https://pitchfork.com/news/coachella-announces-2019-lineup-one-artist-at-a-time/ |url-status=live}}</ref> where she became the youngest and the fourth female artist ever to headline the festival.<ref>{{cite web |url=https://www.elle.com/culture/celebrities/a25734322/ariana-grande-coachella-headliner/ |title=Ariana Grande Is Making History at Coachella This Year |website=[[Elle (magazine)|Elle]] |date=January 3, 2019 |access-date=January 3, 2019 |archive-date=August 16, 2019 |archive-url=https://web.archive.org/web/20190816000941/https://www.elle.com/culture/celebrities/a25734322/ariana-grande-coachella-headliner/ |url-status=live}}</ref> Grande brought a number of guest artists to perform with her, including [[NSYNC]], [[P. Diddy]], [[Nicki Minaj]], and [[Justin Bieber]]. Her set received critical acclaim.<ref>{{cite web |url=https://jezebel.com/ariana-grande-reportedly-raked-in-8-million-from-coach-1834063930 |title=Ariana Grande Reportedly Raked in $8 Million from Coachella |website=Jezebel |date=April 15, 2019 |access-date=June 18, 2019 |archive-date=August 22, 2019 |archive-url=https://web.archive.org/web/20190822224749/https://jezebel.com/ariana-grande-reportedly-raked-in-8-million-from-coach-1834063930 |url-status=live}}</ref><ref>{{cite web |url=https://pitchfork.com/news/watch-ariana-grande-bring-out-justin-bieber-at-coachella-2019/ |title=Watch Ariana Grande Bring Out Justin Bieber at Coachella 2019 |website=Pitchfork |date=April 22, 2019 |access-date=June 18, 2019 |archive-date=March 2, 2020 |archive-url=https://web.archive.org/web/20200302231206/https://pitchfork.com/news/watch-ariana-grande-bring-out-justin-bieber-at-coachella-2019/ |url-status=live}}</ref> Grande's second single from ''Thank U, Next'', "[[7 Rings]]", was released on January 18, 2019, and debuted at number one on the ''Billboard'' Hot 100 issue dated February 2, becoming her second single in a row (and overall) to top the charts.<ref>{{cite web |url=https://www.mtv.co.uk/news/3ppkql/ariana-grande-breaks-her-own-record-again-with-7-rings |title=Ariana Grande breaks her own record (again) with '7 Rings' |date=January 19, 2019 |website=[[MTV]] UK |access-date=January 26, 2019 |archive-date=January 20, 2019 |archive-url=https://web.archive.org/web/20190120062405/http://www.mtv.co.uk/ariana-grande/news/ariana-grande-breaks-her-own-record-again-with-7-rings |url-status=live}}</ref> It made Grande the third female artist with multiple number-one debuts after Mariah Carey (3) and [[Britney Spears]] (2) and fifth artist overall after [[Justin Bieber]] and [[Drake (musician)|Drake]].<ref>{{cite magazine |url=https://www.billboard.com/pro/ariana-grande-7-rings-hot-100-number-one-debut/ |title=Ariana Grande's '7 Rings' Soars In at No. 1 on Billboard Hot 100 |magazine=[[Billboard (magazine)|Billboard]] |access-date=January 29, 2019 |archive-date=January 27, 2020 |archive-url=https://web.archive.org/web/20200127072053/https://www.billboard.com/articles/columns/chart-beat/8495202/ariana-grande-7-rings-hot-100-number-one-debut |url-status=live}}</ref> Spending eight non-consecutive weeks at the summit, it became Grande's most successful song on the chart<ref>{{Cite magazine |last=Anderson |first=Trevor |date=June 26, 2024 |title=Ariana Grande's Biggest ''Billboard'' Hot 100 Hits |url=https://www.billboard.com/lists/ariana-grande-biggest-hits-hot-100/ |access-date=October 26, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=December 12, 2024 |archive-url=https://web.archive.org/web/20241212113751/https://www.billboard.com/lists/ariana-grande-biggest-hits-hot-100/ |url-status=live}}</ref> and was certified diamond in the US.<ref>{{Cite web |title=American single certifications – Ariana Grande – 7 Rings |url=https://www.riaa.com/gold-platinum/?tab_active=default-award&ar=Ariana+Grande&ti=7+Rings&format=Single&type=#search_section |access-date=August 26, 2024 |publisher=[[Recording Industry Association of America]] |archive-date=October 15, 2024 |archive-url=https://web.archive.org/web/20241015211936/https://www.riaa.com/gold-platinum/?tab_active=default-award&ar=Ariana+Grande&ti=7+Rings&format=Single&type=#search_section |url-status=live}}</ref> "7 Rings" became 2019's fifth-best-selling song globally, and one of the [[List of best-selling singles|best-selling digital singles worldwide]].<ref>{{cite magazine |last=Cirisano |first=Tatiana |date=March 10, 2020 |title=Billie Eilish's 'Bad Guy' Named IFPI's Biggest Global Single of 2019 |url=http://www.billboard.com/articles/news/international/9331529/billie-eilish-bad-guy-ifpi-global-single-2019-list |access-date=August 26, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=March 11, 2020 |archive-url=https://web.archive.org/web/20200311104939/https://www.billboard.com/articles/news/international/9331529/billie-eilish-bad-guy-ifpi-global-single-2019-list |url-status=live}}</ref> ''Thank U, Next'' was released on February 8, 2019, and debuted at number one on the [[Billboard 200|''Billboard'' 200]] while receiving acclaim from critics.<ref name="Metacritic">{{cite web |url=https://www.metacritic.com/music/thank-u-next/ariana-grande |title=Reviews for thank u, next by Ariana Grande |publisher=[[Metacritic]] |access-date=February 11, 2019 |archive-date=March 21, 2019 |archive-url=https://web.archive.org/web/20190321113505/https://www.metacritic.com/music/thank-u-next/ariana-grande |url-status=live}}</ref> The album garnered Grande's largest sales week of all time in the United States (360,000 album-equivalent units).<ref name="BB2002">{{cite magazine |url=https://www.billboard.com/pro/ariana-grande-thank-u-next-debuts-at-no-1-on-billboard-200-chart-album/ |title=Ariana Grande's 'Thank U, Next' Debuts at No. 1 on Billboard 200 Chart With Biggest Streaming Week Ever for a Pop Album |magazine=[[Billboard (magazine)|Billboard]] |last=Caulfield |first=Keith |date=February 17, 2019 |access-date=February 18, 2019 |archive-date=January 5, 2020 |archive-url=https://web.archive.org/web/20200105210938/https://www.billboard.com/articles/columns/chart-beat/8498762/ariana-grande-thank-u-next-debuts-at-no-1-on-billboard-200-chart-album |url-status=live}}</ref> Her fourth number-one album, and second in less than six months, it marked the shortest gap between number-one albums for a woman at the time. ''Thank U, Next'' broke records for the largest streaming week for a pop album and for a female album in the US, with 307 million on-demand streams.<ref name="BB2002"/> At the time, it was the only non-hip hop title among the twenty largest US album streaming weeks, at number eight.<ref name="BB2002"/> The album also achieved the largest streaming week by a female artist in Canada and the United Kingdom.<ref>{{cite web |last=Copsey |first=Rob |date=February 15, 2019 |title=Ariana Grande scores a record-breaking week with Thank U, Next on the Official Chart |url=https://www.officialcharts.com/chart-news/ariana-grande-scores-a-record-breaking-week-with-thank-u-next-on-the-official-chart__25567/ |access-date=October 10, 2024 |publisher=[[Official Charts Company]] |archive-date=February 16, 2019 |archive-url=https://web.archive.org/web/20190216094129/https://www.officialcharts.com/chart-news/ariana-grande-scores-a-record-breaking-week-with-thank-u-next-on-the-official-chart__25567/ |url-status=live}}</ref><ref>{{cite web |title=2019 Nielsen Music/MRC Data Canada Year-End Report |url=https://static.billboard.com/files/pdfs/NIELSEN_2019_YEARENDreportCANADA.pdf |url-status=live |archive-url=https://web.archive.org/web/20200402131151/https://static.billboard.com/files/pdfs/NIELSEN_2019_YEARENDreportCANADA.pdf |archive-date=April 2, 2020 |access-date=April 2, 2020 |publisher=[[Nielsen Holdings|Nielsen]]}}</ref> In June 2020, ''Thank U, Next'' was certified double platinum by the RIAA.<ref>{{Cite web |title=American album certifications – Ariana Grande – Thank U, Next |url=https://www.riaa.com/gold-platinum/?tab_active=default-award&ar=Ariana+Grande&ti=Thank+U%2C+Next&format=Album&type=#search_section |access-date=October 10, 2024 |publisher=[[Recording Industry Association of America]] |archive-date=December 13, 2024 |archive-url=https://web.archive.org/web/20241213225131/https://www.riaa.com/gold-platinum/?tab_active=default-award&ar=Ariana+Grande&ti=Thank+U%2C+Next&format=Album&type=#search_section |url-status=live}}</ref> Grande became the first solo artist to occupy the top three spots on the ''Billboard'' Hot 100 with "7 Rings" at number one, her third single "[[Break Up with Your Girlfriend, I'm Bored]]" debuting at number two, and her lead single "Thank U, Next" rose to number three, and the overall second artist to do so since [[the Beatles]] did in 1964 when they occupied the top five spots.<ref name="B19">{{cite magazine |url=https://www.billboard.com/pro/ariana-grande-top-3-spots-hot-100/ |title=Ariana Grande Claims Nos. 1, 2 & 3 on Billboard Hot 100, Is First Act to Achieve the Feat Since The Beatles in 1964 |magazine=[[Billboard (magazine)|Billboard]] |last=Trust |first=Gary |date=February 19, 2019 |access-date=February 19, 2019 |archive-date=April 5, 2019 |archive-url=https://web.archive.org/web/20190405153906/https://www.billboard.com/articles/columns/chart-beat/8498841/ariana-grande-top-3-spots-hot-100 |url-status=live}}</ref> In the United Kingdom, Grande became the second female solo artist to simultaneously hold the number one and two spots and the first musical artist to replace herself at number one, twice consecutively.<ref>{{cite web |url=https://www.independent.co.uk/arts-entertainment/music/ariana-grande-chart-uk-thank-u-next-new-album-break-up-girlfriend-bored-a8781931.html |title=Ariana Grande just made UK chart history |date=February 15, 2019 |website=The Independent |access-date=February 28, 2019 |archive-date=March 18, 2020 |archive-url=https://web.archive.org/web/20200318185225/https://www.independent.co.uk/arts-entertainment/music/ariana-grande-chart-uk-thank-u-next-new-album-break-up-girlfriend-bored-a8781931.html |url-status=live}}</ref> With eleven ''Thank U, Next'' tracks appearing within the top 40 region on the Hot 100, Grande broke the record for the most simultaneous top 40 entries by a female artist.<ref name=MostTop40>{{cite magazine |url=https://www.billboard.com/pro/ariana-grande-most-simultaneous-top-40-hot-100-hits/ |title=Ariana Grande Breaks Record For Most Simultaneous Top 40 ''Billboard'' Hot 100 Hits by a Female Artist |last=Trust |first=Gary |date=February 19, 2019 |magazine=[[Billboard (magazine)|Billboard]] |access-date=February 19, 2019 |archive-date=February 27, 2020 |archive-url=https://web.archive.org/web/20200227084537/https://www.billboard.com/articles/columns/chart-beat/8498842/ariana-grande-most-simultaneous-top-40-hot-100-hits |url-status=live}}</ref> In February 2019, it was reported Grande would not attend the [[61st Annual Grammy Awards|Grammy Awards]] after she had a disagreement with producers over a potential performance at the ceremony.<ref>{{cite magazine |url=https://www.rollingstone.com/music/music-news/ariana-grande-not-attending-grammys-insulted-790743/ |title=Ariana Grande Not Attending Grammys After Producers 'Insulted' Her |magazine=[[Rolling Stone]] |last=Kreps |first=Daniel |date=February 6, 2019 |access-date=October 18, 2020 |archive-date=August 31, 2020 |archive-url=https://web.archive.org/web/20200831033521/https://www.rollingstone.com/music/music-news/ariana-grande-not-attending-grammys-insulted-790743/ |url-status=live}}</ref> Grande ended up earning her first Grammy, for [[Best Pop Vocal Album]], for ''Sweetener''.<ref>{{cite web |title=Grammys 2019: Ariana Grande Wins First Grammy |url=https://pitchfork.com/news/grammys-2019-ariana-grande-wins-best-pop-vocal-album/ |date=February 10, 2019 |website=[[Pitchfork (website)|Pitchfork]] |access-date=February 10, 2019 |archive-date=January 25, 2020 |archive-url=https://web.archive.org/web/20200125024153/https://pitchfork.com/news/grammys-2019-ariana-grande-wins-best-pop-vocal-album/ |url-status=live}}</ref> The same month, Grande won a [[Brit Award]] for [[Brit Award for International Female Solo Artist|International Female Solo Artist]].<ref>{{cite magazine |url=https://www.billboard.com/articles/news/awards/8499271/brit-awards-2019-winners-list |title=Brit Awards 2019 Winners: The Complete List |magazine=[[Billboard (magazine)|Billboard]] |last=Lynch |first=Joe |date=February 20, 2019 |access-date=February 20, 2019 |archive-date=February 21, 2019 |archive-url=https://web.archive.org/web/20190221122208/https://www.billboard.com/articles/news/awards/8499271/brit-awards-2019-winners-list |url-status=live}}</ref> She also embarked on her third headlining tour, the [[Sweetener World Tour]], to promote both ''Sweetener'' and ''Thank U, Next'', which began on March 18,<ref>{{cite magazine |last=Brandle |first=Lars |url=https://www.billboard.com/articles/news/8481638/ariana-grande-sweetener-tour-dates |title=Ariana Grande Announces 'Sweetener' World Tour: See the Dates |magazine=[[Billboard (magazine)|Billboard]] |date=October 25, 2018 |access-date=October 25, 2018 |archive-date=March 29, 2019 |archive-url=https://web.archive.org/web/20190329110149/https://www.billboard.com/articles/news/8481638/ariana-grande-sweetener-tour-dates |url-status=live}}</ref> and concluded on December 22, 2019.<ref>{{Cite magazine |last=Phull |first=Hardeep |date=December 23, 2019 |title=Ariana Grande Closes Sweetener World Tour in Los Angeles With Tears and Hits Aplenty |url=https://www.billboard.com/pro/last-show-ariana-grande-sweetener-tour-recap/ |url-access=subscription |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=May 25, 2022 |archive-url=https://web.archive.org/web/20220525014350/https://www.billboard.com/pro/last-show-ariana-grande-sweetener-tour-recap/ |url-status=live}}</ref> Spanning 97 shows through North America and Europe, it grossed US$146.6 million with over 1.3 million tickets sold, marking Grande's highest-grossing and biggest tour to date.<ref>{{Cite magazine |last=Frankenberg |first=Eric |date=January 23, 2020 |title=The Sweetener World Tour Finishes as Ariana Grande's Biggest Yet: Final Numbers Are In |url=https://www.billboard.com/articles/business/chart-beat/8548830/sweetener-world-tour-ariana-grande-biggest |url-access=subscription |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=January 23, 2020 |archive-url=https://web.archive.org/web/20200123225815/https://www.billboard.com/articles/business/chart-beat/8548830/sweetener-world-tour-ariana-grande-biggest |url-status=live}}</ref> A live album of the tour's setlist, titled ''[[K Bye for Now (SWT Live)]]'', was released on December 23.<ref>{{Cite web |last1=Hussey |first1=Allison |last2=Monroe |first2=Jazz |date=December 23, 2019 |title=Ariana Grande Releases New Live Album k bye for now |url=https://pitchfork.com/news/ariana-grande-releases-new-live-album-k-bye-for-now/ |access-date=October 11, 2024 |website=[[Pitchfork (website)|Pitchfork]] |archive-date=September 7, 2021 |archive-url=https://web.archive.org/web/20210907202836/https://pitchfork.com/news/ariana-grande-releases-new-live-album-k-bye-for-now/ |url-status=live}}</ref> Grande was nominated for 9 awards at the [[2019 Billboard Music Awards|2019 ''Billboard'' Music Awards]], including [[Billboard Music Award for Top Artist|Top Artist]]. She would win two awards for [[Billboard Music Award for Chart Achievement|''Billboard'' Chart Achievement]] and [[Billboard Music Award for Top Female Artist|Top Female Artist]] on May 1, 2019.<ref name="billboard_8509655">{{cite magazine |last=Lynch |first=Joe |url=https://www.billboard.com/articles/news/awards/8509655/billboard-music-awards-2019-winners-list |title=2019 Billboard Music Awards Winners: The Complete List |magazine=[[Billboard (magazine)|Billboard]] |date=May 1, 2019 |access-date=May 2, 2019 |archive-date=May 16, 2019 |archive-url=https://web.archive.org/web/20190516041948/https://www.billboard.com/articles/news/awards/8509655/billboard-music-awards-2019-winners-list |url-status=live}}</ref> Grande performed at the event via a pre-recorded performance from her Sweetener World Tour.<ref>{{cite magazine |last=Daw |first=Stephen |url=https://www.billboard.com/articles/news/awards/8509712/ariana-grande-performance-7-rings-2019-bbmas |title=Ariana Grande Gives Epic Performance Of '7 Rings' at the 2019 BBMAs: Watch |magazine=[[Billboard (magazine)|Billboard]] |date=May 1, 2019 |access-date=May 2, 2019 |archive-date=May 27, 2019 |archive-url=https://web.archive.org/web/20190527055932/https://www.billboard.com/articles/news/awards/8509712/ariana-grande-performance-7-rings-2019-bbmas |url-status=live}}</ref> Grande co-executive produced [[Charlie's Angels: Original Motion Picture Soundtrack|the soundtrack]] to the film ''[[Charlie's Angels (2019 film)|Charlie's Angels]]'', which was released on November 1, 2019; she co-wrote and performed various songs for the record.<ref>{{cite web |last=Minsker |first=Evan |date=October 11, 2019 |title=Ariana Grande Details ''Charlie's Angels'' Soundtrack: Nicki Minaj, Chaka Khan, Normani, More |url=https://pitchfork.com/news/ariana-grande-details-charlies-angels-soundtrack-nicki-minaj-chaka-khan-normani-more/ |access-date=October 10, 2024 |website=[[Pitchfork (website)|Pitchfork]] |archive-date=October 11, 2019 |archive-url=https://web.archive.org/web/20191011045012/https://pitchfork.com/news/ariana-grande-details-charlies-angels-soundtrack-nicki-minaj-chaka-khan-normani-more/ |url-status=live}}</ref> The soundtrack was met with lukewarm reception.<ref>{{cite magazine |last=Amorosi |first=A.D. |date=November 1, 2019 |title=Album Review: 'Charlie's Angels: Original Motion Picture Soundtrack' |url=https://variety.com/2019/music/reviews/charlies-angels-soundtrack-album-review-ariana-grande-1203390153/ |access-date=October 10, 2024 |magazine=[[Variety (magazine)|Variety]] |archive-date=January 8, 2020 |archive-url=https://web.archive.org/web/20200108021431/https://variety.com/2019/music/reviews/charlies-angels-soundtrack-album-review-ariana-grande-1203390153/ |url-status=live}}</ref><ref>{{cite web |last=Torres |first=Eric |date=November 7, 2019 |title=Various Artists: Charlie's Angels (Original Motion Picture Soundtrack) Album Review |url=https://pitchfork.com/reviews/albums/various-artists-charlies-angels-original-motion-picture-soundtrack/ |access-date=October 10, 2024 |website=[[Pitchfork (website)|Pitchfork]] |archive-date=January 4, 2020 |archive-url=https://web.archive.org/web/20200104051217/https://pitchfork.com/reviews/albums/various-artists-charlies-angels-original-motion-picture-soundtrack/ |url-status=live}}</ref> A collaboration with [[Miley Cyrus]] and [[Lana Del Rey]], titled "[[Don't Call Me Angel]]", was released as the lead single on September 13.<ref>{{cite web |last1=Schatz |first1=Lake |date=September 13, 2019 |title=Ariana Grande, Lana Del Rey, and Miley Cyrus premiere new song "Don't Call Me Angel": Stream |url=https://consequence.net/2019/09/ariana-lana-miley-dont-call-me-angel-stream/ |access-date=October 10, 2024 |work=[[Consequence of Sound]] |archive-date=December 12, 2024 |archive-url=https://web.archive.org/web/20241212064616/https://consequence.net/2019/09/ariana-lana-miley-dont-call-me-angel-stream/ |url-status=live}}</ref> ''[[Pitchfork (website)|Pitchfork]]'' wrote that the pop stars "meet at a lower creative common denominator than they've enjoyed lately".<ref>{{cite web |last1=Anderson |first1=Stacey |date=September 13, 2019 |title="Don't Call Me Angel" by Ariana Grande / Lana Del Rey / Miley Cyrus Review |url=https://pitchfork.com/reviews/tracks/ariana-grande-lana-del-rey-miley-cyrus-dont-call-me-angel/ |access-date=October 10, 2024 |website=Pitchfork |archive-date=February 14, 2020 |archive-url=https://web.archive.org/web/20200214182852/https://pitchfork.com/reviews/tracks/ariana-grande-lana-del-rey-miley-cyrus-dont-call-me-angel/ |url-status=live}}</ref> The track was nominated for [[Satellite Award for Best Original Song|Best Original Song]] at the [[24th Satellite Awards]].<ref>{{cite web |date=December 19, 2019 |title=2019 Winners |url=https://www.pressacademy.com/2019-ipa-awards/ |access-date=October 10, 2024 |website=Satellite Awards |publisher=[[International Press Academy]] |archive-date=December 19, 2019 |archive-url=https://web.archive.org/web/20191219204231/https://www.pressacademy.com/2019-ipa-awards/ |url-status=live}}</ref> In August 2019, she released the single "[[Boyfriend (Ariana Grande and Social House song)|Boyfriend]]" with pop duo [[Social House]];<ref>{{Cite web |last=Allaire |first=Christian |date=August 2, 2019 |title=Ariana Grande and Social House Release "Boyfriend"—A New Song About Crippling Crushes |url=https://www.vogue.com/article/ariana-grande-social-house-boyfriend-music-video |url-status=live |archive-url=https://web.archive.org/web/20240402005312/https://www.vogue.com/article/ariana-grande-social-house-boyfriend-music-video |archive-date=April 2, 2024 |access-date=April 2, 2024 |magazine=Vogue}}</ref> it debuted at number eight on the Hot 100,<ref>{{Cite magazine |last=Zellner |first=Xander |date=August 13, 2019 |title=A History of Boyfriends & Girlfriends on the Hot 100, From 'My Boyfriend's Back' to 'Break Up With Your Girlfriend' |url=https://www.billboard.com/pro/boyfriend-girlfriend-hot-100-chart-history-ariana-grande-social-house/ |url-access=subscription |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=December 17, 2024 |archive-url=https://web.archive.org/web/20241217195242/https://www.billboard.com/pro/boyfriend-girlfriend-hot-100-chart-history-ariana-grande-social-house/ |url-status=live}}</ref> and became the first song by a woman to top the [[Rolling Stone Top 100|''Rolling Stone'' Top 100]] chart.<ref>{{Cite magazine |date=August 12, 2019 |title=RS Charts: Ariana Grande and Social House's 'Boyfriend' is Number One on Top 100 |url=https://www.rollingstone.com/music/music-news/rs-charts-top-100-ariana-grande-social-house-drake-870557/ |access-date=October 10, 2024 |magazine=[[Rolling Stone]] |archive-date=September 13, 2019 |archive-url=https://web.archive.org/web/20190913224019/https://www.rollingstone.com/music/music-news/rs-charts-top-100-ariana-grande-social-house-drake-870557/ |url-status=live}}</ref> Grande co-wrote singer [[Normani]]'s debut solo single "[[Motivation (Normani song)|Motivation]]", which was released on August 16, 2019.<ref>{{cite magazine |url=https://www.rollingstone.com/music/music-news/ariana-grande-feature-normani-next-single-869177/ |title=Normani Reveals Ariana Grande Wrote on Her New Single |last=Holmes |first=Charles |magazine=[[Rolling Stone]] |date=August 8, 2019 |access-date=August 9, 2019 |archive-date=December 11, 2019 |archive-url=https://web.archive.org/web/20191211202222/https://www.rollingstone.com/music/music-news/ariana-grande-feature-normani-next-single-869177/ |url-status=live}}</ref> Grande won three awards at the [[2019 MTV Video Music Awards]], including the Artist of the Year award. She was nominated for 12 awards in total, including Video of the Year for "Thank U, Next".<ref>{{cite web |last=Nordyke |first=Kimberly |url=https://www.hollywoodreporter.com/lists/mtv-vmas-2019-winners-list-updating-1229669/item/best-direction-1229724 |title=MTV Video Music Awards: Taylor Swift, Jonas Brothers, Cardi B Among Winners |date=August 26, 2019 |access-date=August 26, 2019 |magazine=The Hollywood Reporter |archive-date=August 27, 2019 |archive-url=https://web.archive.org/web/20190827052809/https://www.hollywoodreporter.com/lists/mtv-vmas-2019-winners-list-updating-1229669/item/best-direction-1229724 |url-status=live}}</ref> Grande was featured on the remix of American singer and rapper [[Lizzo]]'s song "[[Good as Hell]]", which was released on October 25, 2019.<ref>{{Cite web |last=Legaspi |first=Althea |date=October 25, 2019 |title=Hear Lizzo and Ariana Grande's Romping New Remix of 'Good As Hell' |url=https://www.rollingstone.com/music/music-news/lizzo-ariana-grande-good-as-hell-remix-903647/ |access-date=April 2, 2024 |magazine=[[Rolling Stone]] |archive-date=June 8, 2023 |archive-url=https://web.archive.org/web/20230608041413/https://www.rollingstone.com/music/music-news/lizzo-ariana-grande-good-as-hell-remix-903647/ |url-status=live}}</ref> By the end of the year, ''[[Billboard (magazine)|Billboard]]'' named Grande the most accomplished female artist to debut in the 2010s, while ''[[NME]]'' named her one of the defining music artists of the decade. She also became the most-streamed female artist of the decade on music streaming service Spotify.<ref name="billboard.com"/><ref>{{cite web |url=https://www.nme.com/features/nmes-10-artists-who-defined-the-decade-the-2010s-2583451 |title=''NME''<nowiki/>'s 10 Artists Who Defined The Decade: The 2010s |last=Mylrea |first=Hannah |magazine=[[NME]] |access-date=December 4, 2019 |date=December 3, 2019 |archive-date=March 18, 2020 |archive-url=https://web.archive.org/web/20200318234648/https://www.nme.com/features/nmes-10-artists-who-defined-the-decade-the-2010s-2583451 |url-status=live}}</ref><ref>{{cite web |url=https://www.nme.com/news/music/spotify-reveals-most-streamed-artists-and-songs-of-the-decade-2583604 |title=Spotify reveals most-streamed artists and songs of the decade |last=Skinner |first=Tom |website=[[NME]] |access-date=December 4, 2019 |date=December 3, 2019 |archive-date=December 5, 2019 |archive-url=https://web.archive.org/web/20191205002322/https://www.nme.com/news/music/spotify-reveals-most-streamed-artists-and-songs-of-the-decade-2583604 |url-status=live}}</ref> Also, ''[[Forbes]]'' ranked her amongst the [[Forbes Celebrity 100|highest-paid celebrities]] in 2019, placing at number 62 on the list,<ref>{{cite web |url=https://www.forbes.com/celebrities/ |title=The World's Highest-Paid Entertainers 2019 |work=Forbes |access-date=April 15, 2020 |archive-date=June 28, 2004 |archive-url=https://web.archive.org/web/20040628043820/https://www.forbes.com/celebrities/#34b6f7425947 |url-status=live}}</ref> while ''[[Billboard (magazine)|Billboard]]'' ranked her as 2019's highest-paid solo musician.<ref>{{cite magazine |last=Christman |first=Ed |title=''Billboard''<nowiki/>'s U.S. Money Makers: The Top Paid Musicians of 2019 |url=https://www.billboard.com/articles/business/9434831/billboards-money-makers-the-highest-paid-musicians-of-2019 |access-date=August 3, 2021 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=August 3, 2021 |archive-url=https://web.archive.org/web/20210803064346/https://www.billboard.com/articles/business/9434831/billboards-money-makers-the-highest-paid-musicians-of-2019 |url-status=live}}</ref> According to the [[International Federation of the Phonographic Industry]] (IFPI), ''Thank U, Next'' was the eighth-best-selling album of 2019 globally, having sold over one million copies worldwide.<ref>{{cite magazine |date=March 19, 2020 |title=Arashi Best-Of Tops Taylor Swift for IFPI's Best-Selling Album of 2019 |url=http://www.billboard.com/articles/news/international/9338380/ifpi-best-selling-albums-list-2019 |url-access=subscription |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=March 19, 2020 |archive-url=https://web.archive.org/web/20200319162904/http://www.billboard.com/articles/news/international/9338380/ifpi-best-selling-albums-list-2019 |url-status=live}}</ref> It also ranked as the second-best-performing album on the ''Billboard'' 200 year-end chart of 2019.<ref>{{Cite magazine |date= |title=Year End Charts — ''Billboard'' 200 Albums: 2019 |url=https://www.billboard.com/charts/year-end/2019/top-billboard-200-albums/ |url-access=subscription |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=April 26, 2022 |archive-url=https://web.archive.org/web/20220426130344/https://www.billboard.com/charts/year-end/2019/top-billboard-200-albums/ |url-status=live}}</ref> === 2020–2023: ''Positions'' === {{Main|Positions (album)|l1=''Positions'' (album)}} In January 2020, Grande received multiple nominations at the 2020 [[iHeartRadio Music Awards]], including [[IHeartRadio Music Award for Female Artist of the Year|Female Artist of the Year]].<ref>{{cite magazine |url=https://www.rollingstone.com/music/music-news/billie-eilish-ariana-grande-shawn-mendes-2020-iheartradio-music-awards-nominees-935011/ |title=Billie Eilish, Ariana Grande, Shawn Mendes Lead iHeartRadio Music Awards Nominees |last=Blistering |first=Jon |magazine=[[Rolling Stone]] |access-date=January 8, 2020 |date=January 8, 2020 |archive-date=January 11, 2020 |archive-url=https://web.archive.org/web/20200111084621/https://www.rollingstone.com/music/music-news/billie-eilish-ariana-grande-shawn-mendes-2020-iheartradio-music-awards-nominees-935011/ |url-status=live}}</ref> At the [[62nd Annual Grammy Awards]], Grande performed a medley of "[[Imagine (Ariana Grande song)|Imagine]]", "[[My Favorite Things (song)|My Favorite Things]]", "7 Rings", and "Thank U, Next".<ref>{{Cite magazine |last=Spanos |first=Brittany |date=January 26, 2020 |title=Ariana Grande Performs 'Thank U, Next' Medley at the 2020 Grammy Awards |url=https://www.rollingstone.com/music/music-news/grammys-2020-ariana-grande-performance-thank-u-next-942130/ |access-date=October 10, 2024 |magazine=[[Rolling Stone]] |archive-date=January 27, 2020 |archive-url=https://web.archive.org/web/20200127053029/https://www.rollingstone.com/music/music-news/grammys-2020-ariana-grande-performance-thank-u-next-942130/ |url-status=live}}</ref> Her performance was ranked by various publications among the best of the ceremony.<ref>* {{Cite news |last=Ryan |first=Patrick |date=January 26, 2020 |title=Brutally honest reviews and rankings of every Grammys 2020 performance |url=https://www.usatoday.com/story/entertainment/music/2020/01/26/grammys-2020-brutally-honest-reviews-every-performance-ranked/4585087002/ |access-date=October 10, 2024 |work=[[USA Today]] |archive-date=August 21, 2023 |archive-url=https://web.archive.org/web/20230821235142/https://www.usatoday.com/story/entertainment/music/2020/01/26/grammys-2020-brutally-honest-reviews-every-performance-ranked/4585087002/ |url-status=live}} * {{Cite news |last1=Yahr |first1=Emily |last2=Izadi |first2=Elahe |last3=Andrews |first3=Travis |date=January 27, 2020 |title=Grammy Awards 2020: The performances ranked, from best to worst |url=https://www.washingtonpost.com/arts-entertainment/2020/01/26/grammy-awards-2020-performances-ranked-best-worst/ |access-date=October 10, 2024 |newspaper=[[The Washington Post]]}} * {{Cite magazine |last=Specter |first=Emma |date=January 27, 2020 |title=The 8 Best Performances From the 2020 Grammys |url=https://www.vogue.com/article/best-performances-grammy-awards-2020/ |access-date=October 10, 2024 |magazine=Vogue |archive-date=December 27, 2024 |archive-url=https://web.archive.org/web/20241227022243/https://www.vogue.com/article/best-performances-grammy-awards-2020 |url-status=live}} * {{Cite news |last=Fenwick |first=George |date=January 27, 2020 |title=Grammys 2020: All the performances, ranked from worst to best |url=https://www.standard.co.uk/showbiz/celebrity-news/grammys-2020-performances-ranked-lizzo-tyler-the-creator-a4345711.html |access-date=October 10, 2024 |work=[[Evening Standard]] |archive-date=November 28, 2024 |archive-url=https://web.archive.org/web/20241128101558/https://www.standard.co.uk/showbiz/celebrity-news/grammys-2020-performances-ranked-lizzo-tyler-the-creator-a4345711.html |url-status=live}} * {{Cite web |last1=Grady |first1=Constance |last2=Frank |first2=Allegra |last3=Abad-Santos |first3=Alex |date=January 27, 2020 |title=The 8 best performances from the 2020 Grammys |url=https://www.vox.com/culture/2020/1/26/21083012/2020-grammys-best-performances-lizzo-demi-lovato-video/ |access-date=October 10, 2024 |website=[[Vox (website)|Vox]] |archive-date=December 19, 2024 |archive-url=https://web.archive.org/web/20241219040147/https://www.vox.com/culture/2020/1/26/21083012/2020-grammys-best-performances-lizzo-demi-lovato-video |url-status=live}}</ref> Grande received the third-most nominations (5), including her first nods for [[Grammy Award for Album of the Year|Album of the Year]] (''Thank U, Next'') and [[Record of the Year]] ("7 Rings").<ref>{{Cite news |last=Beaumont-Thomas |first=Ben |date=November 20, 2019 |title=Lizzo, Billie Eilish and Lil Nas X top 2020 Grammy nominations |url=https://www.theguardian.com/music/2019/nov/20/lizzo-billie-eilish-and-lil-nas-x-top-2020-grammy-nominations/ |access-date=October 10, 2024 |work=[[The Guardian]]}}</ref> She was named by ''Billboard'' and ''[[The Hollywood Reporter]]'' as one of the biggest snubs of the ceremony.<ref>{{Cite magazine |last=Grein |first=Paul |date=January 27, 2020 |title=Grammys 2020: The Biggest Snubs and Surprises |url=https://www.billboard.com/music/awards/grammys-2020-the-biggest-snubs-and-surprises-8549247/ |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=December 16, 2024 |archive-url=https://web.archive.org/web/20241216220727/https://www.billboard.com/music/awards/grammys-2020-the-biggest-snubs-and-surprises-8549247/ |url-status=live}}</ref><ref>{{Cite magazine |last=Lewis |first=Hilary |date=January 26, 2020 |title=Grammys Snubs: Ariana Grande and H.E.R. Shut Out |url=https://www.hollywoodreporter.com/news/music-news/grammys-2020-snubs-include-more-just-ariana-grande-1273550/ |access-date=October 10, 2024 |magazine=The Hollywood Reporter |archive-date=November 30, 2024 |archive-url=https://web.archive.org/web/20241130094208/https://www.hollywoodreporter.com/news/music-news/grammys-2020-snubs-include-more-just-ariana-grande-1273550/ |url-status=live}}</ref> Grande and Justin Bieber released a collaboration song titled "[[Stuck with U]]" on May 8, 2020; net proceeds from the sales of the song were donated to the First Responders Children's Foundation in light of the [[COVID-19 pandemic]].<ref name="Kaufman">{{cite magazine |url=https://www.billboard.com/music/pop/justin-bieber-ariana-grande-collaboration-details-9369900/ |title=Justin Bieber & Ariana Grande Are Collaborating For a Good Cause |last=Kaufman |first=Gil |magazine=[[Billboard (magazine)|Billboard]] |access-date=May 1, 2020 |date=May 7, 2020 |archive-date=May 1, 2020 |archive-url=https://web.archive.org/web/20200501212547/https://www.billboard.com/articles/columns/pop/9369900/justin-bieber-ariana-grande-collaboration-details |url-status=live}}</ref> The song debuted at number one on the ''Billboard'' Hot 100'','' becoming Grande's third chart-topping single. Alongside Bieber, both artists tied Mariah Carey and [[Aubrey Graham|Drake]] for the most songs to debut at number one on the Hot 100; Grande became the first artist to have her first three number ones debut at the top, following "Thank U, Next" and "7 Rings".<ref>{{cite magazine |title=Ariana Grande & Justin Bieber's "Stuck With U" Debuts at No. 1 on Hot 100 |url=http://www.billboard.com/articles/business/chart-beat/9379745/ariana-grande-justin-bieber-stuck-with-u-number-one |date=May 18, 2020 |magazine=[[Billboard (magazine)|Billboard]] |access-date=May 18, 2020 |archive-date=May 19, 2020 |archive-url=https://web.archive.org/web/20200519191240/http://www.billboard.com/articles/business/chart-beat/9379745/ariana-grande-justin-bieber-stuck-with-u-number-one |url-status=live}}</ref> Grande appeared on [[Lady Gaga]]'s "[[Rain on Me (Lady Gaga and Ariana Grande song)|Rain on Me]]", the second single from Gaga's sixth studio album ''[[Chromatica]]''.<ref>{{cite web |url=https://www.billboard.com/articles/columns/pop/9379055/lady-gaga-ariana-grande-rain-on-me-release-date |title=Lady Gaga & Ariana Grande's 'Rain on Me' Collaboration Is Coming Really Soon |last=Aniftos |first=Rania |magazine=[[Billboard (magazine)|Billboard]] |date=May 15, 2020 |access-date=May 16, 2020 |archive-date=May 15, 2020 |archive-url=https://web.archive.org/web/20200515235931/https://www.billboard.com/articles/columns/pop/9379055/lady-gaga-ariana-grande-rain-on-me-release-date }}</ref> The song also debuted at number one on the ''Billboard'' Hot 100, becoming Grande's fourth number-one single and helping her break the record for the most number-one debuts on that chart.<ref name="Billboard">{{cite magazine |title=Lady Gaga & Ariana Grande's 'Rain on Me' Debuts at No. 1 on Billboard Hot 100 |url=https://www.billboard.com/articles/business/chart-beat/9394719/rain-on-me-debuts-atop-hot-100-lady-gaga-ariana-grande |magazine=[[Billboard (magazine)|Billboard]] |date=June 2020 |access-date=June 1, 2020 |archive-date=June 3, 2020 |archive-url=https://web.archive.org/web/20200603055218/https://www.billboard.com/articles/business/chart-beat/9394719/rain-on-me-debuts-atop-hot-100-lady-gaga-ariana-grande |url-status=live}}</ref> It won the [[Best Pop Duo/Group Performance]] category at the [[63rd Annual Grammy Awards]].<ref>{{cite news |last=Shafer |first=Ellise |title=Grammys 2021 Winners List |url=https://variety.com/2021/music/news/2021-grammys-winners-list-1234926947/ |access-date=March 14, 2021 |work=[[Variety (magazine)|Variety]] |date=March 14, 2021 |archive-date=March 16, 2021 |archive-url=https://web.archive.org/web/20210316041012/https://variety.com/2021/music/news/2021-grammys-winners-list-1234926947/ |url-status=live}}</ref> In 2020, Grande became the highest-earning woman in music on ''[[Forbes]]''{{'}}s 2020 [[Celebrity 100]] list, placing 17th overall with $72&nbsp;million.<ref>{{cite web |url=https://www.forbes.com/celebrities |title=The World's Highest Paid Celebrities |last=Greenburg |first=Zack O'Malley |date=June 4, 2020 |work=Forbes |access-date=June 4, 2020 |archive-date=June 28, 2004 |archive-url=https://web.archive.org/web/20040628043820/https://www.forbes.com/celebrities |url-status=live}}</ref> At the [[2020 MTV Video Music Awards]], she was nominated for nine awards for both "Stuck with U" (with Bieber) and "Rain on Me" (with Gaga). For the latter, Grande received her third consecutive nomination for [[MTV Video Music Award for Video of the Year|Video of the Year]]. She won four awards, including [[MTV Video Music Award for Song of the Year|Song of the Year]] for "Rain on Me".<ref name="auto">{{cite news |url=http://www.mtv.com/news/3169506/vmas-winners-list-2020/ |title=2020 MTV VMA Winners: see the full list |first=Patrick |last=Hosken |date=August 30, 2020 |access-date=August 30, 2020 |publisher=[[MTV News]] |archive-date=August 31, 2020 |archive-url=https://web.archive.org/web/20200831025120/http://www.mtv.com/news/3169506/vmas-winners-list-2020/ }}</ref><ref>{{Cite magazine |last=Warner |first=Denise |date=August 30, 2020 |title=Here Are All the Winners From the 2020 MTV VMAs |url=https://www.billboard.com/music/awards/mtv-vmas-winners-list-2020-9442281/ |access-date=April 1, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=October 13, 2022 |archive-url=https://web.archive.org/web/20221013064642/https://www.billboard.com/music/awards/mtv-vmas-winners-list-2020-9442281/ |url-status=live}}</ref> Grande's sixth studio album, ''[[Positions (album)|Positions]]'', was released on October 30, 2020.<ref>{{cite web |url=https://www.npr.org/2020/10/30/926671488/ariana-grande-releases-new-album-positions-her-most-explicit-to-date |title=Ariana Grande Releases New Album 'Positions,' Her Most Explicit To Date |date=October 30, 2020 |last=Harris |first=Latesha |access-date=October 31, 2020 |publisher=[[NPR]] |archive-date=October 30, 2020 |archive-url=https://web.archive.org/web/20201030170043/https://www.npr.org/2020/10/30/926671488/ariana-grande-releases-new-album-positions-her-most-explicit-to-date |url-status=live}}</ref> It debuted at number one on the [[Billboard 200|''Billboard'' 200]] with first-week sales of 174,000 units, becoming Grande's fifth number-one album.<ref name=":2">{{cite magazine |url=https://www.billboard.com/articles/business/chart-beat/9480311/ariana-grande-positions-tops-billboard-200/ |title=Ariana Grande Claims Fifth No. 1 Album on Billboard 200 Chart With 'Positions' |magazine=[[Billboard (magazine)|Billboard]] |first=Keith |last=Caulfield |date=November 8, 2020 |access-date=November 9, 2020 |archive-date=November 8, 2020 |archive-url=https://web.archive.org/web/20201108202106/https://www.billboard.com/articles/business/chart-beat/9480311/ariana-grande-positions-tops-billboard-200/ |url-status=live}}</ref> Her third chart-topping album in two years and three months, it marked the fastest accumulation of three number-oe albums by a woman at that time.<ref name=":2"/> Following its vinyl LPs release in April 2021, ''Positions'' achieved the largest vinyl sales week (32,000) by a female artist since [[MRC Data]]'s inauguration in 1991, at that time.<ref>{{cite magazine |title=Taylor Swift's 'Evermore' Breaks Modern-Era Record for Biggest Vinyl Album Sales Week |url=https://www.billboard.com/articles/news/9580407/taylor-swift-evermore-record-breaking-vinyl-album-sales-week |url-status=live |archive-url=https://web.archive.org/web/20210531190705/https://www.billboard.com/articles/news/9580407/taylor-swift-evermore-record-breaking-vinyl-album-sales-week/ |archive-date=May 31, 2021 |access-date=June 1, 2021 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> The [[Positions (song)|eponymous lead single]] was released on October 23.<ref>{{cite web |url=https://www.vulture.com/2020/10/ariana-grande-teases-release-of-new-single-positions.html |title=Get Into 'Position' for Ariana Grande's New Single |last=Sinha |first=Charu |website=[[Vulture (websitee)|Vulture]] |date=October 21, 2020 |access-date=October 22, 2020 |archive-date=October 21, 2020 |archive-url=https://web.archive.org/web/20201021100828/https://www.vulture.com/2020/10/ariana-grande-teases-release-of-new-single-positions.html |url-status=live}}</ref> It debuted atop the ''[[Billboard (magazine)|Billboard]]'' [[Hot 100]], becoming Grande's fifth chart-topping single and breaking numerous records. Grande became the first artist to have five number-one debuts on the Hot 100 and the first to have their first five number-ones debut at the top. "Positions" became her third number-one single in 2020 following "Stuck with U" and "Rain on Me", making Grande the first artist since Drake to have three number-one singles in a single calendar year and the first female artist to do so since [[Rihanna]] and Katy Perry in 2010.<ref name="billboardpositions">{{cite magazine |url=https://www.billboard.com/articles/business/chart-beat/9477041/ariana-positions-luke-combs-hot-100-number-one |title=Ariana Grande's 'Positions' Debuts at No. 1 on Hot 100, Luke Combs' 'Forever After All' Launches at No. 2 |last=Trust |first=Gary |magazine=[[Billboard (magazine)|Billboard]] |date=November 2, 2020 |access-date=November 2, 2020 |archive-date=November 8, 2020 |archive-url=https://web.archive.org/web/20201108154842/https://www.billboard.com/articles/business/chart-beat/9477041/ariana-positions-luke-combs-hot-100-number-one |url-status=live}}</ref> It topped the [[Pop Airplay]] chart for seven weeks, surpassing "7 Rings" (six weeks) as Grande's longest-running number-one on the chart.<ref name="popairplaytoptwo">{{cite magazine |url=https://www.billboard.com/articles/business/chart-beat/9522731/ariana-grande-34-35-tops-pop-airplay-chart |title=Ariana Grande Replaces Herself Atop Pop Airplay Chart as '34+35' Dethrones 'Positions' |magazine=[[Billboard (magazine)|Billboard]] |last=Trust |first=Gary |date=February 8, 2021 |access-date=October 10, 2024 |archive-date=October 19, 2021 |archive-url=https://web.archive.org/web/20211019232819/https://www.billboard.com/articles/business/chart-beat/9522731/ariana-grande-34-35-tops-pop-airplay-chart |url-status=live}}</ref> Alongside the release of ''Positions'', the track "[[34+35]]" served as the second single off the album. Debuting at number eight, it became Grande's 18th top-ten single.<ref name="bil-1">{{cite magazine |last=Trust |first=Gary |date=November 9, 2020 |title=24kGoldn & Iann Dior's 'Mood' Swings Back to No. 1 on Hot 100; Ariana Grande, Bad Bunny & Jhay Cortez Debut in Top 10 |url=https://www.billboard.com/articles/business/chart-beat/9480738/24kgoldn-iann-dior-mood-number-one-third-week/ |magazine=[[Billboard (magazine)|Billboard]] |access-date=November 11, 2020 |archive-date=November 15, 2020 |archive-url=https://web.archive.org/web/20201115150228/https://www.billboard.com/articles/business/chart-beat/9480738/24kgoldn-iann-dior-mood-number-one-third-week/ |url-status=live}}</ref> Grande released a "34+35" remix featuring American rappers [[Doja Cat]] and [[Megan Thee Stallion]] on January 15, 2021. The remix helped the song reach a new peak at number two, the highest-charting song credited to three or more female soloists on the Hot 100 since [[Christina Aguilera]], [[Mýa]], [[Pink (singer)|Pink]] and [[Lil' Kim]]'s "Lady Marmalade" in 2001.<ref>{{cite magazine |last=Trust |first=Gary |date=January 25, 2021 |title=Olivia Rodrigo's 'Drivers License' No. 1 on Hot 100 for 2nd Week, Ariana Grande's '34+35' Bounds to No. 2 |url=https://www.billboard.com/articles/business/chart-beat/9515956/olivia-rodrigo-drivers-license-number-one-second-week-hot-100/ |access-date=January 25, 2021 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=January 25, 2021 |archive-url=https://web.archive.org/web/20210125213933/https://www.billboard.com/articles/business/chart-beat/9515956/olivia-rodrigo-drivers-license-number-one-second-week-hot-100/ |url-status=live}}</ref> The remix was one of five bonus tracks included on the deluxe edition of ''Positions'', released on February 19, 2021.<ref>{{Cite web |last=Close |first=Paris |date=February 19, 2021 |title=Hear 5 New Songs From Ariana Grande's 'Positions' Deluxe Album |url=https://www.iheart.com/content/2021-02-19-hear-5-new-songs-from-ariana-grandes-positions-deluxe-album/ |access-date=April 2, 2025 |publisher=[[iHeart]] |archive-date=April 25, 2025 |archive-url=https://web.archive.org/web/20250425052616/https://www.iheart.com/content/2021-02-19-hear-5-new-songs-from-ariana-grandes-positions-deluxe-album/ |url-status=live}}</ref> On the Pop Airplay chart issue dated February 13, "34+35" replaced Grande's own "Positions" at number one, making her the first artist to replace herself at the summit as the only act credited on both tracks.<ref name="popairplaytoptwo"/> On the following chart issue, Grande occupied the top two of the chart with "34+35" and "Positions", becoming the first artist to simultaneously occupy the top two with two solo tracks.<ref name="popairplaytoptwo"/><ref name="popairplayfeb2021">{{Cite magazine |title=Pop Airplay: Week of February 20, 2021) |url=https://www.billboard.com/charts/pop-songs/2021-02-20 |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=March 3, 2021 |archive-url=https://web.archive.org/web/20210303092657/https://www.billboard.com/charts/pop-songs/2021-02-20 |url-status=live}}</ref> "34+35" remained at number one for three consecutive weeks;<ref>{{Cite magazine |title=''Billboard'' Pop Airplay Chart: Week of February 27, 2021 |url=https://www.billboard.com/charts/pop-songs/2021-02-27 |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=March 16, 2021 |archive-url=https://web.archive.org/web/20210316004218/https://www.billboard.com/charts/pop-songs/2021-02-27 |url-status=live}}</ref> it also topped the [[Rhythmic (chart)|Rhythmic]] airplay chart, marking Grande's third leader.<ref>{{Cite magazine |date=March 9, 2021 |title=Ariana Grande Rhythmic Airplay Chart History |url=https://www.billboard.com/artist/ariana-grande/chart-history/tfc/ |url-status=live |access-date=March 9, 2021 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=March 1, 2021 |archive-url=https://web.archive.org/web/20210301200146/https://www.billboard.com/music/ariana-grande/chart-history/TFC}}</ref> In March, the song "[[POV (song)|POV]]" was sent to radio as the album's third single. The song reached number 27 on the Hot 100 and the top ten on mainstream radio, making Grande the first artist to have three concurrent songs in the top ten on Pop Airplay; it later peaked at number three.<ref>{{cite magazine |last=Trust |first=Gary |date=May 10, 2021 |title=3 Top 10 'Positions': Ariana Grande Makes History on Pop Airplay Chart |url=https://www.billboard.com/pro/ariana-grande-makes-history-pop-airplay-chart-three-top-10-songs/ |access-date=February 11, 2023 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=February 11, 2023 |archive-url=https://web.archive.org/web/20230211072629/https://www.billboard.com/pro/ariana-grande-makes-history-pop-airplay-chart-three-top-10-songs/ |url-status=live}}</ref> Grande was named the most-played artist on [[iHeartRadio]]'s stations in 2021, reaching 2.6 billion in audience.<ref>{{cite magazine |last1=Aswad |first1=Jem |title=Dua Lipa's 'Levitating,' Ariana Grande Top iHeartRadio's Most-Played Lists of 2021 |url=https://variety.com/2021/music/news/dua-lipa-levitating-ariana-grande-iheartradio-most-played-2021-1235120854/ |magazine=Variety |access-date=November 30, 2021 |date=November 29, 2021 |archive-date=November 29, 2021 |archive-url=https://web.archive.org/web/20211129214619/https://variety.com/2021/music/news/dua-lipa-levitating-ariana-grande-iheartradio-most-played-2021-1235120854/amp/ |url-status=live}}</ref> ''Positions'' ranked at number eight on the 2021 year-end ''Billboard'' 200 chart.<ref>{{Cite magazine |date= |title=Year-End Charts — ''Billboard'' 200 Albums: 2021 |url=https://www.billboard.com/charts/year-end/2021/top-billboard-200-albums/ |url-access=subscription |access-date=October 11, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=December 3, 2021 |archive-url=https://web.archive.org/web/20211203104042/https://www.billboard.com/charts/year-end/2021/top-billboard-200-albums/ |url-status=live}}</ref> On November 13, 2020, Grande made a surprise appearance on the [[Adult Swim]] Festival, performing music artist [[Thundercat (musician)|Thundercat]]'s song "Them Changes" alongside him, which Grande had previously covered.<ref>{{cite magazine |url=https://www.rollingstone.com/music/music-news/ariana-grande-them-changes-thundercat-adult-swim-festival-1090593/ |title=See Ariana Grande Perform 'Them Changes' With Thundercat at Adult Swim Festival |last=Kreps |first=Daniel |magazine=[[Rolling Stone]] |date=November 13, 2020 |access-date=December 3, 2020 |archive-date=May 17, 2021 |archive-url=https://web.archive.org/web/20210517235648/https://www.rollingstone.com/music/music-news/ariana-grande-them-changes-thundercat-adult-swim-festival-1090593/ |url-status=live}}</ref> Grande and [[Jennifer Hudson]] also featured on a remix of [[Mariah Carey]]'s 2010 Christmas song "[[Oh Santa!]]". The song was released on December 4, 2020, as part of ''[[Mariah Carey's Magical Christmas Special]]''.<ref>{{cite magazine |url=https://www.billboard.com/articles/news/holiday/9493952/mariah-carey-ariana-grande-jennifer-hudson-oh-santa |title=Mariah Carey, Ariana Grande & Jennifer Hudson Have Blessed Us With 'Oh Santa!' |last=Aniftos |first=Rania |magazine=[[Billboard (magazine)|Billboard]] |date=December 3, 2020 |access-date=December 3, 2020 |archive-date=April 21, 2021 |archive-url=https://web.archive.org/web/20210421063358/https://www.billboard.com/articles/news/holiday/9493952/mariah-carey-ariana-grande-jennifer-hudson-oh-santa |url-status=live}}</ref> Grande released the concert film for her [[Sweetener World Tour]], ''[[Excuse Me, I Love You]],'' on December 21, 2020, exclusively on [[Netflix]].<ref>{{Cite magazine |last=Blistein |first=Jon |date=December 9, 2020 |title=Ariana Grande Announces 'Sweetener' Concert Film 'Excuse Me, I Love You' |url=https://www.rollingstone.com/music/music-news/ariana-grande-sweetener-concert-film-excuse-me-i-love-you-1101246/ |access-date=April 2, 2024 |magazine=[[Rolling Stone]] |archive-date=April 2, 2024 |archive-url=https://web.archive.org/web/20240402002736/https://www.rollingstone.com/music/music-news/ariana-grande-sweetener-concert-film-excuse-me-i-love-you-1101246/ |url-status=live}}</ref> In April 2021, Grande was featured on a remix of [[the Weeknd]]'s "[[Save Your Tears]]".<ref>{{cite magazine |last=Mamo |first=Heran |date=April 23, 2021 |title=The Weeknd Drops 'Save Your Tears' Remix With Ariana Grande: Stream It Now |url=https://www.billboard.com/music/pop/the-weeknd-ariana-grande-save-your-tears-remix-stream-9561503/ |magazine=[[Billboard (magazine)|Billboard]] |access-date=April 23, 2021 |archive-date=April 23, 2021 |archive-url=https://web.archive.org/web/20210423040929/https://www.billboard.com/articles/columns/pop/9561503/the-weeknd-ariana-grande-save-your-tears-remix-stream/ |url-status=live}}</ref> The remix reached number one on the ''Billboard'' Hot 100 and [[Canadian Hot 100]], becoming both artists' sixth number-one single on both charts.<ref>{{cite magazine |date=May 10, 2021 |title=Ariana Grande (Chart History): Canadian Hot 100 |url=https://www.billboard.com/artist/ariana-grande/chart-history/can/ |access-date=January 15, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=March 1, 2021 |archive-url=https://web.archive.org/web/20210301072014/https://www.billboard.com/music/ariana-grande/chart-history/CAN |url-status=live}}</ref> It also topped the ''Billboard'' Global 200, marking Grande's second number-one single on the chart; it made her the first woman to earn multiple leaders on the chart.<ref>{{cite magazine |last=McIntyre |first=Hugh |date=May 4, 2021 |title=Ariana Grande Joins BTS As The Only Musicians To Hit No. 1 On Billboard's Global Chart More Than Once |url=https://www.forbes.com/sites/hughmcintyre/2021/05/04/ariana-grande-joins-bts-as-the-only-musicians-to-hit-no-1-on-billboards-global-chart-more-than-once/ |access-date=September 6, 2024 |magazine=Forbes |archive-date=May 5, 2021 |archive-url=https://web.archive.org/web/20210505152917/https://www.forbes.com/sites/hughmcintyre/2021/05/04/ariana-grande-joins-bts-as-the-only-musicians-to-hit-no-1-on-billboards-global-chart-more-than-once/ |url-status=live}}</ref> She joined [[Paul McCartney]] as the only artists to earn three number-one duets on the Hot 100.<ref>{{cite magazine |last=Trust |first=Gary |date=May 3, 2021 |title=The Weeknd & Ariana Grande's 'Save Your Tears' Soars to No. 1 on Billboard Hot 100 |url=https://www.billboard.com/articles/news/9566597/the-weeknd-ariana-grande-save-your-tears-number-one-hot-100/ |access-date=May 3, 2021 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=October 9, 2021 |archive-url=https://web.archive.org/web/20211009233826/https://www.billboard.com/articles/news/9566597/the-weeknd-ariana-grande-save-your-tears-number-one-hot-100 |url-status=live}}</ref> With 69 weeks, the remix is among [[List of Billboard Hot 100 chart achievements and milestones#Most total weeks on the Hot 100|longest-charting songs]] on the Hot 100, and Grande's longest-charting song in the United States.<ref>{{Cite magazine |last=Zellner |first=Xander |date=October 17, 2022 |title=Glass Animals' 'Heat Waves' Is Now the Longest Charting Hot 100 Song of All Time |url=https://www.billboard.com/music/chart-beat/glass-animals-heat-waves-is-now-longest-charting-hot-100-song-1235157060/ |access-date=August 26, 2023 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=October 18, 2022 |archive-url=https://web.archive.org/web/20221018000513/https://www.billboard.com/music/chart-beat/glass-animals-heat-waves-is-now-longest-charting-hot-100-song-1235157060/ |url-status=live}}</ref> It ranked as the second best-performing song of the year on the ''Billboard'' [[Billboard Year-End Hot 100 singles of 2021|year-end Hot 100]], [[Billboard Year-End Global 200 singles of 2021|Global 200, and Global Excl. US charts]] of 2021.<ref>{{cite magazine |last1=Trust |first1=Gary |last2=Caulfield |first2=Keith |date=December 2, 2021 |title=The Year In Charts 2021: Dua Lipa's 'Levitating' Is the No. 1 Billboard Hot 100 Song of the Year |url=https://www.billboard.com/music/chart-beat/dua-lipa-levitating-2021-hot-100-top-song-year-in-charts-1235004941/ |access-date=January 15, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=December 3, 2021 |archive-url=https://web.archive.org/web/20211203190631/https://www.billboard.com/music/chart-beat/dua-lipa-levitating-2021-hot-100-top-song-year-in-charts-1235004941/ |url-status=live}}</ref><ref>{{Cite magazine |date=December 2, 2021 |title=''Billboard'' Global 200 – Year-End 2021 |url=https://www.billboard.com/charts/year-end/2021/billboard-global-200/ |access-date=September 6, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=December 3, 2021 |archive-url=https://web.archive.org/web/20211203103102/https://www.billboard.com/charts/year-end/2021/billboard-global-200/ |url-status=live}}</ref><ref>{{Cite magazine |last=Frankenberg |first=Eric |date=December 2, 2021 |title=The Year in Global Charts 2021: Dua Lipa, BTS & Olivia Rodrigo Lead Inaugural Year-End Rankings |url=https://www.billboard.com/music/chart-beat/global-charts-2021-year-end-ranking-1235005077/ |access-date=September 6, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=January 12, 2022 |archive-url=https://web.archive.org/web/20220112181325/https://www.billboard.com/music/chart-beat/global-charts-2021-year-end-ranking-1235005077/ |url-status=live}}</ref> Grande and the Weeknd performed "Save Your Tears" together at the [[2021 iHeartRadio Music Awards]].<ref>{{cite web |last=Bloom |first=Madison |date=May 27, 2021 |title=Watch the Weeknd and Ariana Grande Perform 'Save Your Tears' at 2021 iHeartRadio Music Awards |url=https://pitchfork.com/news/watch-the-weeknd-and-ariana-grande-perform-save-your-tears-at-2021-iheartradio-music-awards/ |access-date=July 8, 2021 |website=[[Pitchfork (website)|Pitchfork]] |archive-date=July 9, 2021 |archive-url=https://web.archive.org/web/20210709192806/https://pitchfork.com/news/watch-the-weeknd-and-ariana-grande-perform-save-your-tears-at-2021-iheartradio-music-awards/ |url-status=live}}</ref> In June 2021, Grande featured on the song "I Don't Do Drugs" from Doja Cat's third studio album ''[[Planet Her]]''.<ref>{{cite magazine |last=Legaspi |first=Althea |date=June 9, 2021 |title=Doja Cat Enlists Ariana Grande, the Weeknd for New 'Planet Her' Album |url=https://www.rollingstone.com/music/music-news/doja-cat-ariana-grande-the-weeknd-planet-her-1181716/ |access-date=July 8, 2021 |magazine=[[Rolling Stone]] |archive-date=July 22, 2021 |archive-url=https://web.archive.org/web/20210722121929/https://www.rollingstone.com/music/music-news/doja-cat-ariana-grande-the-weeknd-planet-her-1181716/ |url-status=live}}</ref> Her contribution as a songwriter and featured artist on the song earned Grande a nomination for [[Grammy Award for Album of the Year|Album of the Year]] at the [[64th Annual Grammy Awards]]. In September 2021, she joined as a coach of the [[The Voice (American TV series) season 21|twenty-first season]] of ''[[The Voice (American TV series)|The Voice]]''; Grande became the highest-paid coach in the show's history, earning a reported $25 million for that season.<ref>{{cite web |last=Swaroop |first=Ananya |date=April 1, 2021 |title=Ariana Grande Is the Highest-Paid Coach in 'Voice' History—Here's Her Salary & Net Worth |url=https://www.yahoo.com/now/ariana-grande-highest-paid-coach-230007598.html |url-status=live |archive-url=https://web.archive.org/web/20211110145043/https://www.yahoo.com/now/ariana-grande-highest-paid-coach-230007598.html |archive-date=November 10, 2021 |access-date=January 19, 2022 |website=[[Yahoo!]]}}</ref> The season concluded in December 2021; Grande did not return for the next season.<ref>{{Cite magazine |last=Donaldson |first=Laura |date=September 19, 2022 |title='The Voice' 2022: Why Did Ariana Grande and Kelly Clarkson Leave NBC Show? |url=https://www.newsweek.com/voice-ariana-grande-kelly-clarkson-why-leave-not-left-what-happened-judges-coaches-1743667/ |access-date=September 17, 2024 |magazine=[[Newsweek]] |archive-date=November 30, 2024 |archive-url=https://web.archive.org/web/20241130100949/https://www.newsweek.com/voice-ariana-grande-kelly-clarkson-why-leave-not-left-what-happened-judges-coaches-1743667 |url-status=live}}</ref> Later in December, she appeared in [[Adam McKay]]'s film ''[[Don't Look Up]]'', alongside [[Leonardo DiCaprio]], [[Jennifer Lawrence]], and [[Meryl Streep]]. With streams of more than 152&nbsp;million hours in a week, it broke the record for the biggest viewership week in [[Netflix]] history, at the time.<ref>{{cite magazine |last1=Yossman |first1=K. J. |title=Adam McKay's 'Don't Look Up' Smashes Netflix Viewing Records With Over 150&nbsp;Million Hours Viewed |url=https://variety.com/2022/film/news/dont-look-up-netflix-weekly-viewing-records-1235147910/ |access-date=January 8, 2022 |magazine=Variety |date=January 6, 2022 |archive-date=January 7, 2022 |archive-url=https://web.archive.org/web/20220107000509/https://variety.com/2022/film/news/dont-look-up-netflix-weekly-viewing-records-1235147910/ |url-status=live}}</ref> To promote the film, Grande released the song "[[Just Look Up]]", in collaboration with rapper [[Kid Cudi]], on December 3, 2021.<ref>{{cite magazine |url=https://www.nme.com/news/music/ariana-grande-kid-cudi-collaboration-just-look-up-clip-listen-3098626%3fa |title=Hear Ariana Grande and Kid Cudi's new collaboration, 'Just Look Up' |last=Skinner |first=Tom |magazine=[[NME]] |date=December 3, 2021 |access-date=December 14, 2021 |archive-date=April 4, 2023 |archive-url=https://web.archive.org/web/20230404193403/https://www.nme.com/news/music/ariana-grande-kid-cudi-collaboration-just-look-up-clip-listen-3098626?a |url-status=live}}</ref> At the [[27th Critics' Choice Awards]], Grande received nominations in the categories [[Critics' Choice Movie Award for Best Song|Best Song]] and [[Critics' Choice Movie Award for Best Acting Ensemble|Best Acting Ensemble]], as a part of the cast.<ref>{{cite magazine |last=Nordyke |first=Kimberly |date=March 13, 2022 |title=Critics Choice Awards: Winners List |url=https://www.hollywoodreporter.com/movies/movie-news/critics-choice-awards-winners-list-full-1235110430/ |access-date=January 9, 2024 |magazine=[[The Hollywood Reporter]] |archive-date=January 19, 2023 |archive-url=https://web.archive.org/web/20230119112750/https://www.hollywoodreporter.com/movies/movie-news/critics-choice-awards-winners-list-full-1235110430/ |url-status=live}}</ref> She also received a nomination at the [[28th Screen Actors Guild Awards]] for [[Screen Actors Guild Award for Outstanding Performance by a Cast in a Motion Picture|Outstanding Performance by a Cast in a Motion Picture]].<ref>{{cite magazine |last=Nordyke |first=Kimberly |date=February 27, 2022 |title=SAG Awards: Winners List |url=https://www.hollywoodreporter.com/movies/movie-news/sag-awards-winners-2022-complete-list-1235100358/ |url-status=live |archive-url=https://web.archive.org/web/20220228001511/https://www.hollywoodreporter.com/movies/movie-news/sag-awards-winners-2022-complete-list-1235100358/ |archive-date=February 28, 2022 |access-date=January 9, 2024 |magazine=[[The Hollywood Reporter]]}}</ref> On February 24, 2023, following months-long renewed interest in and virality of the Weeknd's 2016 song "Die for You", [[Die for You (The Weeknd song)#Ariana Grande remix|a remix]] of the song with Grande was released. It marked their fourth collaboration.<ref>{{cite web |last=Strauss |first=Matthew |date=February 24, 2023 |title=The Weeknd Enlists Ariana Grande for New "Die for You (Remix)" |url=https://pitchfork.com/news/the-weeknd-enlists-ariana-grande-for-new-die-for-you-remix-listen/ |access-date=June 21, 2023 |website=Pitchfork |archive-date=August 19, 2023 |archive-url=https://web.archive.org/web/20230819222159/https://pitchfork.com/news/the-weeknd-enlists-ariana-grande-for-new-die-for-you-remix-listen/ |url-status=live}}</ref> The remix topped the ''Billboard'' Hot 100 chart, becoming both artists' seventh number-one hit. Grande became the artist with the most number-one duets (four) on the chart, surpassing McCartney.<ref>{{cite magazine |last=Trust |first=Gary |date=March 6, 2023 |title=The Weeknd & Ariana Grande's 'Die for You' Leaps to No. 1 on Billboard Hot 100 |url=https://www.billboard.com/music/chart-beat/the-weeknd-ariana-grande-die-for-you-number-one-billboard-hot-100-1235280422/ |access-date=June 21, 2023 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=March 6, 2023 |archive-url=https://web.archive.org/web/20230306180602/https://www.billboard.com/music/chart-beat/the-weeknd-ariana-grande-die-for-you-number-one-billboard-hot-100-1235280422/ |url-status=live}}</ref> According to the [[International Federation of the Phonographic Industry]] (IFPI), it was the [[List of best-selling singles#Best-selling singles by year worldwide|fourth best-selling song of 2023]] globally.<ref>{{Cite magazine |last=Brandle |first=Lars |date=February 26, 2024 |title=Miley Cyrus' 'Flowers' Wins IFPI Global Single Award For 2023 |url=https://www.billboard.com/music/awards/miley-cyrus-flowers-ifpi-global-single-award-2023-1235614759/ |access-date=February 26, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=February 26, 2024 |archive-url=https://web.archive.org/web/20240226153802/https://www.billboard.com/music/awards/miley-cyrus-flowers-ifpi-global-single-award-2023-1235614759/ |url-status=live}}</ref> On August 25, 2023, Grande released a reissue of her debut studio album, ''[[Yours Truly (Ariana Grande album)#Yours Truly (Tenth Anniversary Edition)|Yours Truly (Tenth Anniversary Edition)]]''.<ref>{{cite web |last=Bloom |first=Madison |title=Ariana Grande Releasing ''Yours Truly'' 10th Anniversary Reissue Friday |date=August 19, 2023 |website=Pitchfork |url=https://pitchfork.com/news/ariana-grande-releasing-yours-truly-10th-anniversary-reissue-friday/ |access-date=August 26, 2023 |archive-date=August 25, 2023 |archive-url=https://web.archive.org/web/20230825112052/https://pitchfork.com/news/ariana-grande-releasing-yours-truly-10th-anniversary-reissue-friday/ |url-status=live}}</ref><ref>{{cite magazine |last=Kreps |first=Daniel |title=Ariana Grande Details Week's Worth of 'Yours Truly' 10th Anniversary Plans |date=August 19, 2023 |magazine=[[Rolling Stone]] |url=https://www.rollingstone.com/music/music-news/ariana-grande-yours-truly-10th-anniversary-1234809258/ |access-date=August 26, 2023 |archive-date=August 24, 2023 |archive-url=https://web.archive.org/web/20230824212444/https://www.rollingstone.com/music/music-news/ariana-grande-yours-truly-10th-anniversary-1234809258/ |url-status=live}}</ref> On December 9, 2023, Grande and Jennifer Hudson made a surprise appearance onstage to sing the "Oh Santa!" remix at Mariah Carey's show at the [[Madison Square Garden]], of her [[Merry Christmas One and All!]] tour.<ref>{{cite magazine |last=Russell |first=Shania |date=December 10, 2023 |title=Mariah Carey invites her 'Christmas angels' Ariana Grande and Jennifer Hudson onstage for 'Oh Santa' |url=https://ew.com/watch-mariah-carey-ariana-grande-jennifer-hudson-sing-oh-santa-8413972 |access-date=January 9, 2024 |magazine=[[Entertainment Weekly]] |archive-date=January 9, 2024 |archive-url=https://web.archive.org/web/20240109145933/https://ew.com/watch-mariah-carey-ariana-grande-jennifer-hudson-sing-oh-santa-8413972 |url-status=live}}</ref> === 2024–present: ''Eternal Sunshine'', ''Wicked'', and focus on acting === [[File:Ariana Grande Wicked Interview 2024 03.jpg|thumb|upright|left|Grande in 2024]] Grande's seventh studio album, titled ''[[Eternal Sunshine (album)|Eternal Sunshine]]'', was released on March 8, 2024. It was preceded by its lead single, "[[Yes, And?]]", released on January 12.<ref>{{cite magazine |last1=Spanos |first1=Brittany |title=Ariana Grande Strikes A Pose With House Single 'Yes, And?' |url=https://www.rollingstone.com/music/music-news/ariana-grande-yes-and-song-release-1234945134/ |access-date=January 12, 2024 |magazine=[[Rolling Stone]] |archive-date=January 12, 2024 |archive-url=https://web.archive.org/web/20240112051751/https://www.rollingstone.com/music/music-news/ariana-grande-yes-and-song-release-1234945134/ |url-status=live}}</ref> The song debuted at number one on the ''Billboard'' Hot 100,<ref>{{cite magazine |last=Trust |first=Gary |date=January 22, 2024 |title=Ariana Grande's 'Yes, And?' Debuts at No. 1 on Billboard Hot 100 |url=https://www.billboard.com/music/chart-beat/ariana-grande-yes-and-hot-100-number-one-debut-2-1235586226/ |url-status=live |archive-url=https://web.archive.org/web/20240122182312/https://www.billboard.com/music/chart-beat/ariana-grande-yes-and-hot-100-number-one-debut-2-1235586226/ |archive-date=January 22, 2024 |access-date=January 22, 2024 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> topped the [[Billboard Global 200|''Billboard'' Global 200]] and Global Excl. US charts for two weeks,<ref> * {{cite magazine |url=https://www.billboard.com/music/chart-beat/ariana-grande-yes-global-charts-number-one-debut-1235586270/ |title=Ariana Grande's 'Yes, And?' Launches at No. 1 on Billboard Global Charts |last=Trust |first=Gary |date=January 22, 2024 |magazine=[[Billboard (magazine)|Billboard]] |access-date=January 31, 2024 |url-status=live |archive-date=January 22, 2024 |archive-url=https://web.archive.org/web/20240122200525/https://www.billboard.com/music/chart-beat/ariana-grande-yes-global-charts-number-one-debut-1235586270/}} * {{Cite magazine |last=Trust |first=Gary |date=January 29, 2024 |title=Ariana Grande's 'Yes, And?' Adds Second Week at No. 1 on ''Billboard'' Global Charts |url=https://www.billboard.com/music/chart-beat/ariana-grande-yes-and-global-charts-number-one-second-week-1235591406/ |access-date=January 31, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=January 30, 2024 |archive-url=https://web.archive.org/web/20240130022504/https://www.billboard.com/music/chart-beat/ariana-grande-yes-and-global-charts-number-one-second-week-1235591406/ |url-status=live}}</ref> and was followed by a remix featuring [[Mariah Carey]] on February 16.<ref>{{cite magazine |last=Lipshutz |first=Jason |date=February 16, 2024 |title=Friday Music Guide: New Music From Ariana Grande & Mariah Carey, Vampire Weekend, Dua Lipa and More |url=https://www.billboard.com/music/pop/friday-music-guide-ariana-grande-mariah-carey-vampire-weekend-dua-lipa-1235609648/ |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=February 25, 2024 |archive-url=https://web.archive.org/web/20240225003448/https://www.billboard.com/music/pop/friday-music-guide-ariana-grande-mariah-carey-vampire-weekend-dua-lipa-1235609648/ |url-status=live}}</ref> The second single, "[[We Can't Be Friends (Wait for Your Love)]]", was released in tandem with the album.<ref>{{Cite web |last=Gonzalez |first=Alex |date=March 8, 2024 |title=Ariana Grande Comes To A Heartbreaking Conclusion On Her New Single, 'We Can't Be Friends (Wait For Your Love)' |url=https://uproxx.com/pop/ariana-grande-we-cant-be-friends-wait-for-your-love/ |archive-url=https://web.archive.org/web/20240308130941/https://uproxx.com/pop/ariana-grande-we-cant-be-friends-wait-for-your-love/ |archive-date=March 8, 2024 |access-date=March 8, 2024 |website=[[Uproxx]]}}</ref> Grande's first album in over three years,<ref>{{Cite magazine |last=Mier |first=Tomás |date=March 8, 2024 |title=Ariana Grande Releases 'Eternal Sunshine', First Album in Over 3 Years |url=https://www.rollingstone.com/music/music-news/ariana-grande-eternal-sunshine-release-1234983201/ |url-access=subscription |access-date=March 8, 2024 |magazine=[[Rolling Stone]] |archive-date=March 8, 2024 |archive-url=https://web.archive.org/web/20240308060209/https://www.rollingstone.com/music/music-news/ariana-grande-eternal-sunshine-release-1234983201/ |url-status=live}}</ref> ''Eternal Sunshine'' marked her first major foray into [[Dance music|dance]] and [[House music|house]] music.<ref>{{cite magazine |last=Spanos |first=Brittany |date=March 8, 2024 |title=Ariana Grande is Gorgeously Exposed on 'Eternal Sunshine' |url=https://www.rollingstone.com/music/music-album-reviews/ariana-grande-eternal-sunshine-review-1234983313/ |url-access=subscription |access-date=March 8, 2024 |magazine=[[Rolling Stone]] |archive-date=March 8, 2024 |archive-url=https://web.archive.org/web/20240308092533/https://www.rollingstone.com/music/music-album-reviews/ariana-grande-eternal-sunshine-review-1234983313/ |url-status=live}}</ref><ref>{{Cite magazine |last=Denis |first=Kyle |date=March 8, 2024 |title=Ariana Grande's 'Eternal Sunshine': All 13 Tracks Ranked |url=https://www.billboard.com/lists/ariana-grande-eternal-sunshine-songs-ranked/ |access-date=March 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=March 8, 2024 |archive-url=https://web.archive.org/web/20240308125523/https://www.billboard.com/lists/ariana-grande-eternal-sunshine-songs-ranked/ |url-status=live}}</ref> Met with universal acclaim, critics dubbed it one of her most mature and sophisticated records yet.<ref> * {{cite web |url=https://www.nme.com/reviews/album/ariana-grande-eternal-sunshine-lyrics-tracklist-3598038 |title=Ariana Grande – 'Eternal Sunshine' review: a compelling mood piece |website=[[NME]] |last=Levine |first=Nick |date=March 8, 2024 |access-date=March 8, 2024 |archive-date=March 8, 2024 |archive-url=https://web.archive.org/web/20240308092649/https://www.nme.com/reviews/album/ariana-grande-eternal-sunshine-lyrics-tracklist-3598038 |url-status=live}} * {{Cite web |last=Harrison |first=Emma |date=March 11, 2024 |title=Ariana Grande – Eternal Sunshine |url=https://www.clashmusic.com/reviews/ariana-grande-eternal-sunshine/ |access-date=March 12, 2024 |magazine=[[Clash (magazine)|Clash]] |archive-date=March 12, 2024 |archive-url=https://web.archive.org/web/20240312084232/https://www.clashmusic.com/reviews/ariana-grande-eternal-sunshine/ |url-status=live}} * {{Cite news |last=Snapes |first=Laura |date=March 8, 2024 |title=Ariana Grande: Eternal Sunshine review – perceptive post-divorce album is nearly spotless |url=https://www.theguardian.com/music/2024/mar/08/ariana-grande-eternal-sunshine-album-review |url-status=live |archive-url=https://web.archive.org/web/20240308092534/https://www.theguardian.com/music/2024/mar/08/ariana-grande-eternal-sunshine-album-review |archive-date=March 8, 2024 |access-date=March 8, 2024 |newspaper=[[The Guardian]] |issn=0261-3077}} * {{Cite news |last=Zoladz |first=Lindsay |date=March 8, 2024 |title=Ariana Grande Spins Heartbreak Into Gold on 'Eternal Sunshine' |url=https://www.nytimes.com/2024/03/08/arts/music/ariana-grande-eternal-sunshine-review.html |access-date=March 8, 2024 |newspaper=[[The New York Times]] |archive-date=March 8, 2024 |archive-url=https://web.archive.org/web/20240308170557/https://www.nytimes.com/2024/03/08/arts/music/ariana-grande-eternal-sunshine-review.html |url-status=live}} * {{cite web |last=Tafoya |first=Harry |date=March 11, 2024 |title=Ariana Grande: eternal sunshine Album Review |url=https://pitchfork.com/reviews/albums/ariana-grande-eternal-sunshine/ |access-date=March 11, 2024 |website=[[Pitchfork (website)|Pitchfork]] |url-status=live |archive-date=March 11, 2024 |archive-url=https://web.archive.org/web/20240311041548/https://pitchfork.com/reviews/albums/ariana-grande-eternal-sunshine/}}</ref> Both the album and its second single debuted atop the ''Billboard'' 200 and the Hot 100 respectively,<ref name="wcbfES">{{Cite web |last=Garcia |first=Thania |date=March 18, 2024 |title=Ariana Grande Scores Sixth No. 1 Album and Launches 'We Can't Be Friends (Wait for Your Love)' to Top of Hot 100 |url=https://variety.com/2024/music/news/ariana-grande-eternal-sunshine-number-one-billboard-songs-albums-charts-1235944996/ |archive-url=https://web.archive.org/web/20240318201604/https://variety.com/2024/music/news/ariana-grande-eternal-sunshine-number-one-billboard-songs-albums-charts-1235944996/ |archive-date=March 18, 2024 |access-date=March 20, 2024 |website=[[Variety (magazine)|Variety]] |url-status=live}}</ref> achieving Grande's third-largest sales week (227,000 units) and making her the woman with the [[List of Billboard Hot 100 chart achievements and milestones#Most number-one debuts|most Hot 100 number-one debuts]] (7).<ref name="wcbfn1"/><ref>{{Cite magazine |last=Caulfield |first=Keith |date=March 17, 2024 |title=Ariana Grande Scores Sixth No. 1 Album on ''Billboard'' 200 With 'Eternal Sunshine' |url=https://www.billboard.com/music/chart-beat/ariana-grande-eternal-sunshine-number-one-billboard-200-albums-chart-1235635290/ |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=July 15, 2024 |archive-url=https://web.archive.org/web/20240715181055/https://www.billboard.com/music/chart-beat/ariana-grande-eternal-sunshine-number-one-billboard-200-albums-chart-1235635290/ |url-status=live}}</ref> Elsewhere, the album debuted at number one in thirteen countries, including Australia,<ref>{{cite magazine |last=Brandle |first=Lars |date=March 15, 2024 |title=Ariana Grande Shines at No. 1 In Australia With 'Eternal Sunshine' |url=https://www.billboard.com/music/chart-beat/ariana-grande-no-1-australia-eternal-sunshine-1235634094/ |url-status=live |archive-url=https://web.archive.org/web/20240319113853/https://www.billboard.com/music/chart-beat/ariana-grande-no-1-australia-eternal-sunshine-1235634094/ |archive-date=March 19, 2024 |access-date=March 19, 2024 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> Canada,<ref>{{cite magazine |date=March 20, 2024 |title=Canadian Albums Chart (Week of March 23, 2024) |url=https://www.billboard.com/charts/canadian-albums/2024-03-23 |archive-url=https://web.archive.org/web/20240319205617/https://www.billboard.com/charts/canadian-albums/2024-03-23/ |archive-date=March 19, 2024 |access-date=March 20, 2024 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> and the UK.<ref>{{Cite magazine |last=Brandle |first=Lars |date=March 18, 2024 |title=Ariana Grande's 'Eternal Sunshine' Glows at No. 1 In U.K. |url=https://www.billboard.com/music/chart-beat/ariana-grande-eternal-sunshine-no-1-uk-1235634172/ |access-date=July 25, 2025 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=January 19, 2025 |archive-url=https://web.archive.org/web/20250119204456/https://www.billboard.com/music/chart-beat/ariana-grande-eternal-sunshine-no-1-uk-1235634172/ |url-status=live}}</ref> With ''Eternal Sunshine'' and ''Thank U, Next'', Grande became the first woman to have two albums produce multiple number-one single debuts in the US.<ref name="wcbfES"/> It also marked her first instance of reaching the top of both the ''Billboard'' [[Billboard charts#Other charts|Hot 100 Songwriters and Hot 100 Producers]] charts.<ref>{{cite magazine |first=Xander |last=Zellner |title=Ariana Grande Rules Hot 100 Songwriters & Producers Charts for First Time |url=https://www.billboard.com/music/chart-beat/ariana-grande-hot-100-songwriters-producers-charts-first-time-1235637168/ |magazine=[[Billboard (magazine)|Billboard]] |date=March 20, 2024 |access-date=March 21, 2024 |archive-date=March 20, 2024 |archive-url=https://web.archive.org/web/20240320222341/https://www.billboard.com/music/chart-beat/ariana-grande-hot-100-songwriters-producers-charts-first-time-1235637168/ |url-status=live}}</ref> Topping the [[Pop Airplay]] chart for two weeks,<ref>{{Cite web |last=Cantor |first=Brian |date=May 26, 2024 |title=Ariana Grande's "We Can't Be Friends" Spends 2nd Week As Pop Radio's #1 Song |url=https://headlineplanet.com/home/2024/05/26/ariana-grandes-we-cant-be-friends-spends-2nd-week-as-pop-radios-1-song/ |access-date=October 10, 2024 |website=Headline Planet |archive-date=September 16, 2024 |archive-url=https://web.archive.org/web/20240916101138/https://headlineplanet.com/home/2024/05/26/ariana-grandes-we-cant-be-friends-spends-2nd-week-as-pop-radios-1-song/ |url-status=live}}</ref> "We Can't Be Friends (Wait for Your Love)" marked Grande's tenth number-one.<ref>{{Cite magazine |last=Trust |first=Gary |date=May 17, 2024 |title=Ariana Grande's 'We Can't Be Friends (Wait for Your Love)' Hits No. 1 on Pop Airplay Chart |url=https://www.billboard.com/music/chart-beat/ariana-grande-we-cant-be-friends-wait-for-your-love-number-one-pop-airplay-chart-1235686229/ |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=December 12, 2024 |archive-url=https://web.archive.org/web/20241212075736/https://www.billboard.com/music/chart-beat/ariana-grande-we-cant-be-friends-wait-for-your-love-number-one-pop-airplay-chart-1235686229/ |url-status=live}}</ref> On May 6, 2024, Grande performed at the [[Met Gala]] and was joined on stage by [[Cynthia Erivo]] to close out her performance.<ref name="voguemet">{{cite magazine |url=https://www.vogue.com/article/ariana-grande-cynthia-erivo-performance-met-gala-2024 |title=Ariana Grande Closed Out the 2024 Met Gala With an Epic Performance—And a Special Guest Appearance From Cynthia Erivo |date=May 7, 2024 |magazine=[[Vogue (magazine)|Vogue]] |access-date=May 7, 2024 |archive-date=May 7, 2024 |archive-url=https://web.archive.org/web/20240507071546/https://www.vogue.com/article/ariana-grande-cynthia-erivo-performance-met-gala-2024 |url-status=live}}</ref> "[[The Boy Is Mine (Ariana Grande song)|The Boy Is Mine]]", which reached the top 20 on the Hot 100,<ref>{{cite magazine |last=Zellner |first=Xander |date=March 18, 2024 |title=Ariana Grande Charts 12 Songs on Hot 100 From New Album 'Eternal Sunshine' |url=https://www.billboard.com/music/chart-beat/ariana-grande-12-songs-hot-100-eternal-sunshine-1235636091/ |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=March 27, 2024 |archive-url=https://web.archive.org/web/20240327211415/https://www.billboard.com/music/chart-beat/ariana-grande-12-songs-hot-100-eternal-sunshine-1235636091/ |url-status=live}}</ref> was issued as the third ''Eternal Sunshine'' single in June;<ref>* {{Cite magazine |last=Dailey |first=Hannah |date=June 7, 2024 |title=Watch Brandy & Monica Make Surprise Cameos in Ariana Grande's 'The Boy Is Mine' Music Video |url=https://www.billboard.com/music/music-news/ariana-grande-boy-is-mine-video-brandy-monica-cameos-1235703500/ |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=September 13, 2024 |archive-url=https://web.archive.org/web/20240913222419/https://www.billboard.com/music/music-news/ariana-grande-boy-is-mine-video-brandy-monica-cameos-1235703500/ |url-status=live}} * {{Cite magazine |title=YOUR RADIO ADD RECAPS |url=https://hitsdailydouble.com/pop_mart%26id%3D341561%26title%3DYOUR-RADIO-ADD-RECAPS |archive-url=https://web.archive.org/web/20240612000716/https://hitsdailydouble.com/pop_mart%26id%3D341561%26title%3DYOUR-RADIO-ADD-RECAPS |archive-date=June 12, 2024 |access-date=October 10, 2024 |magazine=[[Hits (magazine)|HITS Daily Double]] |url-status=live}}</ref> a remix featuring [[Brandy Norwood|Brandy]] and [[Monica (singer)|Monica]] followed later that month.<ref>{{cite web |url=https://www.nme.com/news/music/listen-to-ariana-grandes-the-boy-is-mine-remix-with-brandy-and-monica-3767507 |title=Listen to Ariana Grande's 'The Boy Is Mine' remix with Brandy and Monica |website=[[NME]] |last=Pilley |first=Max |date=June 21, 2024 |access-date=June 22, 2024 |archive-date=September 17, 2024 |archive-url=https://web.archive.org/web/20240917214826/https://www.nme.com/news/music/listen-to-ariana-grandes-the-boy-is-mine-remix-with-brandy-and-monica-3767507 |url-status=live}}</ref> On August 22, 2024, Grande released a reissue of her second studio album, ''My Everything'', for the tenth anniversary of the record.<ref>{{Cite magazine |last=Dailey |first=Hannah |date=August 22, 2024 |title=Ariana Grande Drops 'My Everything' 10th Anniversary Vinyl & Deluxe |url=https://www.billboard.com/music/music-news/ariana-grande-my-everything-10th-anniversary-vinyl-deluxe-1235758624/ |magazine=[[Billboard (magazine)|Billboard]] |access-date=August 22, 2024 |archive-date=December 20, 2024 |archive-url=https://web.archive.org/web/20241220072709/https://www.billboard.com/music/music-news/ariana-grande-my-everything-10th-anniversary-vinyl-deluxe-1235758624/ |url-status=live}}</ref> Two extended editions of ''Eternal Sunshine'' containing the pre-released single remixes, guest vocals from [[Troye Sivan]], and live versions of several tracks, were [[Surprise album|surprise released]] in March and October 2024.<ref>{{Cite magazine |last=Kaufman |first=Gil |date=March 11, 2024 |title=Ariana Grande Releases 'Sightly Deluxe' Edition of 'Eternal Sunshine' With Mariah Carey, Troye Sivan Features |url=https://www.billboard.com/music/pop/ariana-grande-slightly-deluxe-edition-eternal-sunshine-mariah-carey-troye-sivan-1235629656/ |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=March 11, 2024 |archive-url=https://web.archive.org/web/20240311145032/https://www.billboard.com/music/pop/ariana-grande-slightly-deluxe-edition-eternal-sunshine-mariah-carey-troye-sivan-1235629656/ |url-status=live}}</ref><ref>{{Cite magazine |last=Dailey |first=Hannah |date=October 1, 2024 |title=Ariana Grande Surprise Drops 'Eternal Sunshine' Deluxe Featuring 7 Live Performances & Videos |url=https://www.billboard.com/music/music-news/ariana-grande-eternal-sunshine-deluxe-live-versions-1235789640/ |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=October 7, 2024 |archive-url=https://web.archive.org/web/20241007102933/https://www.billboard.com/music/music-news/ariana-grande-eternal-sunshine-deluxe-live-versions-1235789640/ |url-status=live}}</ref> Grande appeared as the musical guest on ''[[Saturday Night Live]]'' on [[Saturday Night Live season 49#ep962|March 9, 2024]], to promote ''Eternal Sunshine''.<ref>{{Cite magazine |last=Peters |first=Mitchell |date=March 10, 2024 |title=Ariana Grande Powerfully Delivers Two New 'Eternal Sunshine' Songs on 'SNL': Watch |url=https://www.billboard.com/music/music-news/ariana-grande-snl-eternal-sunshine-songs-performance-videos-1235628925/ |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=March 24, 2024 |archive-url=https://web.archive.org/web/20240324171019/https://www.billboard.com/music/music-news/ariana-grande-snl-eternal-sunshine-songs-performance-videos-1235628925/ |url-status=live}}</ref> She featured on the remix to "[[Sympathy Is a Knife#Ariana Grande remix|Sympathy Is a Knife]]" on [[Charli XCX]]'s remix album ''[[Brat and It's Completely Different but Also Still Brat]]'', released on October 11, 2024.<ref>{{Cite web |last=Chelosky |first=Danielle |date=October 11, 2024 |title=Stream Charli XCX's New ''Brat'' Remixes Feat. Ariana Grande, Bon Iver, The 1975, & More |url=https://www.stereogum.com/2283580/charli-xcx-brat-remixes-album/music/ |access-date=October 12, 2024 |website=[[Stereogum]] |archive-date=December 11, 2024 |archive-url=https://web.archive.org/web/20241211230534/https://www.stereogum.com/2283580/charli-xcx-brat-remixes-album/music/ |url-status=live}}</ref> On the ''[[Las Culturistas]]'' podcast, Grande acknowledged that she would likely scale back her pop music output compared to earlier in her career, shifting her focus more towards acting.<ref>{{Cite magazine |last=Dailey |first=Hannah |date=November 6, 2024 |title=Ariana Grande Reveals 'Scary' Plans to Scale Back Pop Star Career & Focus More on Musical Theater |url=https://www.billboard.com/music/music-news/ariana-grande-scale-back-pop-career-focus-musical-theater-1235821508/ |access-date=November 18, 2024 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=December 19, 2024 |archive-url=https://web.archive.org/web/20241219194326/https://www.billboard.com/music/music-news/ariana-grande-scale-back-pop-career-focus-musical-theater-1235821508/ |url-status=live}}</ref> ''Eternal Sunshine'' was ranked as 2024's thirteenth-best-selling and ninth-most-streamed album globally by the [[International Federation of the Phonographic Industry]] (IFPI).<ref name="ifpi2024">{{cite web |date=February 18, 2025 |title=Taylor Swift makes music history as IFPI's Biggest-Selling Global Recording Artist of the Year for the fifth time |url=https://www.ifpi.org/taylor-swift-makes-music-history-as-ifpis-biggest-selling-global-recording-artist-of-the-year-for-the-fifth-time |access-date=April 8, 2025 |publisher=[[International Federation of the Phonographic Industry]] (IFPI) |archive-date=April 3, 2025 |archive-url=https://web.archive.org/web/20250403103458/https://www.ifpi.org/taylor-swift-makes-music-history-as-ifpis-biggest-selling-global-recording-artist-of-the-year-for-the-fifth-time/ |url-status=live}}</ref> At the [[67th Annual Grammy Awards]], Grande was nominated for [[Grammy Award for Best Pop Vocal Album|Best Pop Vocal Album]] (''Eternal Sunshine''), [[Grammy Award for Best Pop Duo/Group Performance|Best Pop Duo/Group Performance]] ("The Boy Is Mine" remix), and [[Grammy Award for Best Dance Pop Recording|Best Dance Pop Recording]] ("Yes, And?").<ref>{{Cite news |date=February 2, 2025 |title=All the winners and nominees at the 2025 Grammy Awards |url=https://www.bbc.com/news/articles/ckg0jg4n0z4o/ |access-date=February 5, 2025 |publisher=[[BBC News]] |archive-date=February 3, 2025 |archive-url=https://web.archive.org/web/20250203185610/https://www.bbc.com/news/articles/ckg0jg4n0z4o |url-status=live}}</ref> ''[[Eternal Sunshine Deluxe: Brighter Days Ahead]]'', a reissue of ''Eternal Sunshine'', was released on March 28, 2025.<ref>{{Cite magazine |last=Aniftos |first=Rania |date=March 28, 2025 |title=Ariana Grande Welcomes 'Brighter Days Ahead' With 'Eternal Sunshine' Deluxe Album: Stream It Now |url=https://www.billboard.com/music/pop/ariana-grande-eternal-sunshine-deluxe-brighter-days-ahead-1235933370/ |access-date=March 29, 2025 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=March 28, 2025 |archive-url=https://web.archive.org/web/20250328130116/https://www.billboard.com/music/pop/ariana-grande-eternal-sunshine-deluxe-brighter-days-ahead-1235933370/ |url-status=live}}</ref> Grande starred as the protagonist Peaches in the accompanying short film ''[[Brighter Days Ahead]]'', which she directed and wrote with [[Christian Breslauer]]; it was released on the same day. Her directorial debut,<ref>{{Cite magazine |last=Fell |first=Nicole |date=March 28, 2025 |title=Ariana Grande Revisits Love and Loss in Magical Short Film 'Brighter Days Ahead' |url=https://www.hollywoodreporter.com/news/music-news/ariana-grande-short-film-brighter-days-ahead-1236175163/ |access-date=March 29, 2025 |magazine=The Hollywood Reporter}}</ref> the short film won the [[MTV Video Music Award for Video of the Year|Video of the Year]] award at the [[2025 MTV Video Music Awards]].<ref>{{Cite magazine |last=Nordyke |first=Kimberly |date=September 7, 2025 |title=MTV VMAs: Winners List |url=https://www.hollywoodreporter.com/lists/mtv-vmas-2025-winners-list/ |url-status=live |archive-url=https://web.archive.org/web/20250907203537/https://www.hollywoodreporter.com/lists/mtv-vmas-2025-winners-list/ |archive-date=September 7, 2025 |access-date=September 7, 2025 |magazine=The Hollywood Reporter}}</ref> With the release of the reissue, ''Eternal Sunshine'' became Grande's longest-running number one album in the US (three weeks).<ref>{{Cite news |last=Thompson |first=Stephen |date=April 8, 2025 |title=Ariana Grande's 'Eternal Sunshine' takes a wicked leap to No. 1, a year after its release |url=https://www.npr.org/2025/04/08/g-s1-59035/ariana-grande-eternal-sunshine-deluxe-no-1-charts/ |access-date=April 20, 2025 |publisher=[[NPR]] |archive-date=April 22, 2025 |archive-url=https://web.archive.org/web/20250422220948/https://www.npr.org/2025/04/08/g-s1-59035/ariana-grande-eternal-sunshine-deluxe-no-1-charts |url-status=live}}</ref> Aided by ''Brighter Days Ahead'', the album returned to the top of the charts in Australia, Canada, Ireland, and New Zealand, over a year after its release.<ref>* {{Cite magazine |last=Lynch |first=Jessica |date=April 4, 2025 |title=Grande Larceny: Ariana Steals Back the ARIA No. 1 Spot |url=https://www.billboard.com/music/chart-beat/ariana-grande-eternal-sunshine-returns-no-1-aria-chart-1235939255/ |access-date=April 4, 2025 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=April 4, 2025 |archive-url=https://web.archive.org/web/20250404092033/https://www.billboard.com/music/chart-beat/ariana-grande-eternal-sunshine-returns-no-1-aria-chart-1235939255/ |url-status=live}} * {{Cite magazine |last=Cusson |first=Michael |date=January 2, 2013 |title=''Billboard'' Canadian Albums |url=https://www.billboard.com/charts/canadian-albums/ |access-date=April 12, 2025 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=March 31, 2022 |archive-url=https://web.archive.org/web/20220331124809/https://www.billboard.com/charts/canadian-albums/ |url-status=live}} * {{cite web |date=April 3, 2025 |title=Official Irish Albums Chart (3 April 2025 - 10 April 2025) |url=https://www.officialcharts.com/charts/irish-albums-chart/20250403/ie7502/ |access-date=May 2, 2025 |publisher=[[Official Charts Company]]}} * {{Cite web |title=Kōpae Tiketike 40 Ōkawa {{!}} Official Top 40 Albums |url=https://aotearoamusiccharts.co.nz/charts/albums |access-date=April 4, 2025 |publisher=[[Official Aotearoa Music Charts]] |archive-date=April 4, 2025 |archive-url=https://web.archive.org/web/20250404144738/https://aotearoamusiccharts.co.nz/charts/albums |url-status=live}}</ref> The bonus track "[[Twilight Zone (Ariana Grande song)|Twilight Zone]]" was released as the reissue's lead single in April 2025, reaching the top ten on the ''Billboard'' Global 200 and the UK singles chart.<ref>{{Cite magazine |last=Trust |first=Gary |date=April 7, 2025 |title=Lady Gaga & Bruno Mars' 'Die With a Smile' Tops Global 200 Chart for 15th Week |url=https://www.billboard.com/music/chart-beat/lady-gaga-bruno-mars-die-with-a-smile-global-200-number-one-15th-week-1235940912/ |access-date=May 3, 2025 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=April 7, 2025 |archive-url=https://web.archive.org/web/20250407190138/https://www.billboard.com/music/chart-beat/lady-gaga-bruno-mars-die-with-a-smile-global-200-number-one-15th-week-1235940912/ |url-status=live}}</ref><ref>{{Cite magazine |last=Smith |first=Thomas |date=April 4, 2025 |title=Alex Warren's 'Ordinary' Scores Third Week at No. 1 on U.K. Singles Chart |url=https://www.billboard.com/music/chart-beat/alex-warren-ordinary-third-week-number-1-uk-singles-chart-1235939354/ |access-date=May 3, 2025 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=April 10, 2025 |archive-url=https://web.archive.org/web/20250410200246/https://www.billboard.com/music/chart-beat/alex-warren-ordinary-third-week-number-1-uk-singles-chart-1235939354/ |url-status=live}}</ref> Later that month, Grande featured on [[Jeff Goldblum]] and the Mildred Snitzer Orchestra's jazz album ''Still Blooming'' for a rendition of the song "[[I Don't Know Why (I Just Do)]]".<ref>{{Cite magazine |last=Kelly |first=Tyler Damara |date=April 25, 2025 |title=Ariana Grande and Jeff Goldblum join forces on new single, "I Don't Know Why (I Just Do)" |url=https://www.thelineofbestfit.com/news/ariana-grande-and-jeff-goldblum-join-forces-on-new-single-i-dont-know-why-i-just-do/ |access-date=December 21, 2025 |magazine=[[The Line of Best Fit]] |archive-date=May 13, 2025 |archive-url=https://web.archive.org/web/20250513102444/https://www.thelineofbestfit.com/news/ariana-grande-and-jeff-goldblum-join-forces-on-new-single-i-dont-know-why-i-just-do |url-status=live}}</ref> She and Mariah Carey joined [[Barbra Streisand]] on "One Heart, One Voice" for Streisand's album ''[[The Secret of Life: Partners, Volume Two]]'', released on June 27, 2025.<ref>{{cite magazine |last=Lynch |first=Jessica |date=July 1, 2025 |title=Barbra Streisand Says Collab With Mariah Carey and Ariana Grande 'Felt Inevitable' |url=https://www.billboard.com/music/pop/barbra-streisand-mariah-carey-ariana-grande-collab-1236012363/ |access-date=July 17, 2025 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=July 24, 2025 |archive-url=https://web.archive.org/web/20250724014359/https://www.billboard.com/music/pop/barbra-streisand-mariah-carey-ariana-grande-collab-1236012363/ |url-status=live}}</ref> Whilst describing the three as "the holy trinity of glorious sound", Melissa Ruggieri of ''[[USA Today]]'' called the track an "otherwise generic ballad [that] showcases a trio steeped in restraint".<ref>{{Cite news |last=Ruggieri |first=Melissa |date=June 27, 2025 |title=Barbra Streisand swoons with McCartney, Dylan, Mariah on lush duets album: Review |url=https://www.usatoday.com/story/entertainment/music/2025/06/27/barbra-streisand-duets-album-review/84354045007/ |access-date=July 17, 2025 |work=[[USA Today]] |archive-date=July 24, 2025 |archive-url=https://web.archive.org/web/20250724211133/https://www.usatoday.com/story/entertainment/music/2025/06/27/barbra-streisand-duets-album-review/84354045007/ |url-status=live}}</ref> Grande starred as [[Glinda#Wicked|Galinda Upland]] alongside [[Cynthia Erivo]] as [[Elphaba Thropp]] in the [[Wicked (film franchise)|two-part film adaptation]] of the fantasy musical ''[[Wicked (musical)|Wicked]]'', directed by [[Jon M. Chu]].<ref>{{Cite web |last=Garner |first=Glenn |date=November 3, 2024 |title=Ariana Grande Understands Fan Criticism Of Her 'Wicked' Casting: "I Get It" |url=https://deadline.com/2024/11/ariana-grande-understands-fan-criticism-wicked-casting-1236165900/ |access-date=November 4, 2024 |website=Deadline Hollywood |archive-date=December 19, 2024 |archive-url=https://web.archive.org/web/20241219111414/https://deadline.com/2024/11/ariana-grande-understands-fan-criticism-wicked-casting-1236165900/ |url-status=live}}</ref> She was cast in November 2021 after auditioning five times for the role.<ref name="wickedcasting">{{cite magazine |last1=Shafer |first1=Ellise |last2=Donnelly |first2=Matt |title=Ariana Grande and Cynthia Erivo to Star in 'Wicked' Musical for Universal |url=https://variety.com/2021/film/news/ariana-grande-cynthia-erivo-wicked-musical-universal-1235105480/ |magazine=Variety |access-date=November 4, 2021 |date=November 4, 2021 |archive-date=June 15, 2022 |archive-url=https://web.archive.org/web/20220615170245/https://variety.com/2021/film/news/ariana-grande-cynthia-erivo-wicked-musical-universal-1235105480/ |url-status=live}}</ref> She was credited with her birth name Ariana Grande-Butera, which was her name when she first saw the stage musical at age ten.<ref>{{Cite magazine |first=Angelique |last=Jackson |date=November 4, 2024 |title=Ariana Grande Is Credited in 'Wicked' as 'Ariana Grande-Butera' Because 'That Was My Name When I Went to See the Show' at 10 Years Old |url=https://variety.com/2024/film/news/ariana-grande-wicked-credit-full-name-butera-1236198018/ |access-date=November 5, 2024 |magazine=[[Variety (magazine)|Variety]] |archive-date=July 10, 2025 |archive-url=https://web.archive.org/web/20250710013341/https://variety.com/2024/film/news/ariana-grande-wicked-credit-full-name-butera-1236198018/ |url-status=live}}</ref> Grande reported that she began taking acting and singing lessons months before she auditioned for the role of Glinda because she wanted to be cast "so badly".<ref>{{Cite web |date=June 17, 2024 |title=Ariana Grande took singing and acting lessons to prepare for Wicked audition |url=https://www.pearlanddean.com/ariana-grande-took-singing-and-acting-lessons-to-prepare-for-wicked-audition/ |access-date=March 17, 2025 |publisher=Pearl & Dean Cinemas |archive-date=May 23, 2025 |archive-url=https://web.archive.org/web/20250523142607/https://www.pearlanddean.com/ariana-grande-took-singing-and-acting-lessons-to-prepare-for-wicked-audition/ |url-status=live}}</ref> The first part, ''[[Wicked (2024 film)|Wicked]]'', was theatrically released in November 2024,<ref>{{cite web |last1=D'Alessandro |first1=Anthony |date=July 1, 2024 |title='Wicked' Shifts Earlier In November, Dates Against 'Gladiator II': Is Another 'Barbenheimer' Box Office Weekend In Store? |url=https://deadline.com/2024/07/wicked-release-date-change-moana-2-1235999048/ |access-date=October 10, 2024 |website=Deadline Hollywood |archive-date=July 1, 2024 |archive-url=https://web.archive.org/web/20240701230753/https://deadline.com/2024/07/wicked-release-date-change-moana-2-1235999048/ |url-status=live}}</ref> followed by the second part, ''[[Wicked: For Good]]'', in November 2025.<ref>{{Cite news |last=Ardrey |first=Taylor |date=November 19, 2025 |title='Wicked: For Good' debuts in theaters this week. See release date, cast, more. |url=https://www.usatoday.com/story/entertainment/movies/2025/11/19/wicked-for-good-theatrical-release-date/87337790007/ |access-date=November 21, 2025 |work=[[USA Today]] |archive-date=November 27, 2025 |archive-url=https://web.archive.org/web/20251127003735/https://www.usatoday.com/story/entertainment/movies/2025/11/19/wicked-for-good-theatrical-release-date/87337790007/ |url-status=live}}</ref> Critically acclaimed, ''Wicked'' was regarded amongst the best musical films of the 21st century and declared a pop culture phenomenon by various media.<ref>* {{cite web |date=July 2, 2025 |title=Readers Choose Their Top Movies of the 21st Century |url=https://www.nytimes.com/interactive/2025/movies/readers-movies-21st-century.html |access-date=July 2, 2025 |work=[[The New York Times]] |archive-date=July 3, 2025 |archive-url=https://web.archive.org/web/20250703010446/https://www.nytimes.com/interactive/2025/movies/readers-movies-21st-century.html |url-status=live}} * {{Cite news |last1=Burr |first1=Ty |author-link=Ty Burr |last2=Kumar |first2=Naveen |date=February 27, 2025 |title=The 25 best movie musicals of the 21st century |url=https://www.washingtonpost.com/entertainment/movies/2025/02/27/best-musical-movies/ |access-date=April 12, 2025 |newspaper=The Washington Post |archive-date=April 5, 2025 |archive-url=https://web.archive.org/web/20250405160220/https://www.washingtonpost.com/entertainment/movies/2025/02/27/best-musical-movies/ |url-status=live}} * {{cite web |date=December 15, 2024 |title=10 Best Fantasy Movies of the 2020s So Far, Ranked |url=https://collider.com/fantasy-movies-2020s-best-ranked/ |website=[[Collider (website)|Collider]] |access-date=July 25, 2025 |archive-date=December 17, 2024 |archive-url=https://web.archive.org/web/20241217220210/https://collider.com/fantasy-movies-2020s-best-ranked/ |url-status=live}} * {{cite web |last=Ciriaco |first=Andrea |date=December 24, 2024 |title=The 12 Best Movie Musicals of the Last 25 Years, Ranked |url=https://collider.com/best-movie-musicals-last-25-years-ranked/ |access-date=January 31, 2025 |work=Collider |archive-date=December 28, 2024 |archive-url=https://web.archive.org/web/20241228151840/https://collider.com/best-movie-musicals-last-25-years-ranked/ |url-status=live}} * {{cite web |date=November 26, 2024 |title=The 25 Best Musicals of the 21st Century, Ranked |url=https://collider.com/best-movie-musicals-of-the-21st-century/ |website=[[Collider (website)|Collider]]}} * {{Cite web |last=Hemenway |first=Megan |date=February 21, 2025 |title=10 Best Fantasy Movies Of The 2020s (So Far), Ranked |url=https://screenrant.com/best-fantasy-movies-2020s-so-far-list/ |access-date=February 23, 2025 |website=Screen Rant |archive-date=July 18, 2025 |archive-url=https://web.archive.org/web/20250718172824/https://screenrant.com/best-fantasy-movies-2020s-so-far-list/ |url-status=live}} * {{Cite web |date=March 3, 2025 |title=40 best movie musicals of all time |url=https://www.timeout.com/movies/best-movie-musicals-of-all-time |access-date=April 12, 2025 |website=Time Out |archive-date=July 28, 2025 |archive-url=https://web.archive.org/web/20250728203409/https://www.timeout.com/movies/best-movie-musicals-of-all-time |url-status=live}} * {{Cite web |date=November 25, 2024 |title=The 22 Best Witch Movies of All Time |url=https://www.vulture.com/article/best-witch-movies.html |access-date=April 18, 2025 |website=[[Vulture (website)|Vulture]] |archive-date=July 15, 2025 |archive-url=https://web.archive.org/web/20250715023645/https://www.vulture.com/article/best-witch-movies.html |url-status=live}}</ref><ref>* {{cite magazine |date=November 27, 2024 |title=Why 'Wicked' Is What Society Needs Right Now |url=https://elle.com/uk/life-and-culture/culture/a63018974/wicked-representation |access-date=December 8, 2024 |magazine=[[Elle (magazine)|Elle]] |archive-date=December 7, 2024 |archive-url=https://web.archive.org/web/20241207060751/https://www.elle.com/uk/life-and-culture/culture/a63018974/wicked-representation/ |url-status=live}} * {{Cite web |date=December 6, 2024 |title='Wicked' Choreographer Breaks Down Steps to Viral 'What Is This Feeling?' Dance |url=https://www.today.com/popculture/movies/what-is-this-feeling-loathing-dance-wicked-choreographer-rcna183164 |access-date=December 9, 2024 |website=[[Today (American TV program)|Today]] |archive-date=December 8, 2024 |archive-url=https://web.archive.org/web/20241208084716/https://www.today.com/popculture/movies/what-is-this-feeling-loathing-dance-wicked-choreographer-rcna183164 |url-status=live}}</ref> ''For Good'' was met with lukewarm reviews and less enthusiasm than its predecessor.<ref>* {{cite news |last1=McIntosh |first1=Steven |date=November 19, 2025 |title=Wicked sequel leaves critics less spellbound than first film |url=https://www.bbc.com/news/articles/c1m3ddkn3gdo |access-date=November 22, 2025 |publisher=[[BBC]] |archive-date=November 21, 2025 |archive-url=https://web.archive.org/web/20251121173510/https://www.bbc.com/news/articles/c1m3ddkn3gdo |url-status=live}} * {{cite magazine |last1=Murray |first1=Conor |date=November 18, 2025 |title='Wicked: For Good' Reviews Lag Behind Part One—But Still Expected To Thrive At Box Office |url=https://www.forbes.com/sites/conormurray/2025/11/18/wicked-for-good-reviews-lag-behind-part-one-but-still-expected-to-thrive-at-box-office/ |access-date=November 22, 2025 |magazine=[[Forbes]] |archive-date=November 21, 2025 |archive-url=https://web.archive.org/web/20251121195136/https://www.forbes.com/sites/conormurray/2025/11/18/wicked-for-good-reviews-lag-behind-part-one-but-still-expected-to-thrive-at-box-office/ |url-status=live}} * {{Cite news |last1=Whipp |first1=Glenn |date=November 21, 2025 |title=Why 'Wicked's' Oscar spell might be broken 'For Good' |url=https://www.latimes.com/entertainment-arts/awards/newsletter/2025-11-21/wicked-for-good-oscars-cynthia-erivo-ariana-grande |access-date=November 22, 2025 |work=[[Los Angeles Times]] |archive-date=November 21, 2025 |archive-url=https://web.archive.org/web/20251121152135/https://www.latimes.com/entertainment-arts/awards/newsletter/2025-11-21/wicked-for-good-oscars-cynthia-erivo-ariana-grande |url-status=live}} * {{cite magazine |last1=Carson |first1=Lexi |date=November 18, 2025 |title='Wicked: For Good' — What the Critics Are Saying |url=https://www.hollywoodreporter.com/movies/movie-news/wicked-for-good-reviews-what-critics-are-saying-1236430079/ |access-date=November 22, 2025 |magazine=[[The Hollywood Reporter]] |publisher=[[Penske Media Corporation]] |archive-date=November 21, 2025 |archive-url=https://web.archive.org/web/20251121230046/https://www.hollywoodreporter.com/movies/movie-news/wicked-for-good-reviews-what-critics-are-saying-1236430079/ |url-status=live}} * {{cite web |last1=Campbell |first1=Christopher |date=November 18, 2025 |title=''Wicked: For Good'' First Reviews: Darker, More Emotional, and Led by Stellar Performances |url=https://editorial.rottentomatoes.com/article/wicked-for-good-first-reviews/ |access-date=November 22, 2025 |publisher=[[Rotten Tomatoes]] |archive-date=November 23, 2025 |archive-url=https://web.archive.org/web/20251123194610/https://editorial.rottentomatoes.com/article/wicked-for-good-first-reviews/ |url-status=live}} * {{cite web |last1=Lattanzio |first1=Ryan |last2=Thompson |first2=Anne |date=November 21, 2025 |title=Did Critics Burst the 'Wicked: For Good' Bubble? How Mixed Reviews Might Impact Its Oscar Fate |url=https://www.indiewire.com/features/podcast/wicked-for-good-reviews-mixed-oscars-1235162109/ |access-date=November 22, 2025 |website=[[IndieWire]] |publisher=[[Penske Media Corporation]] |archive-date=November 21, 2025 |archive-url=https://web.archive.org/web/20251121202557/https://www.indiewire.com/features/podcast/wicked-for-good-reviews-mixed-oscars-1235162109/ |url-status=live}}</ref> Both parts were listed among the top ten films of 2024 and 2025 by the [[American Film Institute]].<ref>{{Cite magazine |last=Hammond |first=Pete |date=2025-12-04 |title=AFI Awards Movie Top 10: 'Sinners', 'Avatar: Fire And Ash', 'Jay Kelly' Among Honorees |url=https://deadline.com/2025/12/afi-awards-2025-top-movies-list-1236636128/ |url-status=live |archive-url=https://web.archive.org/web/20251204212103/https://deadline.com/2025/12/afi-awards-2025-top-movies-list-1236636128/ |archive-date=December 4, 2025 |access-date=December 4, 2025 |magazine=[[Deadline Hollywood]]}}</ref> The two parts grossed $759 million and $539 million worldwide, becoming the highest-grossing and third-highest-grossing musical adaptation films of all time, respectively.<ref>{{Cite magazine |last=Grein |first=Paul |date=February 1, 2026 |title='Wicked: For Good' Tops $525 Million in Worldwide Grosses: Full List of Top-Grossing Film Adaptations of Broadway Musicals |url=https://www.billboard.com/lists/broadway-musical-films-biggest-box-office-wicked/ |access-date=February 2, 2026 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> Grande's performance and comedic timing received praise from critics;<ref>* {{Cite news |last=Coscarelli |first=Joe |date=December 6, 2024 |title=Is the Real 'Wicked' Movie the Press Tour? |url=https://www.nytimes.com/2024/12/06/arts/music/wicked-movie-popcast-ariana-grande.html |url-access=subscription |archive-url=https://web.archive.org/web/20241207052640/https://www.nytimes.com/2024/12/06/arts/music/wicked-movie-popcast-ariana-grande.html |archive-date=December 7, 2024 |access-date=December 7, 2024 |newspaper=[[The New York Times]] |quote=Grande and Erivo have been praised for their performances onscreen}} * {{Cite news |last=Welsh |first=Daniel |date=November 20, 2024 |title=Critics Have Their Say On Wicked – Does The Long-Awaited Movie Live Up To The Hype? |url=https://ca.news.yahoo.com/critics-wicked-does-long-awaited-082423692.html |access-date=November 28, 2024 |work=[[HuffPost]] |via=[[Yahoo News]] |quote=While it was Ariana who received initial Oscar buzz |archive-date=December 19, 2024 |archive-url=https://web.archive.org/web/20241219024752/https://ca.news.yahoo.com/critics-wicked-does-long-awaited-082423692.html |url-status=live}} * {{Cite web |last=Handler |first=Rachel |date=November 27, 2024 |title=Some Unsolicited Ideas for Ariana Grande's Next Movie |url=https://www.vulture.com/article/some-unsolicited-ideas-for-ariana-grandes-next-movie.html |access-date=November 28, 2024 |website=[[Vulture (website)|Vulture]] |quote=glowing praise about Ariana Grande's performance as Glinda |archive-date=November 28, 2024 |archive-url=https://web.archive.org/web/20241128102323/https://www.vulture.com/article/some-unsolicited-ideas-for-ariana-grandes-next-movie.html |url-status=live}}</ref> she was nominated for supporting actress categories at the [[97th Academy Awards]], the [[82nd Golden Globe Awards|82nd]] and [[83rd Golden Globe Awards]], the [[30th Critics' Choice Awards|30th]] and [[31st Critics' Choice Awards]], the [[31st Screen Actors Guild Awards|31st]] and [[32nd Actor Awards]], and the [[78th British Academy Film Awards]].<ref name="WickedNoms"> * {{Cite news |last=Gonzalez |first=Shivani |date=March 2, 2025 |title=Oscars 2025 Winners: Full List |url=https://www.nytimes.com/2025/03/02/movies/oscars-winners-list.html |access-date=March 3, 2025 |newspaper=[[The New York Times]] |archive-date=March 3, 2025 |archive-url=https://web.archive.org/web/20250303005821/https://www.nytimes.com/2025/03/02/movies/oscars-winners-list.html |url-status=live}} * {{Cite news |last=Lee |first=Benjamin |date=January 5, 2025 |title=Golden Globes 2025: the full list of winners |url=https://www.theguardian.com/film/2025/jan/05/golden-globes-winners-list/ |access-date=January 6, 2025 |newspaper=[[The Guardian]]}} * {{Cite news |last=Ruggieri |first=Melissa |date=January 11, 2026 |title=Your complete list of Golden Globe 2026 winners |url=https://www.usatoday.com/story/entertainment/movies/2026/01/11/golden-globes-2026-winners-complete-list/88097085007/ |access-date=January 12, 2026 |work=[[USA Today]] |archive-date=January 12, 2026 |archive-url=https://web.archive.org/web/20260112060345/https://www.usatoday.com/story/entertainment/movies/2026/01/11/golden-globes-2026-winners-complete-list/88097085007/ |url-status=live}} * {{cite magazine |last1=Nordyke |first1=Kimberly |last2=Lewis |first2=Hilary |date=February 7, 2025 |title=Critics Choice: 'Anora' Wins Best Picture; 'Emilia Pérez', 'Wicked' and 'The Substance' Take 3 Awards Each |url=https://www.hollywoodreporter.com/movies/movie-news/2025-critics-choice-awards-winners-list-1236128672/ |access-date=February 11, 2025 |magazine=[[The Hollywood Reporter]] |archive-date=February 16, 2025 |archive-url=https://web.archive.org/web/20250216031134/https://www.hollywoodreporter.com/movies/movie-news/2025-critics-choice-awards-winners-list-1236128672/ |url-status=live}} * {{cite magazine |last=Nordyke |first=Kimberly |date=January 4, 2026 |title=Critics Choice Awards: Full Winners List |url=https://www.hollywoodreporter.com/lists/critics-choice-awards-2026-winners-list-full/best-actor-188/ |access-date=January 5, 2026 |magazine=The Hollywood Reporter}} * {{Cite news |last=''Guardian'' film |date=February 16, 2025 |title=Baftas 2025: the full list of winners |url=https://www.theguardian.com/film/2025/feb/16/baftas-2025-the-full-list-of-winners-live/ |access-date=February 17, 2025 |work=[[The Guardian]]}} * {{Cite magazine |last1=Moreau |first1=Jordan |last2=Lang |first2=Brent |last3=Earl |first3=William |date=February 23, 2025 |title=SAG Awards 2025 Full Winners List: 'Conclave', 'Only Murders in the Building' and 'Shōgun' Take Home Top Honors |url=https://variety.com/2025/film/news/sag-awards-winners-2025-1236313200/ |access-date=February 24, 2025 |magazine=Variety |archive-date=April 20, 2025 |archive-url=https://web.archive.org/web/20250420045405/https://variety.com/2025/film/news/sag-awards-winners-2025-1236313200/ |url-status=live}} * {{cite magazine |url=https://variety.com/2026/film/awards/sag-actor-awards-winners-sinners-studio-pitt-1236672938/ |title=SAG's Actor Awards Winners: 'Sinners' Wins Top Prize, 'The Studio' and 'The Pitt' Lead for TV |last1=Lang |first1=Brent |last2=Moreau |first2=Jordan |magazine=[[Variety (magazine)|Variety]] |date=March 1, 2026 |access-date=March 1, 2026}}</ref> The [[Wicked: The Soundtrack|films' soundtracks]] were co-billed to Grande, who performed several songs from the musical and an original track titled "[[The Girl in the Bubble]]", written by [[Stephen Schwartz]] for the [[Wicked: For Good – The Soundtrack|''Wicked: For Good'' soundtrack]].<ref>{{Cite magazine |last=Comiter |first=Jordana |date=November 22, 2025 |title=''Wicked: For Good''{{'}}s 2 New Songs: Everything to Know About the Original Tracks Sung by Cynthia Erivo and Ariana Grande |url=https://people.com/wicked-for-good-new-songs-what-to-know-11853864 |access-date=November 22, 2025 |magazine=[[People (magazine)|People]]}} *{{cite magazine |last=Cremona |first=Patrick |title=Wicked movie soundtrack: All the songs featured in Part One |url=https://www.radiotimes.com/movies/wicked-movie-soundtrack-part-1/ |magazine=[[Radio Times]] |access-date=December 1, 2024 |date=December 1, 2024 |archive-date=December 3, 2024 |archive-url=https://web.archive.org/web/20241203233557/https://www.radiotimes.com/movies/wicked-movie-soundtrack-part-1/ |url-status=live}} *{{Cite magazine |last=Cremona |first=Patrick |date=November 17, 2025 |title=''Wicked: For Good'' soundtrack – all the songs in Part Two including original compositions |url=https://www.radiotimes.com/movies/wicked-for-good-soundtrack/ |access-date=November 21, 2025 |magazine=Radio Times |archive-date=November 18, 2025 |archive-url=https://web.archive.org/web/20251118213655/https://www.radiotimes.com/movies/wicked-for-good-soundtrack/ |url-status=live}}</ref> Both albums received positive reviews and debuted at number two on the ''Billboard'' 200 with 139,000 and 122,000 units, tying for the highest debut for a soundtrack to a [[stage-to-film adaptation]].<ref>{{Cite magazine |last=Willman |first=Chris |date=November 23, 2024 |title='Wicked: The Soundtrack' Album Review: Stephen Schwartz's World-Beating Song Score Gets Its Due, and So Do the Divas Who Deliver It |url=https://variety.com/2024/music/album-reviews/wicked-soundtrack-album-review-stephen-schwartz-songs-score-ariana-grande-cynthia-erivo-1236219164/ |access-date=November 24, 2024 |magazine=[[Variety (magazine)|Variety]] |archive-date=November 23, 2024 |archive-url=https://web.archive.org/web/20241123235133/https://variety.com/2024/music/album-reviews/wicked-soundtrack-album-review-stephen-schwartz-songs-score-ariana-grande-cynthia-erivo-1236219164/ |url-status=live}}</ref><ref>{{cite magazine |last=Evans |first=Greg |title='Wicked' Soundtrack Debuts At No. 2 On Billboard 200 Chart, Making History For Broadway-To-Film Adaptations |url=https://deadline.com/2024/12/wicked-soundtrack-billboard-chart-1236191273/ |magazine=[[Deadline Hollywood]] |access-date=December 2, 2024 |date=December 2, 2024 |archive-date=December 3, 2024 |archive-url=https://web.archive.org/web/20241203013357/https://deadline.com/2024/12/wicked-soundtrack-billboard-chart-1236191273/ |url-status=live}} *{{Cite magazine |last=Caulfield |first=Keith |date=December 2, 2025 |title='Wicked: For Good' Flies Into Top 10 on 7 Billboard Charts |url=https://www.billboard.com/music/chart-beat/wicked-for-good-soundtrack-top-10-seven-billboard-charts-1236126945/ |access-date=December 3, 2025 |magazine=[[Billboard (magazine)|Billboard]] |archive-date=December 3, 2025 |archive-url=https://web.archive.org/web/20251203002228/https://www.billboard.com/music/chart-beat/wicked-for-good-soundtrack-top-10-seven-billboard-charts-1236126945/ |url-status=live}}</ref> Grande and her co-star Erivo's rendition of "[[Defying Gravity (song)|Defying Gravity]]" won [[Grammy Award for Best Pop Duo/Group Performance|Best Pop Duo/Group Performance]] at the [[68th Annual Grammy Awards]].<ref name="grammys2026">{{Cite web |url=https://pitchfork.com/news/ariana-grande-cynthia-erivo-win-best-pop-duo-group-performance-2026-grammys/ |title=Ariana Grande and Cynthia Erivo Win Best Pop Duo/Group Performance at 2026 Grammys |date=February 1, 2026 |access-date=February 2, 2026 |website=Pitchfork |last=Green |first=Walden |first2=Alex |last2=Suskind}}</ref> To promote the ''Wicked'' films, Grande hosted ''Saturday Night Live'' on [[Saturday Night Live season 50#ep971|October 12, 2024]] and [[Saturday Night Live season 51#ep997|December 20, 2025]].<ref>{{Cite magazine |last=Longeretta |first=Emily |date=March 10, 2024 |title='SNL': Ariana Grande Previews 'Wicked' Riff After Singing Medley of Hits by Taylor Swift, Jennifer Lopez and More With Bowen Yang |url=https://variety.com/2024/tv/news/snl-ariana-grande-wicked-riff-bowen-yang-skit-video-1235936464/ |access-date=October 10, 2024 |magazine=Variety |archive-date=December 17, 2024 |archive-url=https://web.archive.org/web/20241217132335/https://variety.com/2024/tv/news/snl-ariana-grande-wicked-riff-bowen-yang-skit-video-1235936464/ |url-status=live}}</ref><ref>{{Cite news |last=Vasquez |first=Zach |date=December 21, 2025 |title=Saturday Night Live: Ariana Grande returns to host a blockbuster episode |url=https://www.theguardian.com/tv-and-radio/2025/dec/21/saturday-night-live-ariana-grande-cher-bowen-yang/ |access-date=December 22, 2025 |work=The Guardian}}</ref> Her 2024 episode drew the show's highest ratings since May 2021, at the time, and became its most-watched episode on [[Peacock (streaming service)|Peacock]] and across social media;<ref>{{Cite magazine |last=Shanfeld |first=Ethan |date=October 16, 2024 |title=With Ariana Grande, 'SNL' Scores Most-Watched Episode Since Elon Musk Hosted in 2021 |url=https://variety.com/2024/music/news/ariana-grande-snl-episode-highest-ratings-elon-musk-1236180125/ |access-date=October 18, 2024 |magazine=Variety}}</ref> the 2025 episode was that year and [[Saturday Night Live season 51|season 51]]'s highest-rated and ''SNL''{{'}}s most-watched holiday episode since 2020.<ref>{{Cite magazine |last=Hailu |first=Selome |date=December 24, 2025 |title=Bowen Yang's 'SNL' Exit Is Most-Watched Episode in a Year |url=https://variety.com/2025/tv/news/bowen-yang-snl-exit-ratings-1236617144/ |access-date=December 27, 2025 |magazine=Variety}}</ref> She and Erivo opened the [[97th Academy Awards]] with a medley of "[[Over the Rainbow]]", "[[Home (The Wiz song)|Home]]", and "Defying Gravity".<ref>{{Cite magazine |last=Romano |first=Nick |date=March 2, 2025 |title=''Wicked'' stars Ariana Grande and Cynthia Erivo open 2025 Oscars with gravity-defying ''Wizard of Oz'' medley |url=https://ew.com/ariana-grande-cynthia-erivo-oscars-2025-wizard-of-oz-medley-11689202/ |access-date=March 3, 2025 |magazine=[[Entertainment Weekly]]}}</ref> In November 2025, Grande appeared in the special ''[[Wicked: One Wonderful Night]]'', performing music from the ''Wicked'' films alongside the cast;<ref>{{Cite magazine |last=Campione |first=Katie |date=October 22, 2025 |title='Wicked: One Wonderful Night' First-Look Photos Tease Swankified NBC Broadcast Special Featuring Cynthia Erivo, Ariana Grande & More |url=https://deadline.com/2025/10/wicked-one-wonderful-night-first-look-photos-cynthia-ariana-1236594175/ |access-date=November 19, 2025 |magazine=[[Deadline Hollywood]]}}</ref> a live album of the special was released in tandem with the broadcast.<ref>{{Cite magazine |last=Brandle |first=Lars |date=November 11, 2025 |title=Like Magic, 'Wicked: One Wonderful Night (Live)' Has Arrived: Stream It Now |url=https://www.billboard.com/music/pop/wicked-one-wonderful-night-live-stream-1236107430/ |access-date=November 19, 2025 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> She will embark on [[the Eternal Sunshine Tour]], her first concert tour since 2019, with 41 shows across North America and England, between June and September 2026.<ref name="ESTour1">{{Cite magazine |last=Garcia |first=Thania |date=August 28, 2025 |title=Ariana Grande Announces 2026 'Eternal Sunshine' Tour Dates |url=https://variety.com/2025/music/news/ariana-grande-2026-tour-dates-1236499995/ |access-date=August 28, 2025 |magazine=Variety}}</ref><ref>{{Cite magazine |last=Dailey |first=Hannah |date=September 16, 2025 |title=Ariana Grande Unveils Final Round of 2026 Eternal Sunshine Tour Dates, Adds 5 London Shows |url=https://www.billboard.com/music/pop/ariana-grande-final-eternal-sunshine-2026-tour-dates-london-1236067300/ |url-status=live |archive-url=https://web.archive.org/web/20250916174436/https://www.billboard.com/music/pop/ariana-grande-final-eternal-sunshine-2026-tour-dates-london-1236067300/ |archive-date=September 16, 2025 |access-date=September 16, 2025 |magazine=[[Billboard (magazine)|Billboard]] |issn=0006-2510 |oclc=732913734}}</ref> Grande's upcoming film projects include ''[[Focker-in-Law]]'' (2026)<ref>{{Cite web |last=Zhan |first=Jennifer |date=June 21, 2025 |title=Another Day, Another Introduction Gone Wrong With ''Meet the Fockers 4'' |url=https://www.vulture.com/article/meet-the-parents-4-cast-release-date-details.html |access-date=July 17, 2025 |website=[[Vulture (website)|Vulture]]}}</ref> and an animated film adaptation of [[Dr. Seuss]]'s 1990 book ''[[Oh, the Places You'll Go!]]'' (2028).<ref>{{Cite magazine |last=Grobar |first=Matt |date=July 15, 2025 |title=Ariana Grande & Josh Gad Join Warner Bros Pictures Animation's 'Oh, The Places You'll Go!' |url=https://deadline.com/2025/07/oh-the-places-youll-go-movie-casts-ariana-grande-josh-gad-1236458241/ |access-date=July 17, 2025 |magazine=Deadline Hollywood}}</ref> She will star in the thirteenth season of the horror anthology series ''[[American Horror Story]]'', slated for release in September 2026.<ref>{{Cite web |last=Omotade |first=Lade |date=April 10, 2026 |title=Epic 13-Part Horror Series Drops First Look at New Fantasy Sequel |url=https://collider.com/ryan-murphy-fantasy-series-american-horror-story-season-13-sarah-paulson-jessica-lange-first-images-release-window-september-2026/ |access-date=April 13, 2025 |website=[[Collider (website)|Collider]]}}</ref> In the summer of 2027, Grande will make her [[West End theatre#London's non-commercial theatres|London stage]] debut opposite her ''Wicked'' co-star [[Jonathan Bailey]] in [[Marianne Elliott]]'s [[Barbican Centre|Barbican Theatre]] production of ''[[Sunday in the Park with George]]''.<ref name=":4">{{Cite web |last=Shafer |first=Ellise |date=January 14, 2026 |title=Ariana Grande and Jonathan Bailey to Star in ''Sunday in the Park With George'' Revival in London |url=https://variety.com/2026/theater/global/ariana-grande-jonathan-bailey-sunday-in-the-park-with-george-revival-1236630839/ |access-date=January 14, 2025 |website=Variety |language=en-US}}</ref> == Artistry == === Musical style === Grande's music is generally [[Pop music|pop]] and [[Contemporary R&B|R&B]] with elements of [[Electronic dance music|EDM]], [[hip hop]],<ref>{{cite web |first=Amanda |last=Dobbins |url=https://www.vulture.com/2013/09/ariana-grande-101-is-she-really-the-new-mariah.html |title=Ariana Grande 101: Is She Really the New Mariah |work=Vulture |date=September 4, 2013 |access-date=August 23, 2018 |archive-url=https://web.archive.org/web/20140214001723/https://www.vulture.com/2013/09/ariana-grande-101-is-she-really-the-new-mariah.html |archive-date=February 14, 2014}}</ref><ref>{{cite web |url=https://www.vice.com/en/article/ariana-grandes-dangerous-woman-isnt-dangerous-or-womanly-so-what/ |title=Ariana Grande's 'Dangerous Woman' Isn't Dangerous Or Womanly... So What? |work=Noisey |date=May 23, 2016 |access-date=February 23, 2019 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319213250/https://noisey.vice.com/en_au/article/rzedd4/ariana-grandes-dangerous-woman-isnt-dangerous-or-womanly-so-what |url-status=live}}</ref> and [[Trap music (hip hop)|trap]],<ref name="billboard4">{{cite magazine |url=https://www.billboard.com/music/pop/ariana-grande-sweetener-uplifting-review-8470799/ |title=6 Reasons Ariana Grande's 'Sweetener' Is Her Most Uplifting Album Yet |magazine=[[Billboard (magazine)|Billboard]] |access-date=February 23, 2019 |archive-date=October 20, 2021 |archive-url=https://web.archive.org/web/20211020212945/https://www.billboard.com/articles/columns/pop/8470799/ariana-grande-sweetener-uplifting-review |url-status=live}}</ref> the latter first appearing prominently on her ''[[Christmas & Chill]]'' extended play. While consistently maintaining pop and R&B tones, she has increasingly incorporated trap into her music as her career has progressed,<ref name="RStrap-pop">{{cite magazine |url=https://www.rollingstone.com/music/music-news/ariana-grandes-sweetener-proves-that-trap-is-the-new-pop-712838/ |title=Ariana Grande's 'Sweetener' Proves That Trap Is the New Pop |magazine=[[Rolling Stone]] |date=August 17, 2018 |access-date=January 27, 2020 |archive-date=December 6, 2019 |archive-url=https://web.archive.org/web/20191206102529/https://www.rollingstone.com/music/music-news/ariana-grandes-sweetener-proves-that-trap-is-the-new-pop-712838/ |url-status=live}}</ref> thanks to her work with [[record producer]] Tommy Brown.<ref>{{cite magazine |last=Saponara |first=Michael |url=https://www.billboard.com/music/pop/tommy-brown-interview-ariana-grande-thank-u-next-album-8500741/ |title=Producer Tommy Brown Breaks Down Every Song He Produced on Ariana Grande's 'Thank U, Next' Album |magazine=[[Billboard (magazine)|Billboard]] |date=March 7, 2019 |access-date=January 26, 2020 |archive-date=September 11, 2019 |archive-url=https://web.archive.org/web/20190911055841/https://www.billboard.com/articles/columns/hip-hop/8500741/tommy-brown-interview-ariana-grande-thank-u-next-album |url-status=live}}</ref> She has collaborated with Brown on every album thus far and stated that "one of the things I love most about working with Tommy is that none of the beats he plays me ever sound the same."<ref>{{cite news |last=Tanzer |first=Myles |url=https://www.wsj.com/articles/ariana-grandes-new-album-positions-tommy-brown-interview-11604060104 |title=How Ariana Grande's New Album, 'Positions,' Was Made During Covid-19 |newspaper=The Wall Street Journal |date=October 30, 2020 |access-date=November 12, 2020 |archive-date=November 12, 2020 |archive-url=https://web.archive.org/web/20201112005043/https://www.wsj.com/articles/ariana-grandes-new-album-positions-tommy-brown-interview-11604060104 |url-status=live}}</ref> Grande learned how to [[sound engineer]] and produce her own vocals because she "love[s] being hands on" with every project, revealing that rapper [[Mac Miller]] first taught her how to use the [[digital audio workstation]] [[Pro Tools]].<ref>{{cite magazine |url=https://www.rollingstone.com/music/music-news/qa-ariana-grande-on-yours-truly-and-judging-miley-cyrus-190517/ |title=Grande on 'Yours Truly' and Miley Cyrus |magazine=[[Rolling Stone]] |date=September 11, 2013 |access-date=November 11, 2020 |archive-date=November 27, 2020 |archive-url=https://web.archive.org/web/20201127070808/https://www.rollingstone.com/music/music-news/qa-ariana-grande-on-yours-truly-and-judging-miley-cyrus-190517/ |url-status=live}}</ref> Collaborator [[Justin Tranter]] remarked that he felt inspired seeing how involved Grande is in creating her music "from the writing to the vision to the storytelling and to even engineering and comping her own vocals."<ref>{{cite web |url=https://www.npr.org/2019/02/09/691376280/thank-u-text-ariana-grandes-collaborators-break-down-the-artist-s-latest-album |title='Thank U' Text: Ariana Grande's Collaborators Break Down The Artist's Latest Album |publisher=[[NPR]] |date=February 9, 2019 |access-date=November 12, 2020 |archive-date=November 16, 2020 |archive-url=https://web.archive.org/web/20201116053408/https://www.npr.org/2019/02/09/691376280/thank-u-text-ariana-grandes-collaborators-break-down-the-artist-s-latest-album |url-status=live}}</ref> She has co-written songs addressing a wide variety of themes, such as love, sex, wealth, breakups, independence, empowerment, self-love and moving on from the past.<ref name="billboard6">{{cite magazine |first=Rania |last=Aniftos |url=https://www.billboard.com/articles/news/8497210/ariana-grande-thank-u-next-most-heartbreaking-lyrics |title=Ariana Grande's 'Thank U, Next' Album: 5 Most Heartbreaking Lyrics |magazine=[[Billboard (magazine)|Billboard]] |date=February 8, 2019 |access-date=January 26, 2020 |archive-date=July 17, 2019 |archive-url=https://web.archive.org/web/20190717053442/https://www.billboard.com/articles/news/8497210/ariana-grande-thank-u-next-most-heartbreaking-lyrics |url-status=live}}</ref> Grande's debut album ''Yours Truly'' was complimented for recreating the R&B "vibe and feel of the 90s" with the help of songwriter and producer [[Babyface (musician)|Babyface]].<ref>{{cite web |url=https://www.allmusic.com/album/my-everything-mw0002698499 |title=My Everything – Ariana Grande |last=Erlewine |first=Stephen Thomas |website=[[AllMusic]] |date=August 25, 2014 |access-date=September 1, 2014 |archive-date=February 24, 2022 |archive-url=https://web.archive.org/web/20220224200234/https://www.allmusic.com/album/my-everything-mw0002698499 |url-status=live}}</ref> Her follow-up record, ''My Everything'', explored EDM and [[electropop]] genres.<ref name="RSMyETReview">{{cite magazine |url=https://www.rollingstone.com/music/albumreviews/ariana-grande-my-everything-20140826 |title=Ariana Grande My Everything |last=Sheffield |first=Rob |date=August 26, 2014 |magazine=[[Rolling Stone]] |access-date=August 28, 2014 |archive-date=June 17, 2018 |archive-url=https://web.archive.org/web/20180617093135/https://www.rollingstone.com/music/albumreviews/ariana-grande-my-everything-20140826 }}</ref> Grande expanded the pop and R&B sound on her third album, ''Dangerous Woman'', which was praised by the ''[[Los Angeles Times]]'' for integrating elements of different styles, such as [[reggae]]-pop ("Side to Side"), dance-pop ("Be Alright"), and [[guitar]]-trap fusion ("Sometimes").<ref>{{cite web |last=Wood |first=Mikael |url=https://www.latimes.com/entertainment/music/la-et-ms-ariana-grande-dangerous-woman-review-20160517-snap-story.html |title=Review: Ariana Grande leaves the princess image behind with ''Dangerous Woman'' |work=[[Los Angeles Times]] |date=May 18, 2016 |access-date=April 20, 2020 |archive-date=February 23, 2017 |archive-url=https://web.archive.org/web/20170223153551/http://www.latimes.com/entertainment/music/la-et-ms-ariana-grande-dangerous-woman-review-20160517-snap-story.html |url-status=live}}</ref> Trap-pop was more heavily featured on her fourth and fifth studio albums, ''Sweetener'' and ''Thank U, Next''.<ref name="RStrap-pop"/> Elias Leight of ''[[Rolling Stone]]'' opined that Grande "set her sights on conquering trap, savage basslines and jittery swarms of drum programming" and "embrace[d] the sound of hard-bitten Southern hip-hop" on ''Sweetener'', exploring [[funk]] music with themes of love and prosperity.<ref name="RSnew-pop">{{cite magazine |last=Leight |first=Elias |date=August 17, 2018 |title=Ariana Grande's ''Sweetener'' Proves That Trap Is the New Pop |url=https://www.rollingstone.com/music/music-news/ariana-grandes-sweetener-proves-that-trap-is-the-new-pop-712838 |magazine=[[Rolling Stone]] |access-date=August 18, 2018 |archive-date=October 4, 2018 |archive-url=https://web.archive.org/web/20181004042008/https://www.rollingstone.com/music/music-news/ariana-grandes-sweetener-proves-that-trap-is-the-new-pop-712838/ |url-status=live}}</ref><ref name="billboard5"/> Craig Jenkins of ''[[New York (magazine)|Vulture]]'' noted that she embraced trap and hip hop with undertones of R&B on ''Thank U, Next'',<ref>{{cite web |last=Jenkins |first=Craig |url=https://www.vulture.com/2019/02/ariana-grande-thank-u-next-album-review.html |title=Thank U, Next Is a Phoenix Moment for Ariana Grande |work=[[Vulture (blog)|Vulture]] |date=February 8, 2019 |access-date=February 22, 2019 |archive-date=December 29, 2019 |archive-url=https://web.archive.org/web/20191229154414/https://www.vulture.com/2019/02/ariana-grande-thank-u-next-album-review.html |url-status=live}}</ref> with lyrics about breakups, empowerment, and self-love.<ref name="billboard5"/> Her sixth album, ''Positions'', further emphasized the R&B and trap-pop sound of its two predecessors, with lyrics discussing sex and romance.<ref name="slant">{{cite web |last=Camp |first=Alexa |date=October 30, 2020 |title=Review: Ariana Grande's Positions Too Often Defaults to a Familiar Pose |url=https://www.slantmagazine.com/music/review-ariana-grande-positions-too-often-defaults-to-a-familiar-pose/ |url-status=live |archive-url=https://web.archive.org/web/20201030081531/https://www.slantmagazine.com/music/review-ariana-grande-positions-too-often-defaults-to-a-familiar-pose/ |archive-date=October 30, 2020 |access-date=October 30, 2020 |website=[[Slant Magazine]]}}</ref><ref name="Consequence">{{cite web |last=Siroky |first=Mary |date=October 30, 2020 |title=Ariana Grande's Positions Is a 2020 Pop Fairytale: Review |url=https://consequence.net/2020/10/album-review-ariana-grande-positions/ |url-status=live |archive-url=https://web.archive.org/web/20201101020934/https://consequence.net/2020/10/album-review-ariana-grande-positions/ |archive-date=November 1, 2020 |access-date=October 30, 2020 |website=[[Consequence of Sound]]}}</ref> === Influences === {{multiple image | footer = Grande credits [[Mariah Carey]] (''left'') and [[Whitney Houston]] (''right'') as her major vocal influences. | image1 = Mariah Carey13 Edwards Dec 1998.jpg | width1 = 155 | alt1 = Mariah Carey | image2 = Whitney Houston Welcome Home Heroes 1 cropped.jpg | width2 = 155 | alt2 = Whitney Houston | align = right }} Grande grew up listening mainly to [[urban pop]] and [[1990s music]].<ref name="TheBillboard">{{cite news |last=Lipshutz |first=Jason |date=March 28, 2013 |title=Ariana Grande Talks Breakout Hit 'The Way': Watch New Music Video |url=https://www.billboard.com/music/music-news/ariana-grande-talks-breakout-hit-the-way-watch-new-music-video-1554921/ |url-status=live |archive-url=https://web.archive.org/web/20190626213147/https://www.billboard.com/articles/columns/pop-shop/1554921/ariana-grande-talks-breakout-hit-the-way-watch-new-music-video |archive-date=June 26, 2019 |access-date=March 28, 2013}}</ref> She credited [[Gloria Estefan]] with inspiring her to pursue a music career after Estefan saw and complimented Grande's performance on a cruise ship when she was eight years old.<ref>{{cite web |date=January 26, 2013 |title=Nickelodeon Kids |url=http://nick-kids.net/post/74685927172/when-i-was-eight-years-old-i-was-on-a-cruise-ship |archive-url=https://web.archive.org/web/20141001071524/http://nick-kids.net/post/74685927172/when-i-was-eight-years-old-i-was-on-a-cruise-ship |archive-date=October 1, 2014 |access-date=January 26, 2013 |publisher=Nickelodeon Kids}}</ref> [[Mariah Carey]] and [[Whitney Houston]] are her primary vocal influences: "I love Mariah Carey. She is literally my favorite human being on the planet. And of course Whitney [Houston] as well. As far as vocal influences go, Whitney and Mariah pretty much cover it."<ref>{{cite news |url=http://www.rap-up.com/2014/03/07/ariana-grande-covers-whitney-houston-at-the-white-house/#more-181197 |title=Ariana Grande Covers Whitney Houston at the White House |newspaper=Rap-Up |access-date=August 9, 2014 |archive-date=June 29, 2019 |archive-url=https://web.archive.org/web/20190629135139/https://www.rap-up.com/2014/03/07/ariana-grande-covers-whitney-houston-at-the-white-house/#more-181197 |url-status=live}}</ref> Grande was also influenced vocally by [[Destiny's Child]], [[Celine Dion]], [[Christina Aguilera]], and [[Madonna]].<ref>{{cite web |url=https://www.teenvogue.com/story/ariana-grande-opens-mac-miller-life-music |title=Ariana Grande Opens Up About Mac Miller's Life and Music |website=Teen Vogue |date=May 14, 2020 |access-date=May 14, 2020 |archive-date=June 10, 2020 |archive-url=https://web.archive.org/web/20200610204020/https://www.teenvogue.com/story/ariana-grande-opens-mac-miller-life-music |url-status=live}}</ref><ref>{{cite tweet |user=arianagrande |number=27637810617913344 |title=My biggest musical influences are Imogen Heap, Christina Aguilera, MJ and Rihanna |date=January 19, 2011 |access-date=June 19, 2024}}</ref> She reflected on her childhood by posting videos of herself singing songs from Dion's 1997 album ''[[Let's Talk About Love]]'' on her social media.<ref>{{cite web |url=https://www.elle.com/culture/celebrities/a25664687/ariana-grande-toddler-sing-celine-dion-video/ |title=Watch Ariana Grande Absolutely Nail A Celine Dion Song As A Toddler |last=Rhue |first=Holly |work=[[Elle (magazine)|Elle]] |date=December 23, 2018 |access-date=November 17, 2020 |archive-date=November 8, 2020 |archive-url=https://web.archive.org/web/20201108104657/https://www.elle.com/culture/celebrities/a25664687/ariana-grande-toddler-sing-celine-dion-video/ |url-status=live}}</ref> Grande credits Madonna with "pav[ing] the way for me and also every other female artist" and admitted to being "obsessed with [[Madonna albums discography|her entire discography]]".<ref>{{cite magazine |url=https://www.rollingstone.com/music/music-news/ariana-grande-anxiety-bbc-751525/ |archive-url=https://web.archive.org/web/20201204055609/https://www.rollingstone.com/music/music-news/ariana-grande-anxiety-bbc-751525/ |archive-date=December 4, 2020 |url-access=subscription |title=Watch Ariana Grande Talk Anxiety, Perform 'Sweetener' Songs on BBC Special |magazine=[[Rolling Stone]] |first=Daniel |last=Kreps |date=November 2, 2018 |access-date=July 26, 2023}}</ref><ref>{{cite web |url=https://apnews.com/article/ddd0ce3ae98e4317afbbfeb07685a97c |archive-url=https://web.archive.org/web/20220814204321/https://apnews.com/article/ddd0ce3ae98e4317afbbfeb07685a97c |archive-date=August 14, 2022 |title=Madonna inspires Ariana Grande |work=[[Associated Press News]] |date=March 2, 2017 |access-date=July 26, 2023}}</ref> Musically, Grande admires [[India Arie]] because her "music makes me feel like everything is going to be okay", loves [[Brandy Norwood]]'s songs because "her [[riff]]s are incredibly on point", and praised [[Imogen Heap]]'s "intricate" song structure.<ref name="billboard5"/> Heap in particular Grande has said is her favorite musician, songwriter, and producer of all time.<ref name="k750">{{cite magazine |title=Ariana Grande on Landing 'Wicked': "Everything's Going to Be Okay Forever Now" |magazine=[[W (magazine)|W]] |date=January 3, 2025 |url=https://www.wmagazine.com/culture/ariana-grande-wicked-cover-interview-2024 |access-date=February 25, 2025}}</ref><ref name="h805">{{cite magazine |last=Williams |first=Sophie |title=Imogen Heap on Viral 'Headlock' Success, AI and Ariana Grande: 'There's a New Type of Energy This Time' |magazine=[[Billboard (magazine)|Billboard]] |date=January 29, 2025 |url=https://www.billboard.com/music/pop/imogen-heap-headlock-success-ai-and-ariana-grande-1235886471/ |access-date=February 25, 2025}}</ref> Grande also named [[Judy Garland]] as a childhood influence, admiring her ability to tell "a story when she sings".<ref name="billboard5">{{cite magazine |url=https://www.billboard.com/music/music-news/gimme-five-ariana-grandes-most-inspirational-female-singers-5748215/ |title=Gimme Five: Ariana Grande's Most Inspirational Female Singers |magazine=[[Billboard (magazine)|Billboard]] |date=October 9, 2013 |access-date=July 28, 2014 |archive-date=July 14, 2014 |archive-url=https://web.archive.org/web/20140714114319/http://www.billboard.com/articles/columns/pop-shop/5748215/gimme-five-ariana-grandes-most-inspirational-female-singers? |url-status=live}}</ref> Ahead of the release of her debut album, Grande says its sound was inspired by Heap, Carey, [[Fergie (singer)|Fergie]], and Houston.<ref>{{Cite web |last=Corner |first=Lewis |date=April 18, 2013 |title=Ariana Grande: 'Fergie's Clumsy always gives me inspiration' |url=https://www.digitalspy.com/music/a474265/ariana-grande-fergies-clumsy-always-gives-me-inspiration/ |access-date=May 1, 2025 |publisher=[[Digital Spy]]}}</ref> Music producer and collaborator [[Savan Kotecha]] stated that he and Grande were influenced by [[Lauryn Hill]] when creating her fourth album [[Sweetener (album)|''Sweetener'']] and its lead single "[[No Tears Left to Cry]]".<ref>{{cite magazine |date=February 18, 2019 |title=How Ariana Grande Scored Two Number One Albums in Just Six Months |url=https://www.rollingstone.com/music/music-features/ariana-grande-thank-u-next-savan-kotecha-interview-791280/ |access-date=July 8, 2022 |magazine=[[Rolling Stone]] |archive-date=March 31, 2019 |archive-url=https://web.archive.org/web/20190331104143/https://www.rollingstone.com/music/music-features/ariana-grande-thank-u-next-savan-kotecha-interview-791280/ |url-status=live}}</ref> Kotecha told [[Variety (magazine)|''Variety'']], "we were listening to Lauryn Hill about chord changes and why we stick to four chords all the time".<ref>{{cite web |last=LeDonne |first=Rob |date=August 23, 2018 |title=Songwriter Savan Kotecha on the Making of Ariana Grande's Sweetener |url=https://www.vulture.com/2018/08/how-ariana-grandes-sweetener-came-together.html |access-date=July 8, 2022 |website=Vulture |archive-date=October 1, 2020 |archive-url=https://web.archive.org/web/20201001142925/https://www.vulture.com/2018/08/how-ariana-grandes-sweetener-came-together.html |url-status=live}}</ref> Grande expressed admiration for rappers' unconventional music release strategy. She told ''[[Billboard (magazine)|Billboard]]'', "My dream has always been to be—obviously not a rapper, but, like, to put out music in the way that a rapper does. I feel like there are certain standards that pop women are held to that men aren't ... It's just like, 'Bruh, I just want to ... drop [music] the way these boys do."<ref name="rollingstone1">{{cite magazine |title=Ariana Grande Wants to Release Music Like a Rapper |url=https://www.rollingstone.com/music/music-news/ariana-grande-new-release-strategy-thank-u-next-763458/ |url-status=live |archive-url=https://web.archive.org/web/20191223232431/https://www.rollingstone.com/music/music-news/ariana-grande-new-release-strategy-thank-u-next-763458/ |archive-date=December 23, 2019 |access-date=February 23, 2019 |magazine=[[Rolling Stone]]}}</ref> It inspired her to release "Thank U, Next" without any prior announcement, which ''[[The Ringer (website)|The Ringer]]'' called "more of a [[Drake (musician)|Drake]] move than an Ariana Grande move".<ref>{{cite web |url=https://www.theringer.com/music/2018/12/5/18126526/year-in-singles-ariana-grande-thank-u-next-drake-in-my-feelings |title=Thank U, Next: How Ariana Grande and Drake Accelerated the Pop Music Life Cycle |date=December 5, 2018 |work=The Ringer |first=Lindsay |last=Zoladz |access-date=November 18, 2020 |archive-date=November 8, 2020 |archive-url=https://web.archive.org/web/20201108104755/https://www.theringer.com/music/2018/12/5/18126526/year-in-singles-ariana-grande-thank-u-next-drake-in-my-feelings |url-status=live}}</ref> === Voice === Grande has been described as a [[soprano]],<ref>{{cite web |url=https://www.vox.com/2014/8/19/6030479/ariana-grande-who-is-pop-star-vmas |title=9 Questions You're Too Embarrassed To Ask About Ariana Grande |date=July 8, 2015 |website=Vox |first=Kelsey |last=McKinney |access-date=February 2, 2018 |archive-date=February 3, 2018 |archive-url=https://web.archive.org/web/20180203180909/https://www.vox.com/platform/amp/2014/8/19/6030479/ariana-grande-who-is-pop-star-vmas |url-status=live}}</ref><ref>{{cite news |url=https://www.theguardian.com/music/2017/may/21/ariana-grande-review-pop-flops-genting-arena-birmingham-dangerous-woman |title=Ariana Grande review – pop it till it flops |newspaper=[[The Guardian]] |date=May 21, 2017 |access-date=February 12, 2018 |first=Kitty |last=Empire |archive-date=September 27, 2017 |archive-url=https://web.archive.org/web/20170927112039/https://www.theguardian.com/music/2017/may/21/ariana-grande-review-pop-flops-genting-arena-birmingham-dangerous-woman |url-status=live}}</ref><ref>{{cite news |url=https://www.telegraph.co.uk/culture/music/live-music-reviews/11644279/Ariana-Grande-O2-review-spectacle-but-no-soul.html |title=Ariana Grande, O2, review: 'spectacle but no soul' |work=[[The Daily Telegraph]] |date=June 2, 2015 |access-date=February 12, 2018 |first=Alice |last=Vincent |archive-date=February 13, 2018 |archive-url=https://web.archive.org/web/20180213021939/http://www.telegraph.co.uk/culture/music/live-music-reviews/11644279/Ariana-Grande-O2-review-spectacle-but-no-soul.html |url-status=live}}</ref> possessing a four-octave [[vocal range]]<ref name="Savage"/><ref>{{cite web |url=https://www.vulture.com/2013/09/ariana-grande-101-is-she-really-the-new-mariah.html |title=Ariana Grande 101: Is She Really the New Mariah? |website=Vulture |date=September 4, 2013 |access-date=March 11, 2015 |archive-date=February 14, 2014 |archive-url=https://web.archive.org/web/20140214001723/https://www.vulture.com/2013/09/ariana-grande-101-is-she-really-the-new-mariah.html |url-status=live}}</ref> and a [[whistle register]].<ref>{{cite web |url=http://www.vh1.com/news/51492/ariana-grande-yours-truly |title=Ariana Grande: Five Things To Know About The Little Girl Behind That Big Voice |publisher=VH1 |date=September 6, 2013 |access-date=October 11, 2017 |archive-date=August 22, 2015 |archive-url=https://web.archive.org/web/20150822101609/http://www.vh1.com/news/51492/ariana-grande-yours-truly/ }}</ref> With the release of ''Yours Truly'', critics compared Grande's wide vocal range and music to those of Mariah Carey.<ref name="Entertainmentweekly">{{cite magazine |url=http://music-mix.ew.com/2013/07/22/ariana-grande-new-single-baby-i |title=Ariana Grande's new single 'Baby I': Hear it here |magazine=Entertainment Weekly |access-date=February 18, 2014 |archive-date=October 6, 2014 |archive-url=https://web.archive.org/web/20141006110542/http://music-mix.ew.com/2013/07/22/ariana-grande-new-single-baby-i/ |url-status=live}}</ref><ref name="StopComparing">{{cite magazine |url=https://www.billboard.com/music/music-news/ariana-grande-mariah-carey-comparisons-6229461/ |title=It's Time to Stop Comparing Ariana Grande to Mariah Carey |last=Horowitz |first=Steven J. |magazine=[[Billboard (magazine)|Billboard]] |date=August 27, 2014 |access-date=September 1, 2014 |archive-date=April 6, 2018 |archive-url=https://web.archive.org/web/20180406125138/https://www.billboard.com/articles/columns/pop-shop/6229461/ariana-grande-mariah-carey-comparisons |url-status=live}}</ref> Julianne Escobedo Shepherd of ''Billboard'' wrote that both Carey and Grande have "the talent to let their vocals do the talking ... that's not where the similarities end. ... Grande is subverting it with cute, comfortable, and on-trend dresses with a feminine slant."<ref name="Shepherd">{{cite magazine |url=https://www.billboard.com/music/music-news/ariana-grande-fashion-style-my-everything-6229387/ |title=Ariana Grande's Fashion Focus: Breaking Down Her Many Confident Looks |last=Shepherd |first=Julianne Escobedo |magazine=[[Billboard (magazine)|Billboard]] |date=August 26, 2014 |access-date=September 2, 2014 |archive-date=August 31, 2014 |archive-url=https://web.archive.org/web/20140831033945/http://www.billboard.com/articles/columns/pop-shop/6229387/ariana-grande-fashion-style-my-everything |url-status=live}}</ref> Mark Savage of BBC News named Grande "one of pop's most intriguing and gifted singers" and complimented her "unrivalled vocal control".<ref name="Savage"/> In ''The New York Times'', [[Jon Pareles]] noted that Grande's voice "can be silky, breathy or cutting, swooping through long melismas or jabbing out short R&B phrases; it's always supple and airborne, never forced."<ref>{{cite news |last=Pareles |first=Jon |url=https://www.nytimes.com/2018/08/29/arts/music/ariana-grande-sweetener-review.html |title=Ariana Grande Sails Above Sorrow on ''Sweetener'' |newspaper=The New York Times |date=August 29, 2018 |access-date=August 30, 2018 |archive-date=August 29, 2018 |archive-url=https://web.archive.org/web/20180829230135/https://www.nytimes.com/2018/08/29/arts/music/ariana-grande-sweetener-review.html |url-status=live}}</ref> Composer and playwright [[Jason Robert Brown]] wrote in a 2016 ''Time'' magazine article, "[N]o matter how much you are underestimated ... you are going to open your mouth and that unbelievable sound is going to come out. That [...] instrument [...] allows you to shut down every objection and every obstacle."<ref name="Time100">{{cite magazine |last=Brown |first=Jason Robert |author-link=Jason Robert Brown |url=http://time.com/4299766/ariana-grande-2016-time-100 |title=The World's Most Influential People: Ariana Grande |magazine=[[Time (magazine)|Time]] |date=April 21, 2016 |access-date=April 21, 2016 |archive-date=June 26, 2019 |archive-url=https://web.archive.org/web/20190626184549/https://time.com/4299766/ariana-grande-2016-time-100/ |url-status=live}}</ref> Grande's [[enunciation]] has drawn some criticism,<ref>{{Cite web |last=DeVille |first=Chris |date=October 29, 2020 |title=Premature Evaluation: Ariana Grande Positions |url=https://www.stereogum.com/2104172/ariana-grande-positions-review/reviews/premature-evaluation/ |archive-url=https://web.archive.org/web/20240420110026/https://www.stereogum.com/2104172/ariana-grande-positions-review/reviews/premature-evaluation/ |archive-date=April 20, 2024 |access-date=May 5, 2025 |website=[[Stereogum]] |quote=She also seems to have cleaned up the slurred enunciation that was once the subject of wisecracks}}</ref> particularly on her earlier recordings.<ref>{{Cite news |last=Cragg |first=Michael |date=February 8, 2019 |title=Ariana Grande: Thank U, Next review – a break-up album of wit and wonder |url=https://www.theguardian.com/music/2019/feb/08/ariana-grande-thank-u-next-review |archive-url=https://web.archive.org/web/20241202233051/https://www.theguardian.com/music/2019/feb/08/ariana-grande-thank-u-next-review |archive-date=December 2, 2024 |access-date=May 5, 2025 |newspaper=[[The Guardian]]}}</ref><ref>{{Cite news |last=Hunt |first=Elle |date=December 26, 2018 |title=Ariana Grande: a beacon of resilience in her worst and biggest year |url=https://www.theguardian.com/music/2018/dec/26/ariana-grande-resilience |archive-url=https://web.archive.org/web/20241203200622/https://www.theguardian.com/music/2018/dec/26/ariana-grande-resilience |archive-date=December 3, 2024 |access-date=May 5, 2025 |newspaper=[[The Guardian]]}}</ref><ref name=":3">{{Cite magazine |last=Williams |first=Sophie |date=January 12, 2024 |title=Ariana Grande's 'Yes, And?' is a bitingly catchy and self-aware comeback |url=https://www.nme.com/features/music-features/ariana-grande-new-single-yes-and-lyrics-video-review-3569651 |archive-url=https://web.archive.org/web/20250205093815/https://www.nme.com/features/music-features/ariana-grande-new-single-yes-and-lyrics-video-review-3569651 |archive-date=February 5, 2025 |access-date=May 5, 2025 |magazine=[[NME]] |quote=For an artist that has previously been criticised for poor enunciation}}</ref> Grande herself has acknowledged this on multiple occasions, admitting in 2015 that pronunciation was something she hoped to improve.<ref>{{Cite news |last=Keeley |first=Matt |date=May 5, 2022 |title='Cat in an Elevator?': Benedict Cumberbatch Baffled by Ariana Grande Lyrics |url=https://www.newsweek.com/cat-elevator-benedict-cumberbatch-baffled-ariana-grande-lyrics-1704042 |archive-url=https://web.archive.org/web/20230825041525/https://www.newsweek.com/cat-elevator-benedict-cumberbatch-baffled-ariana-grande-lyrics-1704042 |archive-date=August 25, 2023 |access-date=May 5, 2025 |work=[[Newsweek]]}}</ref> However, several critics noted a marked improvement on ''Eternal Sunshine'',<ref name=":3"/><ref>{{Cite news |last=Tafoya |first=Harry |date=March 11, 2024 |title=eternal sunshine |url=https://pitchfork.com/reviews/albums/ariana-grande-eternal-sunshine/ |archive-url=https://web.archive.org/web/20250313003149/https://pitchfork.com/reviews/albums/ariana-grande-eternal-sunshine/ |archive-date=March 13, 2025 |access-date=May 5, 2025 |website=[[Pitchfork (website)|Pitchfork]]}}</ref> with some attributing the clearer diction to her extensive vocal training for ''Wicked''.<ref>{{Cite news |last=Bryant |first=Danica |date=2024 |title=Ariana Grande Finds Eternal Sunshine |url=https://umusic.co.nz/umusic/ariana-grande-finds-eternal-sunshine/ |archive-url=https://web.archive.org/web/20250214050334/https://umusic.co.nz/umusic/ariana-grande-finds-eternal-sunshine/ |archive-date=February 14, 2025 |access-date=May 5, 2025 |publisher=[[Universal Music New Zealand]]}}</ref><ref>{{Cite news |last=Olivieri |first=Kevin |date=March 19, 2024 |title=Ariana Grande Comes Back with Her Best Album Yet |url=https://themontclarion.org/entertainment/ariana-grande-comes-back-with-her-best-album-yet/ |archive-url=https://web.archive.org/web/20250427113945/https://themontclarion.org/entertainment/ariana-grande-comes-back-with-her-best-album-yet/ |archive-date=April 27, 2025 |access-date=May 5, 2025 |work=[[Montclair State University|The Montclarion]]}}</ref> == Public image == [[File:Ariana Grande - Madame Tussauds Bangkok (cropped).jpg|thumb|upright|Waxwork of Grande at [[Madame Tussauds]], Bangkok]] Grande cited [[Audrey Hepburn]] as a major style influence in her early career; however, she later found emulating Hepburn's style "a little boring".<ref name="Grazia">{{cite news |url=https://graziadaily.co.uk/fashion/news/ariana-grande-look-back-things-wore-yesterday-cringe/ |title=Ariana Grande: 'I Look Back At Things I Wore Yesterday And Cringe' |first=Louby |last=McLoughlin |work=[[Grazia]] |date=August 20, 2014 |access-date=August 20, 2014 |archive-date=May 7, 2019 |archive-url=https://web.archive.org/web/20190507120435/https://graziadaily.co.uk/fashion/news/ariana-grande-look-back-things-wore-yesterday-cringe/ |url-status=live}}</ref> She also drew inspiration from actresses of the 1950s and 1960s, such as [[Ann-Margret]], [[Nancy Sinatra]], and [[Marilyn Monroe]].<ref name="Grazia"/> Grande's modest look early in her career was described as "age appropriate" in comparison to contemporary artists who grew up in the public eye.<ref name="Shepherd"/> Jim Farber of New York's ''[[New York Daily News]]'' wrote in 2014 that Grande received less attention "for how little she wears or how graphically she moves than for how she sings."<ref name="NYDNsingSex">{{cite web |url=https://www.nydailynews.com/entertainment/ariana-grande-owes-stardom-singing-sex-appeal-article-1.1902829 |title=Ariana Grande owes her stardom to singing, not sex appeal |first=Jim |last=Farber |newspaper=[[New York Daily News]] |url-status=live |date=August 14, 2014 |access-date=March 19, 2024 |archive-date=October 5, 2014 |archive-url=https://web.archive.org/web/20141005224931/http://www.nydailynews.com/entertainment/ariana-grande-owes-stardom-singing-sex-appeal-article-1.1902829}}</ref> That year, she abandoned her earlier style in favor of short skirts and [[crop tops]] with [[knee-high boot]]s in live performances and red carpet events.<ref>{{cite web |url=http://style.mtv.com/2014/04/23/ariana-grande-nancy-sinatra |title=Ariana Grande Is Totally Having a Nancy Sinatra Moment |last=Morton |first=Caitlin |publisher=[[MTV]] |date=April 23, 2014 |access-date=September 2, 2014 |archive-url=https://web.archive.org/web/20140903120634/http://style.mtv.com/2014/04/23/ariana-grande-nancy-sinatra/ |archive-date=September 3, 2014}}</ref> She also began regularly wearing cat and bunny ears and, subsequently, oversized jackets and hoodies through the late 2010s—the latter articles became largely associated with her persona.<ref>{{cite magazine |last=Piwowarski |first=Allison |date=February 3, 2021 |title=What's Up With The Cat Ears? |url=https://www.bustle.com/articles/41944-whats-up-with-ariana-grandes-cat-ears-an-exploration-of-her-history-as-a-fan-of |url-status=live |archive-url=https://web.archive.org/web/20210207080834/https://www.bustle.com/articles/41944-whats-up-with-ariana-grandes-cat-ears-an-exploration-of-her-history-as-a-fan-of |archive-date=February 7, 2021 |access-date=February 3, 2021 |magazine=Bustle}}</ref><ref>{{cite magazine |last=Jackson |first=Vannessa |date=February 3, 2021 |title=What Does Ariana Grande's Bunny Mask Mean |url=https://www.bustle.com/articles/148764-what-does-ariana-grandes-bunny-mask-mean-the-dangerous-woman-cover-art-is-mysterious |url-status=live |archive-url=https://web.archive.org/web/20201222082425/https://www.bustle.com/articles/148764-what-does-ariana-grandes-bunny-mask-mean-the-dangerous-woman-cover-art-is-mysterious |archive-date=December 22, 2020 |access-date=February 3, 2021 |magazine=Bustle}}</ref> Grande later stated that owing to her mental health struggles at the time, she regularly wore variations of the oversized sweatshirt-boots outfit as she preferred to "hide away in something really cozy" and "did not have the mental energy to consider clothing".<ref>{{cite magazine |last=Mohammed |first=Leyla |date=January 28, 2026 |title=People Are Heartbroken After Discovering The Real Reason Ariana Grande Always Used To Wear Oversized Sweatshirts And Thigh-High Boots |url=https://www.buzzfeed.com/leylamohammed/why-ariana-grande-wore-oversized-sweatshirts-high-boots |url-status=live |access-date=January 30, 2026 |publisher=[[BuzzFeed]]}}</ref> Grande's style is often imitated by social media influencers and celebrities.<ref>{{cite magazine |last=Anfitos |first=Rania |url=https://www.billboard.com/music/music-news/celebrity-doppelgangers-tiktok-8550677/ |title=These 8 Celebrity Doppelgangers on TikTok Will Have You Seeing Double |magazine=[[Billboard (magazine)|Billboard]] |date=February 2, 2020 |access-date=April 1, 2021 |archive-date=July 15, 2021 |archive-url=https://web.archive.org/web/20210715173059/https://www.billboard.com/amp/articles/news/8550677/celebrity-doppelgangers-tiktok |url-status=live}}</ref><ref name=StopCopy>{{cite web |url=https://www.capitalfm.com/news/madison-beer-ariana-grande-copying-claims/ |title=Madison Beer Asks People To Stop The 'Hurtful' Ariana Grande 'Copying' Claims |publisher=[[Capital (radio network)|Capital FM]] |date=November 19, 2020 |access-date=April 1, 2021 |archive-date=June 12, 2021 |archive-url=https://web.archive.org/web/20210612232815/https://www.capitalfm.com/news/madison-beer-ariana-grande-copying-claims/ |url-status=live}}</ref> After years of dyeing her hair red for her role as Cat Valentine on Nickelodeon, Grande wore extensions as her hair recovered from damage.<ref name="Fader2018">{{cite web |last=Tanzer |first=Myles |url=http://www.thefader.com/2018/05/30/ariana-grande-cover-story |title=Ariana Grande |magazine=[[The Fader]] |date=May 30, 2018 |access-date=May 31, 2018 |archive-date=January 29, 2020 |archive-url=https://web.archive.org/web/20200129023634/http://www.thefader.com/2018/05/30/ariana-grande-cover-story |url-status=live}}</ref> Anne T. Donahue of [[MTV News]] noted that her "iconic" high ponytail has received more attention than her fashion choices.<ref>{{cite news |last=Donahue |first=Anne T. |url=http://www.mtv.com/news/2869190/do-not-be-distracted-by-ariana-grandes-ponytail |title=Do Not Be Distracted by Ariana Grande's Ponytail |publisher=MTV News |date=April 18, 2016 |access-date=April 18, 2016 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319213326/http://www.mtv.com/news/2869190/do-not-be-distracted-by-ariana-grandes-ponytail/ }}</ref> Although Grande drew criticism for alleged impolite interactions with reporters and fans in 2014,<ref>{{cite magazine |url=https://www.billboard.com/music/pop/ariana-grande-controversies-6620402/ |title=Ariana Grande's Donut Video & 5 More Controversies |magazine=[[Billboard (magazine)|Billboard]] |date=July 8, 2015 |access-date=April 20, 2020 |archive-date=April 30, 2020 |archive-url=https://web.archive.org/web/20200430073405/https://www.billboard.com/articles/columns/pop-shop/6620402/ariana-grande-controversies |url-status=live}}</ref> she dismissed the reports as "weird, inaccurate depictions".<ref name=CoolDiva/> ''Rolling Stone'' wrote: "Some may cry 'diva', but it's also Grande just taking a stand to not allow others to control her image."<ref>{{cite magazine |last=Castillo |first=Arielle |url=https://www.rollingstone.com/music/pictures/ariana-grande-five-great-scandals-20160518/ariana-vs-the-press-2014-20160518 |title=Ariana Grande: Five Great 'Scandals' – Ariana vs. the Press, 2014 |magazine=[[Rolling Stone]] |date=May 18, 2016 |access-date=August 24, 2017 |archive-date=October 25, 2017 |archive-url=https://web.archive.org/web/20171025190012/https://www.rollingstone.com/music/pictures/ariana-grande-five-great-scandals-20160518/ariana-vs-the-press-2014-20160518 }}</ref> In July 2015, Grande sparked controversy after being seen on surveillance video in a doughnut shop licking doughnuts that were on display and saying "I hate Americans. I hate America. This is disgusting", referring to a tray of doughnuts.<ref>{{cite magazine |last=Lipshutz |first=Jason |url=https://www.billboard.com/music/pop/demi-lovato-ariana-grande-mlb-all-star-game-concert-6620351/ |title=Demi Lovato to Replace Ariana Grande at MLB All-Star Game Concert |magazine=[[Billboard (magazine)|Billboard]] |date=July 8, 2015 |access-date=April 20, 2020 |archive-date=January 31, 2020 |archive-url=https://web.archive.org/web/20200131031812/https://www.billboard.com/articles/columns/pop-shop/6620351/demi-lovato-ariana-grande-mlb-all-star-game-concert |url-status=live}}; and {{cite news |last=Yahr |first=Emily |url=https://www.washingtonpost.com/blogs/style-blog/wp/2015/07/08/ariana-grandes-doughnut-scandal-is-an-important-reminder-the-cameras-are-always-watching |title=Ariana Grande's doughnut scandal is an important reminder: The cameras are always watching |newspaper=The Washington Post |date=July 8, 2015 |access-date=August 24, 2017 |archive-date=July 12, 2015 |archive-url=https://web.archive.org/web/20150712164002/http://www.washingtonpost.com/blogs/style-blog/wp/2015/07/08/ariana-grandes-doughnut-scandal-is-an-important-reminder-the-cameras-are-always-watching/ |url-status=live}}</ref> She subsequently apologized, saying that she is "extremely proud to be an American" and that her comments rather referred to [[obesity in the United States]].<ref>{{cite news |last=Ramisetti |first=Kirthana |url=http://www.nydailynews.com/entertainment/gossip/ariana-grande-cancels-mlb-concert-video-backlash-article-1.2285483 |title=Ariana Grande apologizes for 'I hate America' comments in video: 'I am extremely proud to be an American' |newspaper=New York Daily News |date=July 8, 2015 |access-date=July 8, 2015 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319213303/https://www.nydailynews.com/entertainment/gossip/ariana-grande-cancels-mlb-concert-video-backlash-article-1.2285483 |url-status=live}}</ref> She later released a video apology for "behaving poorly".<ref>{{cite magazine |last=Strecker |first=Erin |url=https://www.billboard.com/music/pop/ariana-grande-apology-video-america-6627181/ |title=Ariana Grande Shares Apology Video: 'I'm Going to Learn From My Mistakes' |magazine=[[Billboard (magazine)|Billboard]] |date=July 9, 2015 |access-date=April 20, 2020 |archive-date=April 30, 2020 |archive-url=https://web.archive.org/web/20200430073617/https://www.billboard.com/articles/columns/pop-shop/6627181/ariana-grande-apology-video-america |url-status=live}}</ref> The incident was parodied by ''[[The Muppets (TV series)|The Muppets]]''.<ref>{{cite web |last=Gomez |first=Patrick |url=http://www.people.com/article/muppets-swedish-chef-ariana-grande-donut-video |archive-url=https://web.archive.org/web/20160514100428/http://www.people.com/article/muppets-swedish-chef-ariana-grande-donut-video |archive-date=2016-05-14 |title=''The Muppets''<nowiki/>' Swedish Chef Licks Doughnuts à la Ariana Grande |magazine=[[People (People)|People]] |date=October 11, 2015 |access-date=March 19, 2024}}</ref> Grande herself poked fun at the incident while hosting ''Saturday Night Live'' in 2016, saying, "A lot of kid stars end up doing drugs, or in jail, or pregnant, or get caught licking a doughnut they didn't pay for."<ref name="Savage"/><ref>{{cite magazine |url=https://www.billboard.com/articles/columns/pop/7246933/ariana-grande-scandal-snl-monologue-watch |title=Ariana Grande Sings About Wanting an Adult Scandal in 'SNL' Monologue |magazine=[[Billboard (magazine)|Billboard]] |date=March 13, 2016 |access-date=April 20, 2020 |archive-date=August 19, 2020 |archive-url=https://web.archive.org/web/20200819165649/https://www.billboard.com/articles/columns/pop/7246933/ariana-grande-scandal-snl-monologue-watch }}</ref> In 2020, she admitted to refraining from interviews for a while out of fear of being labeled a "diva" and that her words would be misconstrued.<ref>{{cite web |last=Ahlgrim |first=Callie |title=Ariana Grande says being called a diva forced her to 'quiet down a little bit' and stop doing interviews |url=https://www.insider.com/ariana-grande-diva-sexism-interviews-apple-music-zane-lowe-2020-5 |access-date=July 6, 2020 |publisher=Insider Inc. |date=February 9, 2019 |archive-date=May 25, 2024 |archive-url=https://web.archive.org/web/20240525093742/https://www.businessinsider.com/ariana-grande-diva-sexism-interviews-apple-music-zane-lowe-2020-5 |url-status=live}}</ref> With a large following on social media, Grande is one of the most influential celebrities on the internet.<ref>{{cite web |last=Jensen |first=Erin |title=Harry and Meghan, Ariana Grande on Time's list of most influential people on the internet |url=https://usatoday.com/story/entertainment/celebrities/2019/07/16/ariana-grande-duchess-meghan-among-most-influential-internet/1743191001/ |access-date=August 9, 2022 |website=Today |archive-date=May 24, 2022 |archive-url=https://web.archive.org/web/20220524011639/https://www.usatoday.com/story/entertainment/celebrities/2019/07/16/ariana-grande-duchess-meghan-among-most-influential-internet/1743191001/ |url-status=live}}</ref><ref name="amassed">{{cite magazine |last=Duboff |first=Josh |date=March 9, 2017 |title=How Ariana Grande Amassed Her 100 Million Instagram Followers |url=https://www.vanityfair.com/style/2017/03/ariana-grande-instagram-analysis-social-studies |access-date=March 16, 2017 |magazine=[[Vanity Fair (magazine)|Vanity Fair]] |archive-date=August 8, 2020 |archive-url=https://web.archive.org/web/20200808052845/https://www.vanityfair.com/style/2017/03/ariana-grande-instagram-analysis-social-studies |url-status=live}}</ref> {{As of|2025|{{CURRENTMONTHNAME}}}}, her YouTube channel has over 57 million subscribers, making her the [[List of most-subscribed YouTube channels|third-most-subscribed female solo act and fourth-most-subscribed woman]] on the platform.<ref name="ytsubs">{{Cite web |title=YouTube Records: All-Time Most Subscribed Official Artist Channel |url=https://www.youtube.com/trends/records/?record=most-subscribed-artists/ |access-date=September 17, 2024 |publisher=[[YouTube|YouTube Culture and Trends]]}}</ref> Her channel has received over 31 billion views; eight of Grande's music videos have over one billion views on YouTube,<ref>{{cite web |title=Ariana Grande |url=https://www.youtube.com/user/osnapitzari/about |access-date=September 18, 2025 |via=YouTube}}{{cbignore}}</ref><ref name="focus1bn">{{Cite magazine |last=Dailey |first=Hannah |date=March 13, 2024 |title=Ariana Grande's 'Focus' Music Video Surpasses 1 Billion Views on YouTube |url=https://www.billboard.com/music/music-news/ariana-grande-focus-music-video-one-billion-views-you-tube-1235632113/ |access-date=September 17, 2024 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> of which two have surpassed two billion views,<ref name="bangbang2bn">{{Cite web |date=July 3, 2024 |title="Bang Bang" into the record books: Jessie/Ari/Nicki collab hits new YouTube milestone |url=https://www.ks95.com/bang-bang-into-the-record-books-jessie-ari-nicki-collab-hits-new-youtube-milestone/ |access-date=October 9, 2024 |publisher=[[KSTP-FM]]}}</ref> with her highest-viewed video having over 2.4 billion views.<ref>{{Cite AV media |url=https://youtube.com/watch/SXiSVQZLje8/ |title=Ariana Grande ft. Nicki Minaj – Side to Side (Official Video) |date=August 30, 2016 |last=Grande |first=Ariana |type=Music video |access-date=October 9, 2024 |via=YouTube}}</ref> Her Spotify profile has over 110 million followers,<ref>{{cite web |title=Ariana Grande |url=https://open.spotify.com/artist/66CXWjxzNUsdJxJ2JdwvnR |access-date=September 17, 2025 |via=Spotify}}</ref> making her the [[List of most-streamed artists on Spotify#Most followers|seventh-most-followed artist and third-most-followed woman]].<ref name=":0"/> She is the [[List of most-followed Instagram accounts|sixth-most-followed individual on Instagram]],<ref>{{Cite magazine |date=September 23, 2024 |title=The 10 most followed Instagram accounts in the world in 2024 |url=https://www.forbesindia.com/article/explainers/most-followed-instagram-accounts-world/85649/1 |access-date=October 19, 2024 |magazine=[[Forbes India]]}}</ref> and was the first woman to surpass 150 million and 200 million followers on the platform.<ref>{{Cite magazine |last=Eldor |first=Karin |date=March 31, 2019 |title=Ariana Grande Is The New Queen Of Instagram: What Can We Learn From Her Strategy? |url=https://www.forbes.com/sites/karineldor/2019/03/31/ariana-grande-is-the-new-queen-of-instagram-what-can-we-learn-from-her-strategy/ |access-date=October 9, 2024 |magazine=Forbes}}</ref><ref>{{Cite magazine |last=Harmata |first=Claudia |date=August 31, 2020 |title=Ariana Grande Becomes First Woman to Reach 200 Million Followers on Instagram |url=https://people.com/music/ariana-grande-first-woman-to-reach-200-million-followers-instagram/ |access-date=October 9, 2024 |magazine=[[People (magazine)|People]]}}</ref> She was the most-followed woman on the platform from February 2019 to January 2022.<ref>{{Cite news |last=Ng |first=Kate |date=January 13, 2022 |title=Kylie Jenner is the first woman to reach 300m Instagram followers |url=https://www.independent.co.uk/life-style/kylie-jenner-300-million-instagram-followers-b1992320.html |access-date=October 19, 2024 |newspaper=[[The Independent]]}}</ref><ref>{{Cite news |last=Yan |first=Lim Ruey |date=September 2, 2020 |title=Singer Ariana Grande is the most followed woman on Instagram |url=https://www.straitstimes.com/lifestyle/entertainment/singer-ariana-grande-is-the-most-followed-woman-on-instagram |access-date=October 19, 2024 |newspaper=[[The Straits Times]]}}</ref> In December 2021, Grande deleted her Twitter account, which was one of the most-followed accounts on the platform.<ref>{{Cite magazine |last=Wynne |first=Kelly |date=December 24, 2021 |title=Ariana Grande Deletes Twitter Account, Shares Christmas Wishes on Instagram |url=https://people.com/music/ariana-grande-deletes-twitter-account-shares-christmas-wishes-on-instagram/ |access-date=October 19, 2024 |magazine=[[People (magazine)|People]]}}</ref><ref>{{Cite magazine |last=Mulshine |first=Molly |date=April 26, 2022 |title=How Twitter Became Celebrities' Least Favorite Social Platform |url=https://www.newsweek.com/twitter-celebrities-least-favorite-social-platform-elon-musk-buy-1701104 |access-date=October 19, 2024 |magazine=[[Newsweek]]}}</ref> She explained that she "always wanted to say things to [her] fans that were meant for just [her] fans [...] sometimes it would travel in a way that it wasn't intended to [...] where people who don't speak our language would kind of become involved in a weird, strange way. I think I was just so sensitive [and] it started taking toll on my relationship to work. I wanted to prioritize being an artist and having a healthy relationship to my fans and to art".<ref name="elletwitter">{{Cite magazine |last=Bailey |first=Alyssa |date=July 9, 2024 |title=Ariana Grande on Why She Quit Twitter and Chooses Not to Respond to Comments About Her |url=https://www.elle.com/culture/celebrities/a61546061/ariana-grande-shut-up-evan-interview/ |access-date=October 19, 2024 |magazine=[[Elle (magazine)|Elle]]}}</ref> Often regarded as a [[pop icon]] and [[wikt:triple threat|triple threat]] entertainer,<ref>{{cite web |date=October 27, 2021 |title=How Ariana Grande Went From Nickelodeon Star to Pop Icon |url=https://www.yahoo.com/lifestyle/ariana-grande-went-nickelodeon-star-145446469.html |access-date=October 31, 2021 |publisher=[[Yahoo]] |archive-date=November 1, 2021 |archive-url=https://web.archive.org/web/20211101162940/https://www.yahoo.com/amphtml/lifestyle/ariana-grande-went-nickelodeon-star-145446469.html |url-status=live}}</ref><ref>{{cite magazine |date=March 29, 2022 |title=Women's History Month: Triple Threat Female Artists Who Sing, Write, and Act (Part 2) |url=https://americansongwriter.com/womens-history-month-triple-threat-female-artists-who-sing-write-and-act-part-2/ |access-date=June 25, 2022 |magazine=[[American Songwriter]] |archive-date=June 25, 2022 |archive-url=https://web.archive.org/web/20220625192844/https://americansongwriter.com/womens-history-month-triple-threat-female-artists-who-sing-write-and-act-part-2/ |url-status=live}}</ref> [[wax figure]]s of Grande are found at [[Madame Tussauds]] museums in various cities around the world, including [[New York City]],<ref>{{cite news |title=At Madame Tussauds New York, attend the "Met Gala" with "Katy Perry," "Lady Gaga," "Justin Bieber" and more |url=https://www.wrmf.com/at-madame-tussauds-new-york-attend-the-met-gala-with-katy-perry-lady-gaga-justin-bieber-and-more/ |access-date=December 3, 2022 |work=97.9 WRMF |date=June 23, 2022 |archive-date=December 3, 2022 |archive-url=https://web.archive.org/web/20221203023632/https://www.wrmf.com/at-madame-tussauds-new-york-attend-the-met-gala-with-katy-perry-lady-gaga-justin-bieber-and-more/ |url-status=live}}</ref> [[Orlando, Florida]],<ref>{{cite magazine |last1=Aniftos |first1=Rania |title=Ariana Grande Gets Madame Tussauds Wax Figure in Orlando |url=https://www.billboard.com/music/pop/ariana-grande-madame-tussauds-wax-figure-orlando-1235042845/ |access-date=December 3, 2022 |magazine=[[Billboard (magazine)|Billboard]] |date=March 10, 2022 |archive-date=December 3, 2022 |archive-url=https://web.archive.org/web/20221203023626/https://www.billboard.com/music/pop/ariana-grande-madame-tussauds-wax-figure-orlando-1235042845/ |url-status=live}}</ref> [[Amsterdam]],<ref>{{cite news |last1=Westland |first1=Evie |title=Ariana Grande in Madame Tussauds Amsterdam |url=https://www.metronieuws.nl/in-het-nieuws/binnenland/2017/04/ariana-grande-in-madame-tussauds-amsterdam/ |access-date=December 3, 2022 |work=Metronieuws.nl |date=April 6, 2017 |language=nl |archive-date=December 3, 2022 |archive-url=https://web.archive.org/web/20221203023628/https://www.metronieuws.nl/in-het-nieuws/binnenland/2017/04/ariana-grande-in-madame-tussauds-amsterdam/ |url-status=live}}</ref> [[Bangkok]],<ref>{{cite news |title=Ariana melts hearts in wax |url=https://www.nationthailand.com/life/30357430 |access-date=December 3, 2022 |work=The Nation Thailand |date=October 29, 2018 |archive-date=December 3, 2022 |archive-url=https://web.archive.org/web/20221203023642/https://www.nationthailand.com/life/30357430 |url-status=live}}</ref> [[Sydney]],<ref>{{cite web |title=Ariana Grande's Madame Tussauds Wax Figure Brutally Mocked |date=December 13, 2023 |url=https://www.newsweek.com/ariana-grande-madame-tussauds-wax-figure-sydney-1851981 |work=Newsweek |access-date=December 14, 2023 |archive-date=December 14, 2023 |archive-url=https://web.archive.org/web/20231214043606/https://www.newsweek.com/ariana-grande-madame-tussauds-wax-figure-sydney-1851981 |url-status=live}}</ref> [[Berlin]],<ref>{{cite web |title=Ariana Grande bekommt Wachsfigur bei Madame Tussauds |date=May 7, 2021 |url=https://www.bz-berlin.de/archiv-artikel/ariana-grande-bekommt-neue-wachsfigur-bei-madame-tussauds |publisher=BZ-Berlin |access-date=December 14, 2023 |archive-date=December 14, 2023 |archive-url=https://web.archive.org/web/20231214170153/https://www.bz-berlin.de/archiv-artikel/ariana-grande-bekommt-neue-wachsfigur-bei-madame-tussauds |url-status=live}}</ref> [[London]],<ref>{{cite web |title=Ariana Grande |url=https://www.madametussauds.com/london/whats-inside/zones/impossible-festival/ariana-grande/ |publisher=Madame Tussauds London |access-date=April 6, 2024 |archive-date=April 6, 2024 |archive-url=https://web.archive.org/web/20240406182938/https://www.madametussauds.com/london/whats-inside/zones/impossible-festival/ariana-grande/ |url-status=live}}</ref> [[Vienna]],<ref>{{cite web |title=Ariana Grande |url=https://www.madametussauds.com/wien/themenbereiche/musik/ariana-grande/ |publisher=Madame Tussauds Vienna |access-date=April 6, 2024 |archive-date=April 6, 2024 |archive-url=https://web.archive.org/web/20240406155916/https://www.madametussauds.com/wien/themenbereiche/musik/ariana-grande/ |url-status=live}}</ref> [[Hollywood, Los Angeles|Hollywood]],<ref>{{cite magazine |title=Ariana Grande Wax Figure at Madame Tussauds Hollywood |url=https://www.billboard.com/music/pop/ariana-grande-wax-figure-madame-tussauds-hollywood-9568495/ |magazine=[[Billboard (magazine)|Billboard]] |access-date=April 6, 2024 |archive-date=October 4, 2023 |archive-url=https://web.archive.org/web/20231004062410/https://www.billboard.com/music/pop/ariana-grande-wax-figure-madame-tussauds-hollywood-9568495/ |url-status=live}}</ref> [[Hong Kong]],<ref>{{cite web |title=Sing with Ariana Grande at Madame Tussauds Hong Kong |url=https://www.madametussauds.com/hong-kong/en/information/latest-news/attention-to-all-arianators-calling-you-to-sing-with-your-idol-this-summer/ |publisher=Madame Tussauds Hong Hong |access-date=April 6, 2024 |archive-date=April 6, 2024 |archive-url=https://web.archive.org/web/20240406162920/https://www.madametussauds.com/hong-kong/en/information/latest-news/attention-to-all-arianators-calling-you-to-sing-with-your-idol-this-summer/ |url-status=live}}</ref> and [[Blackpool]].<ref>{{cite web |title=Ariana Grande at Madame Tussauds Blackpool |url=https://www.madametussauds.com/blackpool/information/latest-news/ariana-makes-a-grande-appearance/ |publisher=Madame Tussauds Blacpool |access-date=April 6, 2024 |archive-date=April 6, 2024 |archive-url=https://web.archive.org/web/20240406160643/https://www.madametussauds.com/blackpool/information/latest-news/ariana-makes-a-grande-appearance/ |url-status=live}}</ref> == Recognition == {{Main|List of awards and nominations received by Ariana Grande}} [[File:Ariana Grande (32426961944) (cropped).jpg|thumb|upright|Grande performing on the [[Dangerous Woman Tour]]|alt=Grande in 2017]] In 2016 and 2019, Grande was named one of ''Time''{{'}}s [[Time 100|100 most influential people in the world]].<ref name="Time100"/><ref name="Time100-2019">{{cite magazine |last=Sivan |first=Troye |author-link=Troye Sivan |date=April 17, 2019 |title=The World's Most Influential People: Ariana Grande |url=https://time.com/collection/100-most-influential-people-2019/5567873/ariana-grande/ |magazine=[[Time (magazine)|Time]] |access-date=April 17, 2019 |archive-date=March 21, 2020 |archive-url=https://web.archive.org/web/20200321114131/https://time.com/collection/100-most-influential-people-2019/5567873/ariana-grande/}}</ref> In 2017, Celia Almeida of the ''[[Miami New Times]]'' wrote that of all the biggest pop stars of the past 20 years, Grande made the most convincing transition "from ingénue to an independent female artist".<ref>{{cite web |last=Almeida |first=Celia |date=April 11, 2017 |title=Ariana Grande Is Not Your Sex Kitten |url=http://www.miaminewtimes.com/music/ariana-grande-dangerous-woman-tour-at-american-airlines-arena-april-14-9268375 |work=[[Miami New Times]] |access-date=April 12, 2017 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319213253/https://www.miaminewtimes.com/music/ariana-grande-dangerous-woman-tour-at-american-airlines-arena-april-14-9268375 |url-status=live}}</ref> [[Bloomberg News]] named her the "first pop diva of the streaming generation" in 2020.<ref>{{cite news |last=Shaw |first=Lucas |date=December 11, 2020 |title=Ariana Grande Is the Biggest Pop Star in the World |url=https://www.bloomberg.com/graphics/pop-star-ranking/2020-december/ariana-grande-is-the-biggest-pop-star-in-the-world.html |publisher=[[Bloomberg News]] |access-date=December 14, 2020 |archive-date=December 11, 2020 |archive-url=https://web.archive.org/web/20201211222456/https://www.bloomberg.com/graphics/pop-star-ranking/2020-december/ariana-grande-is-the-biggest-pop-star-in-the-world.html |url-status=live}}</ref> Regarded as a [[pop icon]], Grande was nicknamed "[[Princess of Pop]]" by ''[[Guinness World Records]]''.<ref>{{Cite web |date=February 2, 2021 |title=Ariana Grande shatters her 20th Guinness World Records title following success of hit single 'Positions' |url=https://www.guinnessworldrecords.com/news/2021/2/ariana-grande-shatters-20th-guinness-world-records-title-following-success-of-hit-647433 |url-status=live |archive-url=https://web.archive.org/web/20210202165717/https://www.guinnessworldrecords.com/news/2021/2/ariana-grande-shatters-20th-guinness-world-records-title-following-success-of-hit-647433 |archive-date=February 2, 2021 |access-date=July 29, 2023 |website=[[Guinness World Records]]}}</ref> Due to her 2014 song "Santa Tell Me" becoming a 21st-century Christmas standard and having a lasting impact, Grande was dubbed the "Princess of Christmas".<ref>{{Cite magazine |date=December 22, 2021 |title=Camila Cabello Heats the White House With 'I'll Be Home For Christmas' Performance: Watch |url=https://www.billboard.com/music/latin/camila-cabello-white-house-christmas-performance-1235013252/ |access-date=November 20, 2022 |magazine=[[Billboard (magazine)|Billboard]]}}</ref><ref>{{Cite magazine |last=Bell |first=Sadie |date=November 28, 2023 |title=Ariana Grande Celebrates 'Santa Tell Me' Anniversary by Sharing Behind-the-Scenes Footage: 'Tis the Season!' |url=https://people.com/ariana-grande-celebrates-santa-tell-me-anniversary-tiktok-8407591 |access-date=December 17, 2023 |magazine=[[People (magazine)|People]]}}</ref> Grande was also included in ''[[Pitchfork (website)|Pitchfork]]'s'' list of "The 200 Most Important Artists of Pitchfork's First 25 Years" for "emerging with music that pushed her artistry further as it asserted a magical trifecta of hope, joy, and a powerhouse voice".<ref>{{cite web |date=October 4, 2021 |title=The 200 Most Important Artists of Pitchfork's First 25 Years |url=https://pitchfork.com/features/lists-and-guides/most-important-artists/ |website=[[Pitchfork (website)|Pitchfork]] |access-date=October 4, 2021 |archive-date=July 30, 2022 |archive-url=https://web.archive.org/web/20220730052606/https://pitchfork.com/features/lists-and-guides/most-important-artists/ |url-status=live}}</ref> Her song "Thank U, Next" was ranked number 137 in ''Rolling Stone''{{'s}} 2021 revision of their [[500 Greatest Songs of All Time]],<ref>{{cite magazine |date=September 15, 2021 |title=The 500 Greatest Songs of All Time |url=https://www.rollingstone.com/music/music-lists/best-songs-of-all-time-1224767/ariana-grande-thank-u-next-5-1225201/ |url-status=live |archive-url=https://web.archive.org/web/20210915162053/https://www.rollingstone.com/music/music-lists/best-songs-of-all-time-1224767/ |archive-date=September 15, 2021 |access-date=October 5, 2021 |magazine=[[Rolling Stone]]}}</ref> while its parent album was ranked number 61 in their "250 Greatest Albums of the 21st Century".<ref>{{Cite magazine |date=January 10, 2025 |title=The 250 Greatest Albums of the 21st Century So Far |url=https://www.rollingstone.com/music/music-lists/best-albums-21st-century-1235177256/ariana-grande-thank-u-next-6-1235185233/ |access-date=January 11, 2025 |magazine=[[Rolling Stone]]}}</ref> In 2023, the magazine ranked Grande among the 200 Greatest Singers of All Time, at number 43.<ref name="200-greatest">{{cite magazine |url=https://www.rollingstone.com/music/music-lists/best-singers-all-time-1234642307/ariana-grande-8-1234643145/ |date=January 1, 2023 |title=The 200 Greatest Singers of All Time |access-date=September 7, 2023 |magazine=[[Rolling Stone]] |archive-date=July 19, 2023 |archive-url=https://web.archive.org/web/20230719045545/https://www.rollingstone.com/music/music-lists/best-singers-all-time-1234642307/ariana-grande-8-1234643145/ |url-status=live}}</ref> ''[[The Hollywood Reporter]]'' named her as one of its "Platinum Power Players" in music in 2024.<ref>{{Cite magazine |last=Fekadu |first=Mesfin |date=September 6, 2024 |title=Music's Platinum Players: From Beyoncé to Chappell Roan, Meet the 25 Stars Who Are Setting the Culture Afire |url=https://www.hollywoodreporter.com/lists/music-power-players-2024/ariana-grande/ |access-date=October 11, 2024 |magazine=[[The Hollywood Reporter]]}}</ref> In May that year, [[Katy Perry]] declared Grande to be "the best singer of our generation".<ref name="Ledbetter_5/23/20242">{{cite web |last=Ledbetter |first=Carly |date=May 23, 2024 |title=Katy Perry Praises The 'Best Singer Of Our Generation' |url=https://www.huffpost.com/entry/katy-perry-ariana-grande-voice-generation_n_664f440ae4b042129b89ca7b |access-date=May 24, 2024 |newspaper=[[HuffPost]]}}</ref> ''Billboard'' ranked Grande at number nine on its 2024 "[[Billboard's Greatest Pop Stars of the 21st Century|Greatest Pop Stars of the 21st Century]]" list,<ref>{{cite magazine |last=Daw |first=Stephen |date=October 17, 2024 |title=''Billboard''{{'}}s Greatest Pop Stats of the 21st Century: No. 9 — Ariana Grande |url=https://www.billboard.com/music/pop/ariana-grande-greatest-pop-stars-21st-century-1235804073/ |access-date=October 17, 2024 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> and at number eight on its 2025 list of the "Top 100 Women Artists of the 21st Century".<ref>{{cite magazine |first1=Trevor |last1=Anderson |first2=Jim |last2=Asker |first3=Pamela |last3=Bustios |first4=Keith |last4=Caulfield |first5=Eric |last5=Frankenberg |first6=Kevin |last6=Rutherford |first7=Gary |last7=Trust |first8=Xander |last8=Zellner |date=March 19, 2025 |title=''Billboard''<nowiki/>'s Top 100 Women Artists of the 21st Century Chart: Nos. 100-1 |url=https://www.billboard.com/lists/top-women-artists-21st-century-chart/no-8-ariana-grande/ |access-date=March 19, 2025 |magazine=[[Billboard (magazine)|Billboard]] |archive-url=https://web.archive.org/web/20250319183615/https://www.billboard.com/lists/top-women-artists-21st-century-chart/ |url-status=live |archive-date=March 19, 2025}}</ref> The magazine ranked her album ''Thank U, Next'' at number 144 out of 200 on its "Top 200 ''Billboard'' 200 Albums of the 21st Century" in 2025.<ref>{{Cite magazine |date=January 9, 2025 |title=Top ''Billboard'' 200 Albums of the 21st Century |url=https://www.billboard.com/charts/top-billboard-200-albums-of-the-21st-century/ |access-date=December 27, 2025 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> Recording artists who have cited Grande as an influence or inspiration include <!-- Artists' names are arranged in alphabetical order; [[WP:NEUTRAL]].--> [[Billie Eilish]],<ref>{{cite web |title=Ariana sei Dank – Billie Eilish hat wieder Lust auf Musik |url=https://www.zeit.de/zustimmung?url=https%3A%2F%2Fwww.zeit.de%2Fnews%2F2019-08%2F19%2Fariana-sei-dank-billie-eilish-hat-wieder-lust-auf-musik |work=Die Zeit |access-date=August 19, 2019 |archive-date=January 8, 2022 |archive-url=https://web.archive.org/web/20220108160623/https://www.zeit.de/zustimmung?url=https%3A%2F%2Fwww.zeit.de%2Fnews%2F2019-08%2F19%2Fariana-sei-dank-billie-eilish-hat-wieder-lust-auf-musik }}</ref> [[Breanna Yde]],<ref>{{cite web |title=YDE Talks About Her New EP 'Send Help', Taking Inspiration From Olivia Rodrigo, Ariana Grande, Miley Cyrus & More |date=September 9, 2022 |url=https://www.yahoo.com/entertainment/yde-talks-her-ep-send-222227240.html |publisher=[[Yahoo!]] |access-date=January 22, 2023}}</ref> [[Bryson Tiller]],<ref>{{cite web |title=Bryson Tiller Announces A 'Special' Christmas Project Inspired By Justin Bieber And Ariana Grande |date=November 10, 2021 |url=https://uproxx.com/music/bryson-tiller-announces-a-different-chrtistmas/ |website=[[Uproxx]] |access-date=January 22, 2023}}</ref> [[Chappell Roan]],<ref>{{Cite magazine |last=Dailey |first=Hannah |date=August 29, 2024 |title=Chappell Roan Praises Ariana Grande's 'Eternal Sunshine', Reveals She's 'So Excited' for 'Wicked' |url=https://www.billboard.com/music/music-news/chappell-roan-praises-ariana-grande-wicked-1235763528/ |access-date=September 17, 2024 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> [[Charlie Puth]],<ref>{{cite web |title=Charlie Puth: Inspiration durch Ariana Grande |date=May 10, 2018 |url=https://www.rtl.de/cms/charlie-puth-inspiration-durch-ariana-grande-4160617.html |publisher=[[RTL Group]] |access-date=January 22, 2023 |archive-date=January 22, 2023 |archive-url=https://web.archive.org/web/20230122122244/https://www.rtl.de/cms/charlie-puth-inspiration-durch-ariana-grande-4160617.html }}</ref> [[Giselle (singer)|Giselle]] of [[Aespa]],<ref>{{cite magazine |title='The First Time': Aespa Talks Inspiration From Fashion, Harry Styles, Grimes, Ariana Grande |date=December 2, 2021 |url=https://www.rollingstone.com/music/music-news/the-first-time-aespa-1266093/ |magazine=[[Rolling Stone]] |access-date=January 22, 2023}}</ref> [[Grace VanderWaal]],<ref>{{cite magazine |title=Grace VanderWaal Fangirls Over Ariana Grande, Talks Tour With Imagine Dragons on BBMA Red Carpet: Watch |date=May 21, 2018 |url=https://www.billboard.com/music/awards/grace-vanderwaal-interview-ariana-grande-imagine-dragons-tour-8457114/ |magazine=[[Billboard (magazine)|Billboard]] |access-date=January 22, 2023}}</ref> [[Jungkook]] of [[BTS]],<ref>{{cite web |title=BTS' Jungkook says watching Ariana Grande perform live "really stayed" with him |date=May 18, 2021 |url=https://www.nme.com/news/music/bts-jungkook-ariana-grande-inspired-him-to-grow-2942958 |work=[[NME]] |access-date=May 18, 2021 |archive-date=May 18, 2021 |archive-url=https://web.archive.org/web/20210518074850/https://www.nme.com/news/music/bts-jungkook-ariana-grande-inspired-him-to-grow-2942958 |url-status=live}}</ref> [[Lana Del Rey]],<ref>{{cite magazine |title=Lana Del Rey stans Ariana Grande |date=October 16, 2019 |url=https://www.wmagazine.com/story/lana-del-rey-compliments-ariana-grande-stans/ |magazine=[[W (magazine)|W]] |access-date=January 30, 2023}}</ref> [[Madison Beer]],<ref name="StopCopy">{{cite web |url=https://www.capitalfm.com/news/madison-beer-ariana-grande-copying-claims/ |title=Madison Beer Asks People To Stop The 'Hurtful' Ariana Grande 'Copying' Claims |publisher=[[Capital (radio network)|Capital FM]] |date=November 19, 2020 |access-date=April 1, 2021 |archive-date=June 12, 2021 |archive-url=https://web.archive.org/web/20210612232815/https://www.capitalfm.com/news/madison-beer-ariana-grande-copying-claims/ |url-status=live}}</ref> [[Maggie Lindemann]],<ref>{{cite web |title=Interview: Maggie Lindemann Is Out To Inspire The Next Generation Of Women |date=January 20, 2017 |url=https://www.iheart.com/content/2017-01-20-interview-maggie-lindemann-is-out-to-inspire-the-next-generation-of-women/ |publisher=[[iHeartRadio]] |access-date=January 22, 2023}}</ref> [[Meghan Trainor]],<ref>{{cite magazine |title=Meghan Trainor Is All About that Bass, T-Pain, and Drunk Texting |date=September 10, 2014 |url=https://www.out.com/entertainment/music/2014/09/10/meghan-trainor-all-about-bass-t-pain-drunk-texting |magazine=Out |access-date=September 10, 2014 |archive-date=April 2, 2019 |archive-url=https://web.archive.org/web/20190402233520/https://www.out.com/entertainment/music/2014/09/10/meghan-trainor-all-about-bass-t-pain-drunk-texting |url-status=live}}</ref> [[Melanie Martinez]],<ref>{{cite magazine |title=Melanie Martinez on 'Cry Baby,' Not Wanting to Be a Role Model & What She Learned From 'The Voice' |url=https://www.billboard.com/media/videos/melanie-martinez-cry-baby-role-model-the-voice-6685879/ |magazine=[[Billboard (magazine)|Billboard]] |access-date=April 4, 2015 |archive-date=April 12, 2022 |archive-url=https://web.archive.org/web/20220412205245/https://www.billboard.com/media/videos/melanie-martinez-cry-baby-role-model-the-voice-6685879/ |url-status=live}}</ref> [[Michelle Zauner]] of [[Japanese Breakfast]],<ref>{{cite web |title=Japanese Breakfast's Michelle Zauner On Her Wild Year And Winning The 2021 Uproxx Music Critics Poll |date=December 16, 2021 |url=https://uproxx.com/indie/japanese-breakfast-interview-2021-critics-poll/ |website=[[Uproxx]] |access-date=January 22, 2023}}</ref> [[Sufjan Stevens]],<ref>{{cite magazine |title=Sufjan Stevens on Making Pop Music in a Crisis |date=September 24, 2020 |url=https://www.vanityfair.com/style/2020/09/sufjan-stevens-the-ascension-interview |magazine=[[Vanity Fair (magazine)|Vanity Fair]] |access-date=September 24, 2020 |archive-date=October 20, 2020 |archive-url=https://web.archive.org/web/20201020182127/https://www.vanityfair.com/style/2020/09/sufjan-stevens-the-ascension-interview |url-status=live}}</ref> [[Tate McRae]],<ref>{{cite web |url=https://youtube.com/watch?v=F-Dq7717bWw |title=Tate McRae Celebrates Going #1 With Greedy |publisher=Ask Anything Chat |via=[[YouTube]] |date=December 10, 2023 |access-date=December 10, 2023 |archive-date=December 10, 2023 |archive-url=https://web.archive.org/web/20231210214512/https://www.youtube.com/watch?v=F-Dq7717bWw |url-status=live}}</ref> [[Troye Sivan]],<ref>{{cite magazine |title=Troye Sivan Said Ariana Grande Is 'Breaking the Rules' in His Essay for Her Time 100 Honor |date=April 17, 2019 |url=https://www.teenvogue.com/story/troye-sivan-ariana-grande-essay-time-100 |magazine=Teen Vogue |access-date=September 17, 2019 |archive-date=May 11, 2019 |archive-url=https://web.archive.org/web/20190511095906/https://www.teenvogue.com/story/troye-sivan-ariana-grande-essay-time-100 |url-status=live}}</ref> and [[Zara Larsson]].<ref>{{cite web |url=https://nation.com.pk/26-Mar-2017/zara-larsson-inspired-by-beyonce |title=Zara Larsson inspired by Beyonce |date=March 25, 2017 |website=The Nation |access-date=January 22, 2023 |archive-date=December 7, 2020 |archive-url=https://web.archive.org/web/20201207060636/https://nation.com.pk/26-Mar-2017/zara-larsson-inspired-by-beyonce |url-status=live}}</ref> == Achievements == {{Main|List of awards and nominations received by Ariana Grande}} Grande has sold over 90 million records worldwide,<ref>{{Cite magazine |last1=Verhoeven |first1=Beatrice |date=December 4, 2024 |title='Wicked' Star Ariana Grande to Receive Rising Star Award at Palm Springs International Film Festival |url=https://www.hollywoodreporter.com/movies/movie-news/wicked-ariana-grande-rising-star-award-palm-springs-international-film-festival-1236076275/ |magazine=[[The Hollywood Reporter]] |access-date=September 20, 2025 |archive-date=December 8, 2024 |archive-url=https://web.archive.org/web/20241208015916/https://www.hollywoodreporter.com/movies/movie-news/wicked-ariana-grande-rising-star-award-palm-springs-international-film-festival-1236076275/ |url-status=live}}</ref> making her one of the [[List of best-selling music artists|best-selling music artists]] of all time. All of Grande's studio albums have been certified platinum or higher by the [[Recording Industry Association of America]] (RIAA) and have spent at least one year charting on the [[Billboard 200|''Billboard'' 200]] chart. Her highest-certified album by the RIAA is ''[[My Everything (Ariana Grande album)|My Everything]]'', at quadruple platinum,<ref>{{cite web |url=https://www.riaa.com/gold-platinum/?tab_active=default-award&se=Ariana+Grande |title=Ariana Grande |publisher=Recording Industry Association of America |access-date=September 17, 2024}}</ref> whilst her longest-charting album, ''Thank U, Next'', has spent 185 non-consecutive weeks on the chart.<ref>{{Cite magazine |date= |title=Ariana Grande (Chart History): ''Billboard'' 200 |url=https://www.billboard.com/artist/ariana-grande/chart-history/tlp/ |access-date=September 17, 2024 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> Grande has accumulated 15 million albums and 124 million digital singles units as a lead artist in the United States,<ref name="RIAA Certifications">{{cite web |url=https://www.riaa.com/gold-platinum/?tab_active=default-award&ar=ARIANA+GRANDE&ti=&lab=&genre=&format=&date_option=release&from=&to=&award=&type=&category=&adv=SEARCH#search_section |title=RIAA Searchable Database: Ariana Grande |publisher=[[Recording Industry Association of America]] |access-date=March 24, 2026}}</ref> making her the 13th-highest-certified artist and fourth-highest-certified female artist on RIAA's [[List of highest-certified music artists in the United States#Top 50 certified music artists (digital singles)|Top Artists (Digital Singles)]] ranking.<ref>{{cite web |title=Gold & Platinum – Top Artists (Digital Singles) |url=https://www.riaa.com/gold-platinum/?tab_active=top_tallies&ttt=TAS |access-date=March 24, 2026 |publisher=[[Recording Industry Association of America]]}}</ref> With 139 million units combined (songs and albums), she is the 21st-highest-certified artist, overall, and sixth-highest among women.<ref name="RIAAranking">{{Cite web |title=Gold & Platinum — Artists |url=https://www.riaa.com/gold-platinum/?tab_active=awards_by_artist#search_section |access-date=March 24, 2026 |publisher=[[Recording Industry Association of America]] (RIAA)}}</ref> In the US, Grande has moved 22.4 million album units, and garnered over 23.6 billion streams across lead artist credits, as of 2023, according to [[Luminate (company)|Luminate]].<ref name="bbupdate">{{cite magazine |last1=Trust |first1=Gary |title='Such a Breath of Fresh Air': Ariana Grande's 'Yours Truly' Collaborators Reflect on 10 Years of Her Debut Album |url=https://www.billboard.com/music/pop/ariana-grande-yours-truly-collaborators-debut-album-anniversary-1235399838/ |magazine=[[Billboard (magazine)|Billboard]] |access-date=August 27, 2023 |date=August 25, 2023 |archive-url=https://web.archive.org/web/20230825153706/https://www.billboard.com/music/pop/ariana-grande-yours-truly-collaborators-debut-album-anniversary-1235399838/ |archive-date=August 25, 2023 |url-status=live}}</ref><ref>{{cite magazine |last=Haven |first=Lyndsey |date=December 10, 2023 |title=Ariana Grande Signs With New Management |url=https://www.billboard.com/business/management/ariana-grande-new-management-brandon-creed-good-world-1235549272/ |access-date=December 10, 2023 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> Two of her songs have been certified diamond by the RIAA: "Bang Bang" (with [[Jessie J]] and [[Nicki Minaj]]) and "7 Rings".<ref name=":1">{{Cite magazine |last=McIntyre |first=Hugh |date=February 14, 2025 |title=Ariana Grande Scores A New Diamond Single With One Of Her Classics |url=https://www.forbes.com/sites/hughmcintyre/2025/02/14/ariana-grande-scores-a-new-diamond-single-with-one-of-her-classics/ |access-date=February 22, 2025 |magazine=Forbes}}</ref> Having surpassed 98 billion streams globally as of 2021, Grande is one of the most-streamed artists of all time and was the first female artist to surpass 90 billion streams.<ref name="wickedcasting"/><ref>{{cite magazine |title=HYBE, Formerly Big Hit, Merges With Scooter Braun's Ithaca Holdings, Bringing Together BTS, Justin Bieber, Big Machine (EXCLUSIVE) |url=https://variety.com/2021/digital/news/hybe-formerly-big-hit-entertainment-acquires-scooter-brauns-ithaca-holdings-bringing-together-bts-justin-bieber-big-machine-1234943092/ |access-date=April 2, 2021 |magazine=[[Variety (magazine)|Variety]] |date=April 2, 2021}}</ref> She was the most-streamed female artist of the 2010s decade on [[Spotify]], being the only woman in the overall top five.<ref name="moststreamed2010s2"/> She was also the most-streamed female act of the 2010s decade on [[Apple Music]], and was the first female act to reach 3 billion total streams on the platform.<ref name="am_2010s">{{cite magazine |last=Burch |first=Sean |title=Ariana Grande Tops List of Most Streamed Female Artists on Apple Music (Exclusive) |url=https://www.thewrap.com/apple-music-most-streamed-females-ariana-grande-taylor-swift/ |access-date=November 17, 2023 |magazine=[[TheWrap]] |date=March 8, 2019}}</ref> In the US, Grande was the most-streamed female artist and fourth-most-streamed artist overall of the 2010s decade, across audio and video streams, being the only woman and non-rapper in the top five.<ref>{{Cite web |last=Zhang |first=Charlie |date=January 11, 2021 |title=Drake, Post Malone, Eminem and Others Named Most Streamed Artists of the 2010s |url=https://hypebeast.com/2021/1/drake-post-malone-eminem-future-most-streamed-artists-2010s-info/ |access-date=October 19, 2024 |publisher=[[Hypebeast (company)|Hypebeast]]}}</ref> She became the most-streamed female artist of all time on Spotify in 2020, surpassing [[Rihanna]], and held the record for over two years.<ref>{{cite magazine |last=Reilly |first=Nick |date=August 19, 2020 |title=Ariana Grande pleads with Rihanna to 'drop her album' after breaking streaming record |url=https://www.nme.com/news/music/ariana-grande-pleads-with-rihanna-to-drop-her-album-after-breaking-streaming-record-2732175 |access-date=August 20, 2024 |magazine=[[NME]]}}</ref> As of January 2026, Grande is the second-most-streamed woman and the sixth-most-streamed act on Spotify, with over 63 billion streams across all credits (including 52 billion streams as a lead artist). She is the second woman in the platform's history to surpass 60 billion total streams.<ref>{{cite web |last=Newman |first=Tom |date=October 24, 2024 |title=Top 10 most-streamed artists of all-time on Spotify in 2024 |url=https://routenote.com/blog/most-streamed-artists-all-time-spotify/ |access-date=December 17, 2024 |work=RouteNote}}</ref> Her songs and albums are [[List of most-streamed songs on Spotify|some of the most-streamed of all time]]. Grande became the first woman with one and two billion streams with one album,<ref>{{cite web |url=https://www.inquisitr.com/5358991/ariana-grande-2-billion-spotify-streams |title=Ariana Grande Becomes First Female Artist To Surpass 2 Billion Spotify Streams With Three Albums |website=[[Inquisitr]] |date=March 25, 2019}}</ref> 3.5 billion streams on three separate albums,<ref>{{cite web |url=https://www.nme.com/news/music/ariana-grande-first-female-artist-spotify-streams-three-albums-2604140/ |title=Ariana Grande becomes first female artist with 3.5 billion streams on three separate albums |website=[[NME]] |date=February 2, 2020}}</ref> and the first artist to have five albums with four billion streams.<ref>{{cite web |url=https://uproxx.com/pop/ariana-grande-positions-4-billion-spotify-streams/ |title=Ariana Grande's 'Positions' Surpassed 4 Billion Spotify Streams, Her Fifth Album To Do So |website=[[Uproxx]] |date=December 4, 2022}}</ref> Grande has 22 songs with over one billion streams on Spotify, making her the female artist with the most songs to have achieved the feat;<ref>{{cite web |title=BILLIONS CLUB |url=https://open.spotify.com/playlist/37i9dQZF1DX7iB3RCnBnN4 |access-date=July 27, 2025 |publisher=[[Spotify]]}}</ref> she was the first woman to have 22 songs surpass the mark.<ref>{{cite magazine |last=Madarang |first=Charisma |url=https://www.rollingstone.com/music/music-news/ariana-grande-spotify-billions-club-episode-watch-1234962711/ |title=Ariana Grande Reveals Why Her Label Didn't Approve Original 'Santa Tell Me' Video |magazine=[[Rolling Stone]] |date=February 6, 2024 |access-date=October 19, 2024}}</ref><ref>{{Cite news |last=Kessler |first=Siena |date=April 1, 2025 |title=Album review: Ariana Grande delivers emotional journey with 'Eternal Sunshine Deluxe: Brighter Days Ahead' |url=https://www.thelantern.com/2025/04/album-review-ariana-grande-delivers-emotional-journey-with-eternal-sunshine-deluxe-brighter-days-ahead/ |access-date=April 2, 2025 |work=[[The Lantern]] |quote=Grande became the first female artist to have 20 songs reach one billion streams each on Spotify — a feat that cements her as one of the most influential streaming artists of all time.}}</ref> In December 2025, she became her monthly listeners on Spotify surpassed 126.8 million monthly listeners, a new record for a female act.<ref>{{Cite web |last=Ileyah |date=December 26, 2025 |title=Ariana Grande Breaks All-Time Spotify Record for Monthly Listeners Among Female Artists |url=https://ratingsgamemusic.com/2025/12/26/ariana-grande-breaks-all-time-spotify-record-for-monthly-listeners-among-female-artists/ |access-date=December 27, 2025 |website=Ratings Game Music}}</ref> She has also topped Spotify's monthly listener ranking the most times (5) among women.<ref>{{Cite web |last=Galante |first=Grace |date=December 25, 2025 |title=Ariana Grande Breaks Spotify Record on Christmas Eve |url=https://parade.com/news/ariana-grande-breaks-spotify-record-christmas-eve/ |access-date=December 27, 2025 |website=[[Parade (magazine)|Parade]]}}</ref> Grande is the [[List of most-streamed artists on Spotify#Most-followed artists|seventh-most-followed artist and fourth-most-followed female artist]] on Spotify, with over 110 million followers;<ref name=":0">{{Cite web |title=Most Followed Artists on Spotify |url=https://volt.fm/most-followed-artists/ |access-date=January 6, 2026 |website=Volt.FM}}</ref> she is the fourth artist in the streaming service's history to surpass 100 million followers.<ref>{{Cite web |last=Newman |first=Tom |date=October 24, 2024 |title=The 10 biggest artists on Spotify in 2024 |url=https://routenote.com/blog/biggest-artists-on-spotify/ |access-date=November 16, 2024 |website=RouteNote}}</ref> Her 2014 single "Santa Tell Me" is the most-streamed Christmas song released in the 2010s—and third-most-streamed overall—on Spotify; the most successful holiday song released in the 21st century; and the eighth-most-popular holiday song of all time.<ref> * {{Cite web |last=Mulka |first=Angela |date=December 5, 2023 |title=These Christmas songs make the most money |url=https://www.bigrapidsnews.com/news/article/christmas-songs-that-earn-most-money-spotify-18535033.php |archive-url=https://web.archive.org/web/20231217125207/https://www.bigrapidsnews.com/news/article/christmas-songs-that-earn-most-money-spotify-18535033.php |archive-date=December 17, 2023 |access-date=December 17, 2023 |website=Big Rapids Pioneer}} * {{Cite magazine |last=Edwards |first=Clayton |date=December 9, 2024 |title=The 5 Highest-Earning Christmas Songs of the Streaming Age |url=https://americansongwriter.com/the-5-highest-earning-christmas-songs-streaming-age/ |access-date=December 23, 2024 |website=American Songwriter}} * {{Cite web |date=December 23, 2024 |title=Spotify reveals the most-streamed Christmas songs from each era and of all time |url=https://community.designtaxi.com/topic/7202-spotify-reveals-the-most-streamed-christmas-songs-from-each-era-and-of-all-time/ |access-date=December 23, 2024 |website=DesignTAXI Community: Creative Connections, Conversations and Collaborations}}</ref><ref>{{Cite magazine |last=[[People (magazine)|People]]s |first=Thomas |date=December 19, 2024 |title=The 25 Most Popular Christmas Songs Released in the Last 25 Years, Ranked by Streams & Sales |url=https://www.billboard.com/lists/most-popular-christmas-songs-21st-century-streams-sales/2-kelly-clarkson-underneath-the-tree-2010/ |access-date=December 27, 2024 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> Grande is the third-most-subscribed female soloist on YouTube, with over 57 million subscribers.<ref name="ytsubs"/> Eight of her music videos have surpassed over one billion views; two of them have received over two billion views on the app.<ref name="focus1bn"/><ref name="bangbang2bn"/> Grande has won three [[Grammy Award]]s,<ref>{{cite web |url=https://www.grammy.com/artists/ariana-grande/18441 |title=Ariana Grande {{!}} Artist |access-date=February 2, 2026 |website=grammy.com}}</ref> one [[Brit Award]],<ref>{{cite web |url=https://www.theguardian.com/music/2019/feb/20/full-list-of-brit-awards-2019-winners-as-they-happen |title=Full list of Brit awards 2019 winners – as they happen |website=[[The Guardian]] |date=February 20, 2019}}</ref> thirteen [[MTV Video Music Award]]s (the fifth-most wins among women),<ref>{{cite magazine |last=Green |first=Walden |date=September 7, 2025 |title=MTV VMAs 2025 Winners: See the Full List Here |url=https://pitchfork.com/news/mtv-vmas-2025-winners-see-the-full-list-here/ |magazine=[[Pitchfork (magazine)|Pitchfork]] |access-date=September 8, 2025}}</ref><ref>{{Cite web |last=Montgomery |first=Daniel |date=September 11, 2024 |title=VMAs biggest winners of all time: Taylor Swift, BTS and Beyonce among top MTV Video Music Awards champs ever |url=https://www.goldderby.com/gallery/most-vmas-biggest-winners-mtv-video-music-awards/ariana-grande-10/ |access-date=September 17, 2024 |publisher=GoldDerby}}</ref> three [[MTV Europe Music Awards]],<ref>{{cite web |last=Wright |first=Tolly |url=https://www.vulture.com/2016/11/canadians-win-big-at-2016-mtv-emas.html |title=MTV's 2016 European Music Awards Honored Europe's Favorite Singing Canadians |website=Vulture.com |date=November 6, 2016}}</ref> and three [[American Music Award]]s.<ref>{{cite web |last=Park |first=Andrea |url=https://www.cbsnews.com/news/amas-2016-highlights-and-winners-at-the-american-music-awards |title=AMAs 2016: Highlights and winners at the American Music Awards |publisher=CBS News |date=November 20, 2016}}</ref> She has received 42 [[Billboard Music Award|''Billboard'' Music Award]] nominations and won 2 in 2019, including [[Billboard Music Award for Top Female Artist|Top Female Artist]].<ref name="billboard_8509655"/> Grande has won eleven [[Nickelodeon Kids' Choice Awards]], including one in [[2014 Kids' Choice Awards|2014]] for [[Kids' Choice Award for Favorite Female TV Star|Favorite TV Actress]] for her performance on ''Sam & Cat'',<ref>{{cite news |last=Wahlberg |first=Mark |title=Nickelodeon's Kids' Choice Awards: The Winners |url=https://www.hollywoodreporter.com/news/kids-choice-awards-2014-winners-692089 |access-date=July 2, 2015 |work=The Hollywood Reporter |date=March 29, 2014}}</ref> and one in [[2025 Kids' Choice Awards|2025]] for [[Kids' Choice Award for Favorite Movie Actress|Favorite Movie Actress]] for her performance in ''Wicked''.<ref>{{cite magazine |last1=Grein |first1=Paul |title=Sabrina Carpenter, SZA, Ariana Grande Win Multiple Awards at 2025 Kids' Choice Awards (Full Winners List) |url=https://www.billboard.com/music/awards/2025-kids-choice-awards-winners-list-1236004651/ |access-date=June 22, 2025 |magazine=[[Billboard (magazine)|Billboard]] |date=June 21, 2025}}</ref> She has received three [[People's Choice Award]]s.<ref>{{cite news |url=http://www.mtv.com/news/1720133/peoples-choice-awards-2014-winners-list/ |archive-url=https://web.archive.org/web/20150107230536/http://www.mtv.com/news/1720133/peoples-choice-awards-2014-winners-list/ |archive-date=January 7, 2015 |title=2014 People's Choice Awards: The Complete Winners List |publisher=[[MTV]] |date=January 8, 2014 |access-date=January 31, 2014}}</ref> In 2014, she received the Breakthrough Artist of the Year Award from the Music Business Association<ref name=BillArtist13/> and Best Newcomer at the [[Bambi Awards]].<ref>{{cite web |title=Newcomer BAMBI goes to Ariana Grande |url=http://www.bambi-awards.com/newcomer-bambi-goes-to-ariana-grande/22249 |website=Bambi}}</ref> She has won six [[iHeartRadio Music Awards]]<ref>{{cite web |title=Ariana Grande Performs "Problem" ft. Iggy Azalea at the iHeartRadio Music Awards |url=http://news.iheart.com/articles/iheartradio-music-awards-483670/ariana-grande-performs-problem-ft-iggy-12310729/ |publisher=iHeartRadio |access-date=December 27, 2014 |archive-url=https://web.archive.org/web/20150706084430/http://news.iheart.com/articles/iheartradio-music-awards-483670/ariana-grande-performs-problem-ft-iggy-12310729/ |archive-date=July 6, 2015 }}</ref> and twelve [[Teen Choice Awards]].<ref>{{cite web |date=August 16, 2015 |title=2015 Teen Choice Award Winners – Full List |url=https://variety.com/2015/tv/news/teen-choice-awards-winners-2015-full-list-1201571268/ |access-date=August 17, 2015 |work=Variety}}</ref> She was named ''Billboard'' Women in Music's Rising Star in 2014<ref>{{cite magazine |last=Lynch |first=Joe |url=https://www.billboard.com/articles/events/women-in-music-2014/6405617/ariana-grande-rising-star-women-in-music |title=Women in Music's Rising Star Ariana Grande Shares Her Mother's Most Important Lesson |magazine=[[Billboard (magazine)|Billboard]] |date=December 12, 2014}}</ref> and [[Billboard Women in Music|Woman of the Year]] in 2018,<ref name="Aniftos">{{cite magazine |last=Aniftos |first=Rania |url=https://www.billboard.com/articles/events/women-in-music/8483492/ariana-grande-billboard-2018-woman-of-the-year |title=Ariana Grande Is Billboard's 2018 Woman of the Year |magazine=[[Billboard (magazine)|Billboard]] |access-date=November 6, 2018}}</ref> the greatest pop star of 2019, with honorable mentions in 2014 and 2018; and the most successful female artist to debut in the 2010s by ''[[Billboard (magazine)|Billboard]]''.<ref name="billboard.com">{{cite magazine |url=https://www.billboard.com/charts/decade-end/top-artists |title=Decade-End Charts Top Artists 2010s |magazine=[[Billboard (magazine)|Billboard]] |access-date=December 4, 2019}}</ref><ref>{{cite magazine |url=https://www.billboard.com/greatest-pop-star-every-year/?_gl=1*dl8i7y*_ga*YW1wLUxfSTlTay1vMWg0LU51YUpuLThNU3QyWXZKSnpsUnJGdU8zVDJSQmFYd3BZSUw4RGZwdElDcEtHQUs0dExVRW4 |title=The Greatest Pop Star By Year |magazine=[[Billboard (magazine)|Billboard]] |access-date=January 21, 2023}}</ref> Grande was named one of the ten best-selling [[Global Recording Artist of the Year|global recording artists]] of 2018, 2019, and 2020 by the [[International Federation of the Phonographic Industry]] (IFPI), being the highest-ranked woman of 2018 (number eight).<ref>{{cite magazine |last=Paine |first=Andrew |date=February 26, 2019 |title=Drake named IFPI's global recording artist of 2018 |url=https://www.musicweek.com/talent/read/drake-named-ifpi-s-global-recording-artist-of-2018/075443 |access-date=October 10, 2024 |magazine=[[Music Week]]}}</ref><ref>{{cite magazine |last=Cirisano |first=Tatiana |date=March 2, 2020 |title=Taylor Swift Crowned IFPI's Global Best-Selling Artist of 2019 |url=https://www.billboard.com/pro/taylor-swift-ifpi-global-best-selling-artist-2019/ |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]]}}</ref><ref>{{cite magazine |last=Brandle |first=Lars |date=March 4, 2021 |title=BTS Crowned IFPI Global Recording Artist of 2020 |url=https://www.billboard.com/pro/bts-ifpi-global-recording-artist-2020/ |access-date=October 10, 2024 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> The IFPI ranked her as 2024 and 2025's eleventh-best-selling recording artist globally.<ref name="ifpi2024"/><ref>{{Cite magazine |last=Smith |first=Thomas |date=February 18, 2026 |title=Taylor Swift Named IFPI's Biggest-Selling Global Artist in 2025, Her Fourth Year in a Row |url=https://www.billboard.com/music/chart-beat/taylor-swift-biggest-selling-artist-globally-2025-ifpi-list-1236181162/ |access-date=February 20, 2026 |magazine=Billboard}}</ref> For acting, Grande has been nominated for an [[Academy Award]], two [[Golden Globe Awards]], two [[Critics' Choice Movie Awards|Critics' Choice]] awards, and a [[British Academy Film Awards|BAFTA Award]], [[Screen Actors Guild Awards|Screen Actors Guild Award]], and [[Satellite Award for Best Actress in a Supporting Role|Satellite Award]] each.<ref name="WickedNoms"/> Nine singles by Grande have topped the [[List of Billboard Hot 100 chart achievements and milestones|''Billboard'' Hot 100]], her most recent being "[[We Can't Be Friends (Wait for Your Love)]]".<ref name="wcbfn1">{{Cite magazine |last=Trust |first=Gary |date=March 18, 2024 |title=Ariana Grande's 'We Can't Be Friends' Debuts at No. 1 on Billboard Hot 100 |url=https://www.billboard.com/lists/ariana-grande-we-cant-be-friends-hot-100-number-one-debut/streams-airplay-sales-3/ |access-date=March 18, 2024 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> Grande has a total of twenty-three top-ten songs on the chart, which includes sixteen top-ten debuts thus far, beginning with her first single "[[The Way (Ariana Grande song)|The Way]]"; the lead single from each of her first seven studio albums have debuted in the top ten, making her the only artist to achieve this.<ref>{{cite web |url=https://www.stereogum.com/2022487/ariana-grande-thank-u-next-number-1-debut/news/ |title=Ariana Grande's "thank u, next" Debuts At #1 |date=November 12, 2018 |website=Stereogum |access-date=November 14, 2018}}</ref> In 2020, she became the first act to have her first five number-one singles, "[[Thank U, Next (song)|Thank U, Next]]", "[[7 Rings]]", "[[Stuck With U]]", "[[Rain on Me (Lady Gaga and Ariana Grande song)|Rain on Me]]", and "[[Positions (song)|Positions]]" debut at number one; that year, Grande also broke the record for the most number one debuts and became the first female artist topping [[Billboard Global 200|Global 200, Global 200 Excl. US and Hot 100 simultaneously]].<ref name="Billboard"/> Grande would also become the first artist to have three singles debut at number one on a single calendar year.<ref name="billboardpositions"/> She later broke the record for most simultaneously charting songs on the top 40 of the Hot 100 for a female artist with the release of her fifth studio album, ''[[Thank U, Next]]'', when eleven of the twelve tracks charted within the region (later surpassed by [[Billie Eilish]]).<ref name=MostTop40/> The three singles from ''Thank U, Next'', "7 Rings", "[[Break Up with Your Girlfriend, I'm Bored]]", and "Thank U, Next" charted at numbers one, two, and three respectively on the week of February 23, 2019, making Grande the first solo artist to occupy the top three spots of the ''Billboard'' Hot 100 and the first artist to do so since the Beatles in 1964.<ref name="B19"/> With her album ''Thank U, Next'', Grande set the record for the largest streaming week for a pop album and for a female artist at the time, with 307 million on-demand audio streams.<ref name="BB2002"/> With "Die for You" with [[the Weeknd]] reaching number one, she surpassed Paul McCartney as the artist with the most number-one duets in Hot 100 history, with four songs. In December 2025, Grande became the third woman in history to chart eight albums simultaneously on the ''Billboard'' 200, joining [[Taylor Swift]] and [[Whitney Houston]].<ref>{{Cite web |date=December 17, 2025 |title=Ariana Grande Makes ''Billboard'' 200 History With Eight Albums Charting at Once |url=https://inmusicblog.com/ariana-grande-seven-albums-billboard-200-history/ |access-date=January 7, 2026 |website=InMusic Blog}}</ref> {{As of|2026|{{CURRENTMONTHNAME}}}}, Grande has 98 chart entries—the fourth-most among women—on the Hot 100.<ref>{{cite magazine |date=January 7, 2026 |title=Ariana Grande (Chart History): ''Billboard'' Hot 100 |url=https://www.billboard.com/artist/ariana-grande/ |access-date=January 7, 2026 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> She is the female artist with the second-most number-one debuts on the Hot 100 (7).<ref>{{cite magazine |url=https://www.billboard.com/lists/taylor-swift-hot-100-top-14-fortnight-post-malone-record/swifts-12th-hot-100-no-1/ |title=Taylor Swift Claims Record Top 14 Spots on Billboard Hot 100, Led by 'Fortnight' With Post Malone |magazine=[[Billboard (magazine)|Billboard]] |last=Trust |first=Gary |date=April 29, 2024 |access-date=October 7, 2024}}</ref> On the ''Billboard'' [[Pop Airplay]] chart, Grande has 10 number-ones and 23 top-ten songs.<ref name="popairplay">{{cite web |url=https://www.billboard.com/artist/ariana-grande/chart-history/tfm/ |title=Ariana Grande Chart History (Pop Airplay) |magazine=[[Billboard (magazine)|Billboard]] |access-date=October 10, 2024}}</ref> She was also named the ''Billboard'' year-end Top Female Artist of 2017 and 2019 and was ranked sixth among women (twelfth overall) on the magazine's decade-end Top Artists Chart for the 2010s, the highest for any female act to have debuted that decade.<ref>{{cite news |title=Year-End Charts Top Artists – Female (2017) |url=https://www.billboard.com/charts/year-end/2017/top-artists-female/ |access-date=June 11, 2022 |magazine=[[Billboard (magazine)|Billboard]]}}</ref><ref>{{cite news |title=Year-End Charts Top Artists – Female (2019) |url=https://www.billboard.com/charts/year-end/2019/top-artists-female/ |access-date=June 11, 2022 |magazine=[[Billboard (magazine)|Billboard]]}}</ref><ref>{{cite news |title=Decade-End Charts Top Artists (2010s) |url=https://www.billboard.com/charts/decade-end/top-artists/ |access-date=November 25, 2021 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> The magazine also ranked her as the sixth-greatest pop star of 2024,<ref>{{Cite magazine |last=Unterberger |first=Andrew |date=December 23, 2024 |title=''Billboard'' Staff's 10 Greatest Pop Stars of 2024 (Full List) |url=https://www.billboard.com/lists/greatest-pop-stars-2024-full-list |access-date=December 29, 2024 |magazine=[[Billboard (magazine)|Billboard]]}}</ref><ref>{{Cite magazine |last=Denis |first=Kyle |date=December 18, 2024 |title=''Billboard'' Staff's Greatest Pop Stars of 2024: No. 6 — Ariana Grande |url=https://www.billboard.com/music/pop/ariana-grande-greatest-pop-stars-2024-1235860692/ |access-date=December 29, 2024 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> 78th on the "Greatest of All Time Hot 100 Artists" chart,<ref>{{cite news |title=Greatest of All Time Hot 100 Artists |url=https://www.billboard.com/charts/greatest-hot-100-artists/ |access-date=November 25, 2021 |magazine=[[Billboard (magazine)|Billboard]]}}</ref><ref>{{cite magazine |date=November 23, 2021 |title=The Weeknd's 'Blinding Lights' Is the New No. 1 Billboard Hot 100 Song of All Time |url=https://www.billboard.com/music/chart-beat/the-weeknd-blinding-lights-all-time-hot-100-1235001770/ |access-date=November 25, 2021 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> and 19th on their "Top Artists of the 21st Century" list.<ref>{{Cite magazine |date=January 8, 2025 |title=Top Artists of the 21st Century |url=https://www.billboard.com/charts/top-artists-of-the-21st-century/ |url-access=subscription |access-date=January 11, 2025 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> As of 2025, Grande has broken 40 ''[[Guinness World Records]]''.<ref name="Higgins">{{cite web |first=Cole |last=Higgins |title=Ariana Grande just earned her 20th Guinness World Records title |url=https://www.cnn.com/2021/02/07/entertainment/ariana-grande-20th-guinness-world-records-tnd/index.html |access-date=February 9, 2021 |publisher=CNN |date=February 8, 2021}}</ref><ref>{{Cite web |last=Newman |first=Vicki |date=January 16, 2025 |title=Ariana Grande takes huge Spotify record from Taylor Swift amid Wicked box office success |url=https://www.guinnessworldrecords.com/news/2025/1/ariana-grande-takes-huge-spotify-record-from-taylor-swift-amid-wicked-box-office-success/ |access-date=January 25, 2025 |website=[[Guinness World Records]]}}</ref> These records included the most songs to debut at number one on the ''Billboard'' Hot 100, most followers on Spotify (female), most monthly listeners on Spotify (female), most-streamed act on Spotify (female), most streamed track in one week by a female artist on the Billboard charts, fastest hat-trick of UK No. 1 singles by a female artist, first female artist to replace herself at No. 1 on UK singles chart, first solo artist to replace themselves at No. 1 on UK singles chart for two consecutive weeks, most subscribers for a musician on YouTube (female), most streamed album by a female artist in one week (UK), among others. Eleven records were achieved from the success of her album ''Thank U, Next'' which was featured in the 2020 edition. == Philanthropy and activism == At age ten, Grande co-founded the South Florida youth singing group Kids Who Care, which performed at charitable fund-raisers and raised over $500,000 in 2007 alone.<ref name="AboutAriana">{{cite web |title=Ariana Grande – About Ariana |url=http://www.arianagrande.info/about.php |publisher=OfficalArianaGrande |access-date=October 29, 2016 |archive-url=https://web.archive.org/web/20140212053628/http://www.arianagrande.info/about.php |archive-date=February 12, 2014}}</ref> In 2009, as a member of the charitable organization Broadway in South Africa, she and her brother Frankie performed and taught music and dance to children in [[Gugulethu]], South Africa.<ref name="Backstage">{{cite web |last=Nikutopia |title=Ariana Grande's Brother Frankie to Play Cat's Brother in Upcoming "Victorious" Episode? |url=http://www.nickutopia.com/2011/11/15/ariana-grandes-brother-frankie-to-play-cats-brother-in-upcoming-victorious-episode/ |access-date=July 17, 2013 |archive-url=https://web.archive.org/web/20131017234719/http://www.nickutopia.com/2011/11/15/ariana-grandes-brother-frankie-to-play-cats-brother-in-upcoming-victorious-episode/ |archive-date=October 17, 2013}}</ref><ref>{{cite web |title=Ariana Grande on PIX Morning News (April 30, 2010) |url=https://www.youtube.com/watch?v=9YhZQiGJHnw |archive-url=https://ghostarchive.org/varchive/youtube/20211220/9YhZQiGJHnw |archive-date=December 20, 2021 |url-status=live |via=YouTube |date=October 2010}}{{cbignore}}</ref> She was featured with [[Bridgit Mendler]] and [[Kat Graham]] in ''[[Seventeen (American magazine)|Seventeen]]'' magazine in a 2013 public campaign to end [[online bullying]] called "Delete Digital Drama".<ref>{{cite web |url=http://www.seventeen.com/entertainment/features/delete-digital-drama-quotes-bridgit-mendler#slide-1 |title=Spread Love, Not Hate |work=Seventeen Magazine |access-date=July 8, 2012}}</ref> After watching the film ''[[Blackfish (film)|Blackfish]]'' that year, she urged fans to stop supporting [[SeaWorld]].<ref name="DailyNews1"/> In September 2014, Grande participated at the charitable [[Stand Up to Cancer]] television program, performing her song "My Everything" in memory of her grandfather, who had died of cancer that July.<ref>{{cite magazine |title=The Who, Ariana Grande, and Dave Matthews Help Stand Up to Cancer |url=https://www.rollingstone.com/music/news/the-who-ariana-grande-and-dave-matthews-help-stand-up-to-cancer-20140906 |magazine=[[Rolling Stone]] |date=September 6, 2014 |access-date=September 5, 2014 |archive-date=August 25, 2017 |archive-url=https://web.archive.org/web/20170825064221/https://www.rollingstone.com/music/news/the-who-ariana-grande-and-dave-matthews-help-stand-up-to-cancer-20140906 }}</ref> Grande has adopted several rescue dogs as pets and has promoted pet adoption at her concerts.<ref>{{cite web |last=Lindner |first=Emilee |url=http://www.mtv.com/news/2110984/ariana-grande-dogs |archive-url=https://web.archive.org/web/20150322105241/http://www.mtv.com/news/2110984/ariana-grande-dogs/ |archive-date=March 22, 2015 |title=Ariana Grande Rescued 15 Dogs And Is Giving Them Away to Her Fans |publisher=[[MTV]] |date=March 20, 2015}}; and {{cite web |last=Caldwell |first=Kayla |url=http://www.nbcmiami.com/news/local/Miami-Dade-Animal-Services-Adoption-Fees-Waived-297885061.html |title=Miami-Dade Animal Services Adoption Fees Waived |website=NBCMiami.com |date=March 28, 2015}}</ref> In 2016, she launched a line of lip shades, "Ariana Grande's MAC Viva Glam", with MAC Cosmetics, the profits of which benefited people affected by HIV and AIDS.<ref>{{cite web |last=Ruffo |first=Jillian |url=http://stylenews.peoplestylewatch.com/2016/01/13/its-here-ariana-grandes-m-a-c-viva-glam-collection-can-finally-grace-your-lips |title=It's Here: Ariana Grande's M.A.C Viva Glam Collection Can Finally Grace Your Lips |work=[[People (magazine)|People]] StyleWatch |date=January 13, 2016 |access-date=January 13, 2016 |archive-url=https://web.archive.org/web/20160329025103/http://stylenews.peoplestylewatch.com/2016/01/13/its-here-ariana-grandes-m-a-c-viva-glam-collection-can-finally-grace-your-lips/ |archive-date=March 29, 2016 }}</ref><ref>{{cite web |last=Keirans |first=Maeve |url=http://www.mtv.com/news/2894076/ariana-grande-viva-glam-campaign |archive-url=https://web.archive.org/web/20160617135108/http://www.mtv.com/news/2894076/ariana-grande-viva-glam-campaign/ |archive-date=June 17, 2016 |title=Ariana Grande Is a Beautiful Giant In Her New MAC Campaign |publisher=[[MTV]] |date=June 16, 2016}}</ref> That same year, Grande and [[Andrea Martin]] participated in the [[Children of Armenia Fund]] (COAF) gala concert, a benefit for raising funds for impoverished children in [[Armenia]], by encouraging people to buy tickets in support.<ref>{{Cite web |date=November 30, 2016 |title=Andrea Martin, Ariana Grande call to join Children of Armenia Fund Gala |url=https://style.news.am/eng/news/36511/andrea-martin-ariana-grande-call-to-join-children-of-armenia-fund-gala.html |website=style.news.am}}</ref><ref>{{Cite web |date=November 30, 2016 |title=Tom Hanks, Ariana Grande and Andrea Martin call on taking part in Children of Armenia Fund's Gala |url=https://armenpress.am/en/article/869872 |website=Armenpress |language=en}}</ref> In 2015, Grande and [[Miley Cyrus]] performed a cover of [[Crowded House]]'s "[[Don't Dream It's Over]]" as part of Cyrus's "[[Backyard Sessions]]" to benefit her [[Happy Hippie Foundation]], which helps homeless and LGBTQ youths.<ref>{{cite web |url=https://www.yahoo.com/music/neil-finn-salutes-miley-cyrus-and-ariana-grandes-119053970556.html |title=Neil Finn Salutes Miley Cyrus and Ariana Grande's Crowded House Cover |publisher=Yahoo! Music |date=May 16, 2015}}; and {{cite magazine |url=https://time.com/3858597/miley-cyrus-ariana-grande-cover/ |title=Watch Miley Cyrus and Ariana Grande Cover 'Don't Dream It's Over' |magazine=Time |date=May 14, 2015}}; and {{cite magazine |last=O'Donnell |first=Kevin |url=https://www.ew.com/article/2015/05/13/miley-cyrus-ariana-dont-dream-its-over-cove |title=Watch Miley Cyrus and Ariana Grande Cover 'Don't Dream It's Over' |magazine=Entertainment Weekly |date=May 14, 2015}}{{dead link|date=November 2021 |bot=InternetArchiveBot |fix-attempted=yes }}</ref> Later that year, Grande headlined the Dance On the Pier event, part of the [[LGBT Pride March (New York City)|LGBT Pride]] Week in New York City.<ref>{{cite web |last=Erlich |first=Brenna |url=http://www.mtv.com/news/2198691/ariana-grande-dance-pier-scotus-marriage-equality/ |archive-url=https://web.archive.org/web/20150630195659/http://www.mtv.com/news/2198691/ariana-grande-dance-pier-scotus-marriage-equality/ |archive-date=June 30, 2015 |title=Ariana Grande Told All the Haters In SCOTUS to 'Get Their Heads Out Of Their F–king Asses' |publisher=MTV News |date=June 29, 2015}}; and {{cite magazine |last=Hinzmann |first=Dennis |url=http://www.out.com/popnography/2015/7/01/icymi-ariana-grande-slayed-nyc-prides-dance-pier |title=ICYMI: Ariana Grande Slayed at NYC Pride's Dance on the Pier |magazine=Out |date=July 1, 2015}}</ref> As a feminist, Grande wrote a well-received, "empowering" essay on Twitter decrying the double standard and misogyny in the focus of the press on female musicians' relationships and sex lives instead of "their value as an individual".<ref>{{cite magazine |last=Peters |first=Mitchell |date=June 7, 2015 |title=Ariana Grande Shares Empowering Essay Following Big Sean Breakup |url=https://www.billboard.com/music/pop/ariana-grande-shares-empowering-essay-following-big-sean-breakup-6590565/ |magazine=[[Billboard (magazine)|Billboard]]}}; and {{cite news |date=June 8, 2015 |title=Ariana Grande Lashes Out Against 'Double Standard and Misogyny' |url=https://abcnews.go.com/Entertainment/ariana-grande-lashes-double-standard-misogyny/story?id=31602353 |agency=ABC News}}</ref><ref>{{cite magazine |last=Plucinska |first=Joanna |date=June 8, 2015 |title=Pop-Star Sisterhood Approves Ariana Grande's Feminist Stand |url=https://time.com/3912119/ariana-grande-taylor-swift-rita-ora-feminist-twitter-sisterhood/ |magazine=Time |access-date=November 18, 2024 |archive-date=November 27, 2024 |archive-url=https://web.archive.org/web/20241127234714/https://time.com/3912119/ariana-grande-taylor-swift-rita-ora-feminist-twitter-sisterhood/ }}; and {{cite news |last=Rosa |first=Jelani |date=June 10, 2015 |title=Here's What Selena Gomez Had to Say About Ariana Grande's Empowering Feminist Essay |url=https://www.washingtonpost.com/blogs/style-blog/wp/2014/09/19/ariana-grande-is-on-the-brink-of-a-major-image-problem-how-can-she-fix-it |newspaper=The Washington Post}}</ref> She said that she has "more to talk about" concerning her music and accomplishments rather than her romantic relationships.<ref>{{cite news |last=Grinberg |first=Emanuella |date=June 9, 2015 |title=Ariana Grande takes down sexist double standards in a single tweet |url=http://www.cnn.com/2015/06/07/entertainment/ariana-grande-double-standard-misogyny-tweet-feat |publisher=CNN}}</ref><ref>{{cite news |last=Yahr |first=Emily |date=June 8, 2015 |title=Why Ariana Grande's feminist Twitter post was a brilliant career move |url=https://www.washingtonpost.com/blogs/style-blog/wp/2015/06/08/why-ariana-grandes-feminist-twitter-post-was-a-brilliant-career-move |newspaper=The Washington Post}}</ref> That year, Grande joined [[Madonna]] to raise funds for orphaned children in [[Malawi]];<ref>{{cite magazine |last=Roberts |first=Kayleigh |url=http://www.elle.com/culture/celebrities/news/a41203/ariana-grande-madonna-racy-performance |title=Ariana Grande and Madonna Gave a Racy Live Performance Together |magazine=[[Elle (magazine)|Elle]] |date=December 3, 2016}}</ref> she and [[Victoria Monét]] recorded "Better Days" in support of the [[Black Lives Matter]] movement.<ref>{{cite magazine |last=Daly |first=Rhian |url=https://www.nme.com/news/music/ariana-grande-5-1190612 |title=Ariana Grande and Victoria Monét share 'Better Days' in support of Black Lives Matter |magazine=[[NME]] |date=July 11, 2016 |access-date=May 23, 2017}}</ref> To aid the victims of the [[Manchester Arena bombing]] in 2017, Grande organized the [[One Love Manchester]] concert and re-released "One Last Time" and her live performance of "[[Over the Rainbow]]" at the event as charity singles.<ref name="Civico">{{cite web |last=Civico |first=Aldo |date=June 6, 2017 |title=Ariana Grande, I Wish You Were Our President! |url=https://www.huffingtonpost.com/entry/ariana-grande-i-wish-you-were-our-president_us_59374970e4b06bff911d7bf0 |work=HuffPost}}; and {{cite news |last=Mallenbaum |first=Carly |date=June 5, 2017 |title=Ariana Grande stays strong, makes a pitch-perfect return to Manchester |url=https://www.usatoday.com/story/life/entertainthis/2017/06/04/ariana-grande-manchester-one-love-benefit-concert/102491800/ |newspaper=USA Today}}</ref><ref>{{cite news |url=http://www.sfgate.com/news/media/Ariana-Grande-continues-raising-money-for-899426.php |title=Ariana Grande continues raising money for Manchester victims |agency=[[SFGate]] |date=June 8, 2017}}</ref> The total amount raised was reportedly $23 million (more than £17 million),<ref name="Fader2018">{{cite web |last=Tanzer |first=Myles |url=http://www.thefader.com/2018/05/30/ariana-grande-cover-story |title=Ariana Grande |magazine=[[The Fader]] |date=May 30, 2018 |access-date=May 31, 2018 |archive-date=January 29, 2020 |archive-url=https://web.archive.org/web/20200129023634/http://www.thefader.com/2018/05/30/ariana-grande-cover-story |url-status=live}}</ref><ref name="FundsRaised"/> and she received praise for her "grace and strength" in leading the benefit concert.<ref>{{cite magazine |last=Lynskey |first=Dorian |date=June 9, 2017 |title=How Ariana Grande's Embrace of Community at 'One Love Manchester' Made Her a Star in the U.K. |url=https://www.billboard.com/music/pop/ariana-grande-uk-star-manchester-one-love-concert-7825656/ |magazine=[[Billboard (magazine)|Billboard]]}}; and {{cite news |date=June 13, 2017 |title=Ariana Grande to get honorary citizenship of Manchester |url=https://www.bbc.com/news/uk-england-manchester-40267365 |agency=BBC News}}</ref><ref name="Civico"/> Madeline Roth of MTV wrote that the performance "bolstered courage among an audience that desperately needed it. ... Returning to the stage was a true act of bravery and resilience".<ref>{{cite news |last=Roth |first=Madeline |date=December 6, 2017 |title=Against All Odds, Selena, Ariana, and Kesha Triumphed In 2017 |url=http://www.mtv.com/news/3050051/selena-gomez-ariana-grande-kesha-triumph-2017 |archive-url=https://web.archive.org/web/20171206190207/http://www.mtv.com/news/3050051/selena-gomez-ariana-grande-kesha-triumph-2017/ |archive-date=December 6, 2017 |publisher=MTV News}}</ref> In 2017, ''[[New York (magazine)|New York]]'' magazine's Vulture section ranked the event as the No. 1 concert of the year,<ref name="Vulture2017">{{cite web |last=Lockett |first=Dee |date=December 21, 2017 |title=The 10 Best Concerts of 2017 |url=https://www.vulture.com/2017/12/the-10-best-concerts-of-2017.html |magazine=[[New York (magazine)|New York]]}}</ref> and ''Billboard''{{'s}} Mitchell Harrison called Grande a "gay icon" for her LGBTQ-friendly lyrics and performances and "support for the LGBTQ community".<ref>{{cite magazine |last=Harrison |first=Mitchell |date=July 19, 2017 |title=8 Reasons Ariana Grande Is the Gay Icon of Her Generation |url=https://www.billboard.com/photos/7864993/8-reasons-ariana-grande-is-the-gay-icon-of-her-generation |magazine=[[Billboard (magazine)|Billboard]]}}</ref> In September 2017, Grande performed in ''[[A Concert for Charlottesville]]'' which benefitted the victims of the [[Unite the Right rally|August 2017 white nationalist rally]] in [[Charlottesville, Virginia]].<ref>{{cite magazine |last=Delbyck |first=Cole |url=https://www.huffingtonpost.com/entry/ariana-grande-charlottesville_us_59c8f970e4b01cc57ff38b2b |title=Ariana Grande Returns to the Stage for Charlottesville Unity Concert |magazine=[[HuffPost]] |date=September 25, 2017}}</ref> In March 2018, she participated in [[March for Our Lives]] to support gun control reform.<ref>{{cite magazine |last=Honeycutt |first=Shanté |url=https://www.billboard.com/articles/news/politics/8248854/ariana-grande-miley-cyrus-march-for-our-lives |title=Ariana Grande, Miley Cyrus, Jennifer Hudson & More Set to Join Student-Led March for Our Lives |magazine=[[Billboard (magazine)|Billboard]] |date=March 16, 2018}}; and {{cite magazine |last=Kreps |first=Daniel |url=https://www.rollingstone.com/music/news/watch-ariana-grande-sing-be-alright-at-march-for-our-lives-w518351 |title=Watch Ariana Grande Sing 'Be Alright' at March for Our Lives Rally |magazine=[[Rolling Stone]] |date=March 24, 2018 |access-date=March 29, 2018 |archive-date=June 20, 2018 |archive-url=https://web.archive.org/web/20180620181006/https://www.rollingstone.com/music/news/watch-ariana-grande-sing-be-alright-at-march-for-our-lives-w518351 }}</ref> Grande donated the proceeds from the first show in Atlanta on her [[Sweetener World Tour]] to Planned Parenthood in a response to the passage of a number of anti-abortion laws in several states including [[Georgia (U.S. state)|Georgia]].<ref>{{cite magazine |last=Aswad |first=Jem |url=https://variety.com/2019/music/news/ariana-grande-donates-profits-from-atlanta-concert-to-planned-parenthood-1203240940/ |title=Ariana Grande donates Profits from Atlanta Concert to Planned Parenthood |magazine=Variety |date=June 12, 2019}}</ref><ref>{{cite news |access-date=June 18, 2019 |title=Ariana Grande donates $250,000 from Atlanta concert to Planned Parenthood |url=https://www.usatoday.com/story/life/people/2019/06/12/ariana-grande-donates-georgia-concert-money-planned-parenthood/1430405001/ |newspaper=[[USA Today]]}}</ref> During the [[COVID-19 pandemic]], Grande donated between $500 and $1,000 each to a number of fans as financial support.<ref>{{cite web |url=https://www.refinery29.com/en-us/2020/03/9619034/ariana-grande-taylor-swift-send-money-unemployed-fans-coronavirus |last=Reilly |first=Kaitlin |title=Ariana Grande & Taylor Swift Are Sending Money to Fans Who Lost Their Jobs Due to Coronavirus |website=Refinery29 |date=March 27, 2020}}</ref> Grande also supported a [[COVID-19]] fund named ''Project 100'', which aimed to provide $1,000 digital payments to 100,000 families who have been greatly impacted by the pandemic.<ref>{{cite news |url=https://edition.cnn.com/2020/04/21/politics/stacey-abrams-cory-booker-andrew-yang-snap/index.html |title=Stacey Abrams and Andrew Yang announce push to provide direct cash payments to families on food stamps |last=Judd |first=Donald |publisher=[[CNN]] |date=April 21, 2020}}</ref> In May 2020, Grande announced that all net proceeds from her collaboration with singer [[Justin Bieber]], "Stuck With U", would be donated to the First Responders Children's Foundation to fund grants and scholarships for children of frontline workers who are working during the [[COVID-19 pandemic|global pandemic]].<ref name="Kaufman"/> That month, Grande joined a Los Angeles protest against the [[murder of George Floyd]], demanding justice and asking fans to sign petitions condemning the act of police brutality. She highlighted white privilege and called for more activism outside social media.<ref>{{cite magazine |title=Ariana Grande, Halsey, Timothée Chalamet, and More Celebrities Spent Their Weekends Protesting |url=https://www.vulture.com/2020/06/george-floyd-protests-ariana-grande-halsey-celebrities-join.html |last=Griffin |first=Louise |date=May 29, 2020 |magazine=New York |access-date=June 2, 2020}}</ref><ref>{{cite magazine |title=Billie Eilish, Beyoncé, Ariana Grande and More Celebrities Respond to George Floyd's Death |url=https://www.teenvogue.com/story/celebrities-respond-george-floyd-death/amp |last=Elizabeth |first=De |date=May 31, 2020 |magazine=[[Teen Vogue]] |access-date=June 2, 2020}}</ref> In 2022, Grande surprised children, who were spending the Christmas holiday period at hospitals in Manchester, with gifts from wish lists at the [[Royal Manchester Children's Hospital]], among others. Manchester Foundation Trust Charity revealed that Grande had gifted nearly 1,000 presents to patients across the hospital network's children's wards and newborn intensive care units in 2021.<ref>{{cite magazine |title=Ariana Grande Gifts Hauls of Christmas Presents to Manchester Children's Hospitals: 'We Were So Touched' |url=https://www.rollingstone.com/music/music-news/ariana-grande-manchester-childrens-hospitals-christmas-presents-1234653389/ |access-date=January 17, 2023 |magazine=[[Rolling Stone]] |date=December 28, 2022}}</ref> In June 2021, Grande and other celebrities signed an open letter to Congress requesting passage of the [[Equality Act (United States)|Equality Act]], highlighting that the Act would protect "marginalized communities".<ref>{{cite news |last1=Meyers |first1=Dave |title=Ariana Grande, Pink, Halsey, Taylor Swift, Ed Sheeran, Lady Gaga & more urge Congress to pass the Equality Act |url=https://www.wrmf.com/ariana-grande-pink-halsey-taylor-swift-ed-sheeran-lady-gaga-more-urge-congress-to-pass-the-equality-act/ |access-date=June 22, 2021 |publisher=WRMF |date=June 22, 2021}}</ref> In the same month, Grande partnered with the online portal [[BetterHelp]], and gave away $2 million worth of therapy to fans.<ref>{{cite news |title=Ariana Grande donates thousands for free mental health counselling |url=https://jerseyeveningpost.com/morenews/viralnews/2021/06/30/ariana-grande-donates-thousands-for-free-mental-health-counselling/ |access-date=December 30, 2021 |work=Jersey Evening Post |publisher=Claverley Group |date=June 30, 2021}}</ref><ref>{{cite magazine |last=Mcnamara |first=Brittney |date=June 30, 2021 |title=Ariana Grande Is Giving Away $2 Million in Free Therapy With BetterHelp |url=https://www.teenvogue.com/story/ariana-grande-is-giving-away-dollar1-million-in-free-therapy-with-betterhelp |magazine=[[Teen Vogue]] |access-date=December 30, 2021}}</ref> On [[International Transgender Day of Visibility]] in 2022, she launched the Protect & Defend Trans Youth Fund to benefit [[transgender youth]], pledging to match every donation up until $1.5 million.<ref>{{cite news |title=Ariana Grande giving $1.5m to support trans youth amid 'disgraceful' legislative attacks |url=https://www.theguardian.com/music/2022/mar/31/ariana-grande-transgender-youth-rights |last=Cantor |first=Matthew |date=April 1, 2022 |newspaper=[[The Guardian]] |access-date=May 7, 2022}}</ref> In May 2022, Grande was among 160 artists and influencers, who signed a [[2022 abortion rights protests in the United States|'Bans Off Our Bodies']] full-page advertisement in ''[[The New York Times]]'', in support of abortion rights in the US.<ref>{{cite news |title=Ariana Grande and other stars support Roe v Wade in New York Times ad |url=https://www.theguardian.com/us-news/2022/may/13/ariana-grande-billie-eilish-roe-v-wade-abortion-nyt-ad |date=May 13, 2022 |newspaper=[[The Guardian]] |location=UK |access-date=May 15, 2022}}</ref> Grande was also one of 175 entertainers to sign an open letter to oppose books bans in US schools in 2023.<ref>{{cite web |last=Horton |first=Adrian |url=https://www.theguardian.com/books/2023/sep/19/celebrities-sign-letter-book-ban-ariana-grande-amanda-gorman |title='Chilling': Ariana Grande, Amanda Gorman and others sign letter against book bans |newspaper=[[The Guardian]] |date=September 19, 2023}}</ref> In June 2022, Grande endorsed [[Karen Bass]] for 2022 Los Angeles mayoral election.<ref>{{cite magazine |last=Rosenbaum |first=Claudia |date=June 6, 2022 |title="There's More to Being a Democrat Than Just Registering": The L.A. Mayor's Race Is Tearing Hollywood Apart |url=https://www.vanityfair.com/news/2022/06/the-la-mayors-race-is-tearing-hollywood-apart |access-date=June 6, 2022 |magazine=[[Vanity Fair (magazine)|Vanity Fair]]}}</ref> In 2023, Grande signed an open letter from [[Artists4Ceasefire]] to president [[Joe Biden]] during the [[Gaza war]].<ref>{{Cite web |title=Artists4Ceasefire |url=https://www.artists4ceasefire.org/ |url-status=live |archive-url=https://web.archive.org/web/20231216055552/https://www.artists4ceasefire.org/ |archive-date=December 16, 2023 |access-date=December 17, 2023 |website=Artists4Ceasefire}}</ref><ref>{{Cite web |last=Mouriquand |first=David |date=May 29, 2024 |title=Why is Taylor Swift losing followers over Gaza conflict? |url=https://www.euronews.com/culture/2024/05/29/swiftiesforpalestine-taylor-swift-urged-to-speak-up-on-gaza-conflict |access-date=June 2, 2024 |website=[[Euronews]]}}</ref> In May 2024, after [[Rafah offensive|Israel launched an airstrike on Rafah]], Grande shared a fundraiser aimed at providing humanitarian aid for Palestinians in Gaza.<ref>{{Cite news |last=Butt |first=Maira |date=May 30, 2024 |title=Kehlani calls out celebrities for 'embarrassing' silence on Gaza – as Ariana Grande and Katy Perry speak out |url=https://www.independent.co.uk/arts-entertainment/music/news/kehlani-gaza-celebrities-ariana-grande-katy-perry-b2553769.html |access-date=June 2, 2024 |work=The Independent}}</ref> Following Biden's [[Withdrawal of Joe Biden from the 2024 United States presidential election|withdrawal]] from the [[2024 US presidential election]], Grande showed support for vice president [[Kamala Harris]]'s [[Kamala Harris 2024 presidential campaign|campaign]].<ref>{{Cite web |last=Spencer-Elliott |first=Lydia |date=July 22, 2024 |title=Katy Perry and Ariana Grande among stars to endorse Kamala Harris for president |url=https://www.independent.co.uk/arts-entertainment/music/news/kamala-harris-president-katy-perry-ariana-grande-jamie-lee-curtis-b2583697.html |access-date=July 22, 2024 |website=The Independent}}</ref> In January 2025, she reposted messaging from the nonprofit organization [[Advocates for Trans Equality]], via her social media, in response to US President [[Executive Order 14168|Donald Trump's order]] to withdraw federal recognition for transgender people.<ref>{{Cite magazine |last=Puckett-Pope |first=Lauren |date=January 21, 2025 |title=Ariana Grande Signals Support for Trans Community After President Trump Issues 'Two Sexes' Executive Order |url=https://www.elle.com/culture/celebrities/a63494135/ariana-grande-trump-sex-executive-order-trans-community/ |access-date=April 2, 2025 |magazine=[[Elle (magazine)|Elle]]}}</ref> The following month, Grande advocated for therapy for young entertainers in both the acting and music fields, saying that weekly appointments should be built into their contracts.<ref>{{Cite magazine |last=Shafer |first=Ellise |date=February 10, 2025 |title=Ariana Grande Says Studios and Labels Need to Offer Weekly Therapy in Contracts for Young Stars: 'That Should Be Non-Negotiable' |url=https://variety.com/2025/film/news/ariana-grande-studios-labels-need-offer-therapy-young-stars-1236302363/ |access-date=April 2, 2025 |magazine=Variety}}</ref> That June, she endorsed [[Alexandria Ocasio-Cortez]]'s recommendation to impeach Trump for a "disastrous decision to [[United States strikes on Iranian nuclear sites|bomb Iran]] without authorization".<ref>{{cite magazine |first=Anna |last=Chan |title=Ariana Grande Shares AOC's Call to Impeach President Donald Trump |url=https://www.billboard.com/music/music-news/ariana-grande-aoc-impeach-donald-trump-1236004909/ |magazine=[[Billboard (magazine)|Billboard]] |date=June 23, 2025 |access-date=June 25, 2025}}</ref> == Business and ventures == === Products and endorsements === In November 2015, she released a limited edition handbag in collaboration with [[Coach New York|Coach]].<ref>{{cite web |last=Last |first=Ashley |url=https://www.thenational.ae/coach-unveils-collaboration-with-ariana-grande-1.75347 |title=Coach unveils collaboration with Ariana Grande |date=November 4, 2015 |access-date=October 12, 2019}}</ref> In January 2016, she launched a makeup collection with [[MAC Cosmetics]], donating 100% of proceeds to the [[MAC AIDS Fund]].<ref>{{cite web |url=http://www.instyle.com/news/ariana-grande-good-girl-bad-girl-mac-viva-glam |title=Ariana Grande Goes from a Good Girl to a Bad Girl MAC's Viva Glam Campaign |work=InStyle |date=January 13, 2016 |access-date=February 28, 2016 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319213313/https://www.instyle.com/news/ariana-grande-good-girl-bad-girl-mac-viva-glam }}; {{cite web |last=Kinonen |first=Sarah |url=http://site.people.com/style/ariana-grande-mac-cosmetics-viva-glam-collection |title=Ariana Grande's Having the Most Glam Week Ever (and It's Only Monday) |work=[[People (magazine)|People]] |date=August 22, 2016 |access-date=August 23, 2016 |archive-date=August 29, 2016 |archive-url=https://web.archive.org/web/20160829103306/http://site.people.com/style/ariana-grande-mac-cosmetics-viva-glam-collection/ }}</ref> In February 2016, Grande launched a fashion line with Lipsy London.<ref>{{cite web |url=https://www.mtv.co.uk/news/tbidj1/first-look-at-the-fashion-line-ariana-grande-has-designed-for-lipsy |title=Ariana Grande Teams Up With Lipsy for Her First Fashion Line |publisher=[[MTV]] |date=February 3, 2016 |access-date=February 28, 2016 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319213258/http://www.mtv.co.uk/ariana-grande/news/first-look-at-the-fashion-line-ariana-grande-has-designed-for-lipsy |url-status=live}}</ref> Later that year, she teamed up with [[Brookstone]], using the concept art of artist Wenqing Yan, to design cat ear headphones.<ref>{{cite magazine |url=https://www.billboard.com/articles/news/7517948/ariana-grande-brookstone-cat-ear-headphones |title=Ariana Grande & Brookstone Collaborate on Limited-Edition Cat-Ear Headphones |magazine=[[Billboard (magazine)|Billboard]] |date=September 20, 2016 |access-date=December 2, 2019}}</ref> In 2017, Grande collaborated with [[Square Enix]] to create a character based on herself for the [[mobile game]] ''[[Final Fantasy Brave Exvius]]''. Grande was a limited-time unlockable character as part of the [[Dangerous Woman Tour]] event, which also included an orchestral remix of Grande's song "Touch It"; the character, Dangerous Ariana, is a magical support character who uses music-based attacks.<ref>{{cite web |last=Wong |first=Steven |date=February 7, 2017 |title=How 'Final Fantasy Brave Exvius' Teamed Up With Ariana Grande |url=https://www.alistdaily.com/digital/final-fantasy-brave-exvius-teamed-ariana-grande/ |url-status=live |archive-url=https://web.archive.org/web/20200523175139/https://www.alistdaily.com/digital/final-fantasy-brave-exvius-teamed-ariana-grande/ |archive-date=May 23, 2020 |access-date=June 18, 2020 |website=AList}}</ref><ref>{{cite web |last=Fahey |first=Mike |date=January 9, 2017 |title=How To Get Ariana Grande in Final Fantasy Brave Exvius, Because You Can Do That Now |url=https://kotaku.com/how-to-get-ariana-grande-in-final-fantasy-brave-exvius-1791380918 |url-status=live |archive-url=https://web.archive.org/web/20191021215011/https://kotaku.com/how-to-get-ariana-grande-in-final-fantasy-brave-exvius-1791380918 |archive-date=October 21, 2019 |access-date=June 18, 2020 |website=[[Kotaku]]}}</ref> In September 2017, she became a brand ambassador for [[Reebok]].<ref>{{cite magazine |last=Briones |first=Isis |url=https://www.billboard.com/articles/news/lifestyle/7981657/ariana-grande-hong-kong-in-48-hours |title=48 Hours in Hong Kong With Ariana Grande |magazine=[[Billboard (magazine)|Billboard]] |date=September 29, 2017}}</ref> In August 2018, she partnered with [[American Express]] for [[The Sweetener Sessions]], a partnership which continued through the [[Sweetener World Tour]] in 2019, alongside [[T-Mobile US|T-Mobile]]. In March 2019, she partnered with [[Starbucks]] for the launch of the Cloud Macchiato beverage.<ref>{{cite magazine |url=https://www.billboard.com/articles/business/8501214/ariana-grande-starbucks-cloud-macchiato |title=Ariana Grande Inspires New Starbucks Cloud Macchiato |magazine=[[Billboard (magazine)|Billboard]] |last=Silver |first=Michael |date=March 5, 2019 |access-date=October 23, 2019}}</ref> In May 2019, Grande was announced as the face of [[Givenchy]]'s fall-winter campaign.<ref>{{cite magazine |last=Feller |first=Madison |url=https://www.elle.com/fashion/celebrity-style/a27432137/givenchy-face-ariana-grande-ponytail/ |title=Ariana Grande's Ponytail Is The New Face Of Givenchy |magazine=[[Elle (magazine)|Elle]] |date=May 10, 2019 |access-date=September 17, 2024}}</ref> The campaign began in July and generated $25.13 million in [[Influence of mass media|media impact value]].<ref>{{cite web |last=Cohen |first=Julia |url=https://www.launchmetrics.com/resources/blog/ariana-grande-givenchy |title=Givenchy X Ariana Grande: The Full Data Rundown |website=Launchmetrics |date=September 16, 2019 |access-date=October 11, 2019}}</ref> In July 2024, she became the brand ambassador of [[Swarovski]]; Grande's first appearance as the face was in the house's holiday campaign in October 2024.<ref>{{cite journal |last=Zargini |first=Luisa |url=https://wwd.com/accessories-news/jewelry/ariana-grande-swarovski-brand-ambassador-1236488984/ |title=EXCLUSIVE: Swarovski Taps Ariana Grande as Brand Ambassador |journal=[[Women's Wear Daily]] |date=July 16, 2024 |access-date=September 17, 2024 |url-access=subscription}}</ref><ref>{{Cite journal |last=Mineo |first=Alfredo |date=October 29, 2024 |title=Ariana Grande Dances the Night Away in Swarovski's Shining Couture Dress for Holiday Campaign Music Video |url=https://wwd.com/pop-culture/new-fashion-releases/swarovski-ariana-grande-party-of-dreams-collection-1236705279/ |journal=Women's Wear Daily |access-date=October 31, 2024}}</ref> Grande collaborated with the company's global creative director [[Giovanna Battaglia Engelbert]] on two capsule collections, released in January 2025 and March 2026.<ref>{{Cite magazine |last=Calfee |first=Joel |date=January 28, 2025 |title=Ariana Grande Has Co-Created a Brand-New Capsule With Swarovski |url=https://www.harpersbazaar.com/celebrity/latest/a63577778/ariana-grande-swarovski-capsule-collection-giovanna-engelbert-interview/ |access-date=January 30, 2025 |magazine=[[Harper's Bazaar]]}}</ref><ref>{{Cite magazine |last=Graham |first=Joshua |date=March 18, 2026 |title=Ariana Grande channels ethereal beauty for her second collection with Swarovski |url=https://www.rollingstone.co.uk/style/ariana-grande-x-swarovski-collaboration-2026-59708/ |access-date=March 20, 2026 |magazine=[[Rolling Stone UK]]}}</ref> [[Beats Electronics|Beats]], [[Samsung]], [[Fiat]], Reebok, and [[Guess (clothing)|Guess]] products have been [[Product placement|featured]] in Grande's music videos.<ref>{{cite web |url=https://productplacementblog.com/tag/ariana-grande/ |title=Ariana Grande Product Placement Photos |website=Product Placement Blog |date=December 8, 2018 |access-date=October 11, 2019}}</ref> She has appeared in commercials for [[Macy's]], T-Mobile, and [[Apple Inc.|Apple]], as well as for her own fragrances.<ref>{{cite web |url=https://www.ispot.tv/topic/actor-actress/TY/ariana-grande |title=Ariana Grande TV Commercials Ads |website=i-Spot |access-date=October 11, 2019}}</ref> Since 2019, Grande has been among the ten highest-paid individuals on Instagram. As of 2025, Grande earns $2 million per sponsored Instagram post.<ref>{{Cite news |date=June 29, 2025 |title=Virat Kohli is the only Indian among top 20 highest paid celebrities on Instagram, earns these many crores for every post |url=lhttps://indianexpress.com/article/trending/top-10-listing/top-20-highest-paid-celebs-on-instagram-virat-kohli-earns-this-much-per-post-10090668/ |access-date=July 3, 2025 |work=[[The Indian Express]]}}</ref><ref>{{cite web |url=https://www.scmp.com/magazines/style/celebrity/article/3139620/instagrams-2021-rich-list-cristiano-ronaldo-highest |title=Instagram's 2021 rich list: Cristiano Ronaldo is the highest earner, pushing Dwayne Johnson into second with Ariana Grande third |magazine=[[South China Morning Post]] |date=July 3, 2021 |access-date=October 18, 2022}}</ref> === Fragrances === Grande has released eighteen fragrances with Luxe Brands. She launched her debut fragrance, Ari by Ariana Grande, in 2015. In the wake of its success, she launched her third fragrance, Sweet Like Candy, in 2016.<ref>{{cite web |last=Bayley |first=Leanne |url=http://www.glamourmagazine.co.uk/news/beauty/2015/02/20/ariana-grande-first-fragrance-celebrity-perfume-news |title=Ariana Grande is launching her first fragrance |work=Glamour (magazine) |date=February 20, 2015 |access-date=May 19, 2015 |archive-url=https://web.archive.org/web/20150403135040/http://www.glamourmagazine.co.uk/news/beauty/2015/02/20/ariana-grande-first-fragrance-celebrity-perfume-news |archive-date=April 3, 2015 }}; {{cite web |last=Geffen |first=Sasha |url=http://www.mtv.com/news/2192443/ariana-grande-perfume-snapchat |title=Ariana Grande Accidentally Revealed Her New Perfume On Snapchat: See The Pics |publisher=[[MTV]] |date=June 20, 2015 |access-date=October 30, 2016 |archive-date=September 14, 2019 |archive-url=https://web.archive.org/web/20190914032913/http://www.mtv.com/news/2192443/ariana-grande-perfume-snapchat/ }}; {{cite web |last=Zhekova |first=Dobrina |url=http://www.instyle.com/beauty/fragrance/ariana-grande-sweet-like-candy-launch |title=Ariana Grande Launches Sweet Like Candy Fragrance – Celebrity Perfumes |work=InStyle |date=July 20, 2016 |access-date=October 8, 2016 |archive-date=March 19, 2019 |archive-url=https://web.archive.org/web/20190319213314/https://www.instyle.com/beauty/fragrance/ariana-grande-sweet-like-candy-launch }}</ref> Her fifth fragrance, Moonlight, was released in 2017, followed by Cloud (2018), Thank U, Next (2019), R.E.M. (2020), and God Is a Woman (2021), which was later expanded to an [[Ulta Beauty|Ulta]]-exclusive body care line in 2022.<ref>{{cite web |last=Shaw |first=Sophie |date=August 22, 2022 |title=Ariana Grande launches God Is A Woman body care collection |url=https://edition.cnn.com/cnn-underscored/beauty/ariana-grande-god-is-a-woman-body-collection-launch |archive-url=https://web.archive.org/web/20220822140922/https://edition.cnn.com/cnn-underscored/beauty/ariana-grande-god-is-a-woman-body-collection-launch |archive-date=August 22, 2022 |access-date=August 31, 2022 |publisher=[[CNN]]}}</ref> She then released the duo fragrance collection Mod Vanilla and Mod Blush (2022).<ref>{{cite web |url=https://wwd.com/fashion-news/fashion-scoops/ariana-grande-mod-fragrance-vanilla-blush-duo-release-info-1235426415/ |title=Ariana Grande Channels '60s Mod Inspiration for New Vanilla and Blush Fragrance Duo Collection |agency=[[PR Newswire]] |date=November 22, 2022}}</ref> It was followed by the collection Lovenotes (2024), which consisted of four region-exclusive fragrances.<ref>{{Cite magazine |last=Saulog |first=Gabriel |date=August 9, 2024 |title=Ariana Grande Announces New International Fragrance Line 'LOVENOTES' |url=https://billboardphilippines.com/culture/lifestyle/ariana-grande-announces-new-international-fragrance-line-lovenotes/ |access-date=October 31, 2024 |magazine=[[Billboard Philippines]]}}</ref> The next fragrance was Cherry Blossom (2025), released as a R.E.M. Beauty product via Ulta.<ref>{{Cite web |last=Chapman |first=Rachel |date=February 28, 2025 |title=Ariana Grande's Cherry Eclipse Or Sabrina Carpenter's Cherry Baby? |url=https://www.elitedaily.com/lifestyle/ariana-grande-cherry-eclipse-sabrina-carpenter-cherry-baby-perfume-reviews/ |access-date=April 1, 2025 |website=[[Elite Daily]]}}</ref> The range also includes the limited editions Frankie (2016), Sweet Like Candy Limited Edition (2017), Thank U, Next 2.0, Cloud Intense (both 2021), and Cloud Pink (2023). The fragrances won the [[FiFi Award]] multiple times, most recently with R.E.M. in 2021. In 2022, it was reported that Cloud was the best-selling fragrance at Ulta, selling one bottle every eleven seconds.<ref>{{cite web |last=Russo |first=Maria Del |date=March 23, 2022 |title=This Cult-Favorite Perfume Sold Every 11 Seconds Last Year — And Now I Know Why |url=https://www.thezoereport.com/beauty/ariana-grande-cloud-perfume |access-date=May 7, 2022 |website=The Zoe Report}}</ref> As of 2024, the scents are developed and manufactured in collaboration with [[Robertet Group]] and [[International Flavors & Fragrances]].<ref>{{Cite web |last=Wightman-Stone |first=Danielle |date=August 12, 2024 |title=Ariana Grande unveils new region-specific fragrance collection |url=https://fashionunited.in/news/fashion/ariana-grande-unveils-new-region-specific-fragrance-collection/2024081246184/ |access-date=October 31, 2024 |publisher=[[FashionUnited]]}}</ref> Grande's fragrance line is the most-searched celebrity offering, with over 4.4 million searches across Google and social media platforms per year, as of 2023.<ref>{{cite magazine |last=Jensen |first=Emily |date=August 14, 2023 |title=Ariana Grande Is the Last Great Celebrity Perfumer |url=https://www.harpersbazaar.com/beauty/a41924718/ariana-grande-perfumes-reviews-success/ |access-date=November 26, 2023 |magazine=Harper's Bazaar}}</ref> Since its launch in 2015, the franchise has made over $1 billion in retail sales globally.<ref>{{cite web |last=Pener |first=Degen |date=November 23, 2022 |title=''The Hollywood Reporter''<nowiki/>'s 40 Biggest Celebrity Entrepreneurs in 2022 |url=https://www.hollywoodreporter.com/lists/the-hollywood-reporters-40-biggest-celebrity-entrepreneurs-2022/jennifer-aniston-6/ |access-date=October 31, 2024 |work=[[The Hollywood Reporter]]}}</ref> === R.E.M. Beauty === {{Main|R.E.M. Beauty}} In November 2021, Grande launched her makeup line R.E.M. Beauty, which is distributed at Ulta Beauty as of March 2022.<ref name=HarpersBeauty>{{cite magazine |last=Rosenstein |first=Jenna |url=https://www.harpersbazaar.com/beauty/makeup/a38225476/ariana-grande-rem-beauty-review/ |title=Ariana Grande's Makeup Brand, r.e.m. beauty, Is Available Right Now |magazine=[[Harper's Bazaar]] |date=November 12, 2021}}</ref><ref>{{cite magazine |url=https://wwd.com/beauty-industry-news/beauty-features/ariana-grandes-r-e-m-beauty-heads-to-ulta-1235139566/ |title=Ariana Grande's R.E.M. Beauty Heads to Ulta |date=March 25, 2022 |last=Manso |first=James |magazine=Women's Wear Daily}}</ref> The original line featured 12 core products for lips and eyes, and the range has since been expanded with additional skincare and makeup products.<ref name=HarpersBeauty/><ref>{{cite magazine |url=https://www.elle.com/uk/beauty/make-up/a37945600/ariana-grande-rem-beauty-line/ |title=Everything You Need To Know About Ariana Grande's R.E.M Beauty Line |access-date=August 9, 2022 |date=July 29, 2022 |magazine=Elle}}</ref> ''[[Forbes]]'' reported in 2022 that R.E.M. Beauty was one of the brands boosting Ulta's driving gross margin due to strong consumer demand.<ref>{{cite magazine |url=https://www.forbes.com/sites/shelleykohan/2022/05/26/strong-customer-demand-leads-ulta-beauty-to-a-21-sales-increase/ |title=Strong Customer Demand Leads Ulta Beauty To A 21% Sales Increase |access-date=June 3, 2022 |date=May 26, 2022 |last=Cohan |first=Shelley |magazine=Forbes}}</ref> In May, the line won "Best New Brand" at the [[Allure (magazine)#Best of Beauty Awards|Allure Best of Beauty Awards]].<ref>{{cite magazine |title=These Are the Winners of Our Allure Readers' Choice Awards for 2022 |url=https://www.allure.com/story/readers-choice-winners#newbrand |magazine=[[Allure (magazine)|Allure]] |date=May 16, 2017 |access-date=June 3, 2022 |url-status=live |archive-url=https://web.archive.org/web/20220518152443/https://www.allure.com/story/readers-choice-winners |archive-date=May 18, 2022}}</ref> In February 2023, the brand was launched in 81 [[Sephora]] stores and 13 online sites, including across Europe.<ref>{{cite web |url=https://fashionunited.uk/news/fashion/ariana-grande-s-beauty-line-to-launch-at-sephora/2023020167634 |title=Ariana Grande's beauty line to launch at Sephora |access-date=February 2, 2023 |date=February 1, 2023 |publisher=[[FashionUnited]]}}</ref> == Personal life == Grande has said she struggled with [[hypoglycemia]], which she attributed to poor dietary habits.<ref>{{cite web |last=Carbone |first=Gina |url=http://www.wetpaint.com/nickelodeon-star-ariana-grande-addresses-597630/ |title=Nickelodeon Star Ariana Grande Addresses Eating Disorder Rumors |work=WetPaint |date=June 19, 2013 |access-date=December 11, 2018 |archive-date=September 16, 2019 |archive-url=https://web.archive.org/web/20190916112840/http://www.wetpaint.com/nickelodeon-star-ariana-grande-addresses-597630/ }}; and {{cite magazine |last=Goodman |first=Lizzy |url=https://www.billboard.com/articles/news/6221482/billboard-cover-ariana-grande-on-fame-freddy-krueger-and-her-freaky-past |title=''Billboard'' Cover: Ariana Grande on Fame, Freddy Krueger and Her Freaky Past |magazine=[[Billboard (magazine)|Billboard]] |date=August 15, 2014}}</ref> She has been following a [[vegan]] diet since 2013,<ref>{{cite news |last=Nied |first=Jennifer |date=August 16, 2020 |title=Ariana Grande Sticks To A Vegan Diet And Walks 12,000 Steps A Day |url=https://www.womenshealthmag.com/food/a33472196/ariana-grande-diet/ |work=Women's Health |access-date=August 21, 2022}}</ref> though fans questioned in 2019 whether she still was, after working with [[Starbucks]] to create a special edition of one of her favorite drinks which was revealed to contain eggs. Her nutritionist, Harley Pasternak, told the magazine [[Glamour (magazine)|''Glamour'']] that Grande is still following the diet, but that he has gotten her to "feel OK about indulging and celebrating sometimes".<ref>{{cite news |date=March 11, 2019 |title=Ariana Grande Vegan? '7 Rings' Singer's Diet As Fans Question New Starbucks Drink |url=https://www.capitalfm.com/artists/ariana-grande/vegan-starbucks-7-rings-diet/ |work=Capital |access-date=August 21, 2022}}</ref> Grande developed [[post-traumatic stress disorder]] (PTSD) and [[Anxiety disorder|anxiety]] after the [[Manchester Arena bombing]]; she nearly pulled out of her performance in the 2018 broadcast ''[[A Very Wicked Halloween]]'' due to anxiety.<ref>{{cite web |last=Sheridan |first=Emily |url=https://www.mirror.co.uk/3am/celebrity-news/ariana-grande-reveals-shes-suffering-13429859 |title=Ariana Grande reveals she's suffering from anxiety after 'split' from Pete Davidson |work=[[Daily Mirror|Mirror]] |date=October 17, 2018}}</ref> Grande has also said she has been in therapy for over a decade, having first seen a mental health professional shortly after her parents' divorce.<ref>{{cite web |last=Weiner |first=Zoë |url=https://www.self.com/story/ariana-grande-therapy-anxiety |title=Ariana Grande Reveals She's Been in Therapy for Over a Decade: 'It's Work' |work=Self |date=July 11, 2018}}</ref> Grande was raised [[Catholic]], but left the church during the pontificate of [[Benedict XVI]] (circa 2013),<ref>{{cite web |title=Singer Ariana Grande Abandons Catholic Beliefs |url=http://www.cathnewsusa.com/2013/11/singer-ariana-grande-abandons-catholic-beliefs/ |website=CathNewsUSA |access-date=February 9, 2014 |date=November 20, 2013 |archive-date=August 26, 2019 |archive-url=https://web.archive.org/web/20190826085614/http://cathnewsusa.com/2013/11/singer-ariana-grande-abandons-catholic-beliefs/ }}</ref> opposing its [[Catholic Church and homosexuality|stance on homosexuality]]<ref name="DailyNews1"/> and stating that her half-brother Frankie is gay.<ref name="brenna">{{cite web |last=Ehrlich |first=Brenna |url=http://www.mtv.com/news/1972089/ariana-grande-questions-religion |title=Ariana Grande Reveals Love for Gay Brother Frankie Made Her Question Catholic Faith |publisher=[[MTV]] |date=October 22, 2014 |access-date=May 3, 2016 |archive-url=https://web.archive.org/web/20220209002618/http://www.mtv.com/news/1972089/ariana-grande-questions-religion/ |archive-date=February 9, 2022}}</ref> Grande said that she and Frankie later visited a [[Kabbalah Centre]] and that they both "really had a connection with it".<ref name="CoolDiva"/><ref name="brenna"/> Several of her songs, such as "Break Your Heart Right Back", are supportive of [[LGBT rights]].<ref>{{cite web |author-last1=Peeples |author-first1=Jason |url=http://www.advocate.com/arts-entertainment/music/2014/08/16/ariana-grande-says-recording-song-about-gay-affair-was-very-fun |title=Ariana Grande Says Recording Song About Gay Affair Was 'Very Fun' |magazine=[[The Advocate (LGBT magazine)|The Advocate]] |date=August 16, 2014}}</ref> She has also been labeled "an advocate for a [[sex-positive]] attitude".<ref>{{cite magazine |last=Bruner |first=Raisa |date=February 27, 2017 |title=Watch Ariana Grande's Steamy, Diverse and Sex-Positive Video for 'Everyday' |url=https://time.com/4684270/ariana-grande-future-everyday-video/ |magazine=[[Time (magazine)|Time]] |access-date=January 3, 2021 |archive-date=January 15, 2021 |archive-url=https://web.archive.org/web/20210115214102/https://time.com/4684270/ariana-grande-future-everyday-video/ }}</ref> ===Politics=== In November 2019, Grande endorsed [[Bernie Sanders]]'s [[Bernie Sanders 2020 presidential campaign|second presidential bid]].<ref>{{cite magazine |date=November 20, 2019 |title=Ariana Grande Breaks Free From Capitalism, Endorses Bernie Sanders |url=https://www.rollingstone.com/music/music-news/ariana-grande-bernie-sanders-915571/ |access-date=April 24, 2022 |magazine=Rolling Stone}}</ref> She endorsed [[Joe Biden]] for the [[2020 United States presidential election|2020 presidential election]],<ref>{{Cite web |date=October 28, 2020 |title=Ariana Grande officially endorses Joe Biden in new Instagram post |url=https://www.thenews.com.pk/latest/736920-ariana-grande-officially-endorses-joe-biden-in-new-instagram-post |access-date=June 2, 2024 |website=[[The News International]]}}</ref> and [[Kamala Harris]] for the [[2024 United States presidential election|2024 presidential election]].<ref>{{Cite magazine |last=Dailey |first=Hannah |date=September 17, 2024 |title=All the Musicians Supporting Kamala Harris in the 2024 Presidential Election |url=https://www.billboard.com/lists/musicians-endorsing-kamala-harris-president-2024/ariana-grande-17/ |access-date=September 17, 2024 |magazine=[[Billboard (magazine)|Billboard]]}}</ref> In June 2025, amid [[U.S. Immigration and Customs Enforcement|ICE]] enforcement operations in [[Los Angeles]], Grande wrote on Instagram that she was "deeply upset about these violent deportations" and that "LA simply wouldn't exist without immigrants", sharing [[American Civil Liberties Union|ACLU]] resources on immigrant rights.<ref name="rodrigo-ice-ticker">{{cite web |last=Stubberud |first=Casper |date=November 17, 2025 |title=Olivia Rodrigo denounces new ICE app in Instagram comment |url=https://theticker.org/17552/arts/arts-amp-style/olivia-rodrigo-denounces-new-ice-app-in-instagram-comment/ |work=The Ticker}}</ref> In January 2026, Grande promoted a nationwide protest against ICE on her Instagram Story, urging followers to participate in the "ICE Out Nationwide Shutdown" on January 30.<ref name="yahoo-grande-ice">{{cite web |date=January 29, 2026 |title=Ariana Grande Continues Political Stance Against ICE With Big Endorsement |url=https://www.yahoo.com/entertainment/music/articles/ariana-grande-continues-political-stance-231516608.html |work=Yahoo! Entertainment}}</ref> At the [[83rd Golden Globe Awards]] on January 11, 2026, Grande wore an "ICE Out" pin on her [[Vivienne Westwood]] dress, part of a coordinated campaign in response to the [[Killing of Renee Nicole Good|fatal shooting of Renee Good]] by an ICE agent in [[Minneapolis]].<ref name="complex-globes">{{cite web |last=Cowen |first=Trace William |date=January 12, 2026 |title=Ariana Grande Wears 'ICE Out' Pin at 2026 Golden Globes |url=https://www.complex.com/pop-culture/a/tracewilliamcowen/ariana-grande-ice-out-pin-golden-globes-2026 |work=[[Complex (magazine)|Complex]]}}</ref><ref name="npr-globes">{{cite web |date=January 12, 2026 |title=Celebrities wear pins protesting ICE at the Golden Globes |url=https://www.npr.org/2026/01/12/g-s1-105659/celebrities-pins-protesting-ice-golden-globes |work=[[NPR]]}}</ref> === Relationships === <!--PER PREVIOUS Talk page discussions (see Archive), please DO NOT ADD boyfriends until Ariana has had a serious dating relationship with them for more than one continuous year if they have an article or two continuous years if they don't. --> Grande's personal relationships have been widely scrutinized by the public.<ref>{{Cite magazine |last=Rose |first=Lacey |date=February 11, 2025 |title=The Second Coming of Ariana Grande |url=https://www.hollywoodreporter.com/movies/movie-features/ariana-grande-wicked-oscars-music-love-1236132418/ |access-date=February 18, 2025 |magazine=The Hollywood Reporter}}</ref> Some of her former lovers were mentioned by name in the song "[[Thank U, Next (song)|Thank U, Next]]".<ref>{{cite web |last=Grossman |first=Lena |date=November 4, 2018 |title=Ariana Grande Sings About Pete Davidson and Mac Miller in New Song "Thank u, next" |url=https://www.eonline.com/au/news/983536/ariana-grande-sings-about-pete-davidson-and-mac-miller-in-new-song-thank-u-next |access-date=November 1, 2024 |agency=[[E!]]}}</ref> She dated her ''[[13 (musical)|13]]'' co-star [[Graham Phillips (actor)|Graham Phillips]] for three years.<ref>{{cite magazine |last=Zauzmer |first=Emily |url=http://www.people.com/article/graham-phillips-defends-ariana-grande-donut-scandal |title=Graham Phillips Defends Ex-Girlfriend Ariana Grande After Doughnut Controversy: 'It Doesn't Speak to Her Character at All' |magazine=[[People (magazine)|People]] |date=July 22, 2015 |access-date=January 22, 2018 |archive-date=May 18, 2016 |archive-url=https://web.archive.org/web/20160518201143/http://www.people.com/article/graham-phillips-defends-ariana-grande-donut-scandal }}</ref><ref>{{cite web |last=Cabrera |first=Daniela |url=https://www.bustle.com/articles/180516-who-has-ariana-grande-dated-the-singer-has-a-thing-for-guys-in-the-music-biz |title=Who Has Ariana Grande Dated? The Singer Has a Thing for Guys in the Music Biz |magazine=[[Bustle.com]] |date=August 26, 2016 |access-date=January 22, 2018}}</ref><ref>{{Cite web |url=http://www.californianeutrals.org/PDF/Layn-Phillips-2012.pdf |title=Curriculum Vitae: Judge Layn R. Phillips |website=California Academy of Distinguished Neutrals |access-date=July 25, 2013 |archive-url=https://web.archive.org/web/20141014035929/http://www.californianeutrals.org/PDF/Layn-Phillips-2012.pdf |archive-date=October 14, 2014 }} {{Title missing|date=September 2025}}</ref> From August 2012 to August 2014, Grande was in an [[on-again, off-again relationship]] with Australian YouTuber [[Jai Brooks]].<ref>{{cite web |url=https://sports.yahoo.com/blogs/celeb-news/ariana-grande-breaks-up-with-jai-brooks-following-her-grandfather-s-death-132619459.html |title=Ariana Grande Breaks Up With Jai Brooks Following Her Grandfather's Death |website=[[Yahoo!]] |date=August 5, 2014 |access-date=December 4, 2023}}</ref> She briefly dated English singer [[Nathan Sykes]] during their separation, and then dated rapper [[Big Sean]] for eight months.<ref>{{Cite magazine |date=March 8, 2024 |title=Quick Refresher on Ariana Grande's Full Dating History Over the Years |url=https://www.cosmopolitan.com/entertainment/celebs/a44577267/ariana-grande-dating-relationship-history/ |access-date=April 3, 2024 |magazine=Cosmopolitan}}</ref> Grande was in a year-long relationship with Ricky Alvarez, who was one of her backup dancers on [[the Honeymoon Tour]].<ref>{{Cite magazine |last=Cerón |first=Ella |date=July 26, 2016 |title=Ariana Grande Breaks Up With Boyfriend Ricky Alvarez, According to Sources |url=https://www.teenvogue.com/story/ariana-grande-ricky-alvarez-breakup/ |access-date=November 1, 2024 |magazine=[[Teen Vogue]]}}</ref><ref>{{Cite web |last=Fisher |first=Kendall |date=July 27, 2016 |title=Ariana Grande Breaks Up With Ricky Alvarez |url=https://www.eonline.com/news/782890/ariana-grande-breaks-up-with-ricky-alvarez/ |access-date=November 1, 2024 |website=[[E! Online]]}}</ref> After recording "[[The Way (Ariana Grande song)|The Way]]" in 2012, Grande began dating rapper [[Mac Miller]] in 2016.<ref>{{cite magazine |last=Garcia |first=Patricia |url=http://www.vogue.com/13484221/mac-miller-the-divine-feminine-album |title=Mac Miller on Love, Ariana Grande, and the Last Thing That Made Him Cry |magazine=[[Vogue (magazine)|Vogue]] |date=September 27, 2016 |access-date=May 25, 2017 |archive-date=January 3, 2017 |archive-url=https://web.archive.org/web/20170103170159/http://www.vogue.com/13484221/mac-miller-the-divine-feminine-album/ }}</ref><ref>{{cite web |last=Avila |first=Theresa |date=September 7, 2016 |title=Ariana Grande Confirms Her Relationship With Mac Miller by Literally Wrapping Her Legs Around Him |url=https://nymag.com/thecut/2016/09/ariana-grande-wraps-her-legs-around-mac-miller-in-photo.html |access-date=October 31, 2024 |work=[[The Cut (publication)|The Cut]]}}</ref> She was prominently featured on his fourth album ''[[The Divine Feminine]]'' (2016), including on its third single "[[My Favorite Part]]".<ref>{{Cite web |last=Yoo |first=Noah |date=September 9, 2016 |title=Listen to Mac Miller and Ariana Grande's New Song "My Favorite Part" |url=https://pitchfork.com/news/68142-listen-to-mac-miller-and-ariana-grandes-new-song-my-favorite-part/ |access-date=May 8, 2024 |website=[[Pitchfork (website)|Pitchfork]]}}</ref><ref>{{Cite magazine |last=Quinn |first=Dave |date=May 24, 2018 |title=Ariana Grande Says Mac Miller's Explicit Song 'Cinderella' Is About Her and Twitter Is Shook |url=https://people.com/music/ariana-grande-mac-miller-cinderella-about-her-twitter-shook/ |access-date=March 19, 2024 |magazine=[[People (magazine)|People]]}}</ref> By May 2018, their relationship had ended and Grande entered a whirlwind romance with comedian [[Pete Davidson]].<ref name="mac001">{{cite magazine |last=Penrose |first=Nerisha |url=https://www.billboard.com/music/rb-hip-hop/ariana-grande-mac-miller-relationship-timeline-8457806/ |title=A Timeline of Ariana Grande & Mac Miller's Relationship |magazine=[[Billboard (magazine)|Billboard]] |date=May 25, 2018}}; and {{cite magazine |last=Jackson |first=Dory |url=http://www.newsweek.com/ariana-grande-mac-miller-break-reveal-920158 |title=Why Did Ariana Grande and Mac Miller Break Up? Singer Shares Update on Instagram Story Post |magazine=[[Newsweek]] |date=May 10, 2018}}</ref> They got engaged in June, after a few weeks of dating, while a [[Pete Davidson (song)|song titled after and inspired by Davidson]] was featured on ''Sweetener''.<ref>{{cite news |last=Mallenbaum |first=Carly |title=Pete Davidson confirms Ariana Grande engagement: 'I feel like I won a contest' |url=https://www.usatoday.com/story/life/entertainthis/2018/06/11/ariana-grande-pete-davidson-engaged/693041002 |newspaper=[[USA Today]] |date=June 21, 2018 |access-date=June 21, 2018}}</ref> That September, Miller [[Mac Miller#Death|died from an accidental drug overdose]]; Grande expressed grief over his death on social media and called him her "dearest friend".<ref>{{cite news |url=https://www.usatoday.com/story/life/music/2018/09/14/ariana-grande-posted-video-ex-boyfriend-mac-miller-friday-another-touching-remembrance-26-year-old-r/1306393002/ |title=Ariana Grande in tribute post to Mac Miller: 'You were my dearest friend' |first=Julia |last=Thompson |date=September 14, 2018 |newspaper=[[USA Today]]}}</ref> She and Davidson called off their engagement and ended their relationship the following month.<ref>{{Cite web |last=Ahlgrim |first=Callie |title=Here's a complete timeline of Ariana Grande and Pete Davidson's whirlwind engagement and sudden split |url=https://www.businessinsider.com/ariana-grande-pete-davidson-relationship-timeline-2018-6 |access-date=April 1, 2024 |website=Business Insider}}</ref> Grande began dating real estate agent Dalton Gomez in January 2020.<ref>{{cite web |last1=Seemayer |first1=Zach |last2=Schillaci |first2=Sophie |title=Ariana Grande and Dalton Gomez Split After 2 Years of Marriage: A Timeline of Their Whirlwind Romance |website=Entertainment Tonight |date=July 17, 2023 |url=https://www.etonline.com/ariana-grande-and-dalton-gomez-split-after-2-years-of-marriage-a-timeline-of-their-whirlwind |access-date=July 19, 2025}}</ref> Their relationship, while mostly private, was made public in May 2020, in the music video of her and [[Justin Bieber]]'s charity single "[[Stuck with U]]".<ref>{{cite web |last=Bailey |first=Alyssa |date=May 8, 2020 |title=Ariana Grande Confirms She's Dating Dalton Gomez With a Kiss in Her 'Stuck With U' Music Video |url=https://www.elle.com/culture/celebrities/a32414537/ariana-grande-dalton-gomez-kiss-stuck-with-u-music-video/ |access-date=May 19, 2021 |website=[[Elle (magazine)|Elle]]}}</ref> Grande announced their engagement on December 20, 2020, after 11 months of dating.<ref>{{cite magazine |url=https://www.hollywoodreporter.com/news/ariana-grande-engaged-to-real-estate-agent-dalton-gomez |title=Ariana Grande Engaged to Real Estate Agent Dalton Gomez |magazine=[[The Hollywood Reporter]] |date=December 20, 2020 |last=Perez |first=Lexy}}</ref> On May 15, 2021, they married in a private ceremony at her home in [[Montecito, California]].<ref>{{cite magazine |last=Macon |first=Alexandra |title=Inside Ariana Grande's Intimate At-Home Wedding |url=https://www.vogue.com/slideshow/ariana-grande-at-home-wedding-photos |access-date=May 26, 2021 |magazine=[[Vogue (magazine)|Vogue]]}}</ref> Her wedding pictures became [[List of most-liked Instagram posts|the second-most-liked Instagram post]] and most-liked Instagram post featuring pictures of people at the time, with over 25 million likes.<ref>{{cite news |title=Ariana Grande's wedding photo become most-liked Instagram post that features people |url=https://www.today.com/video/ariana-grande-s-wedding-photo-become-most-liked-instagram-post-that-features-people-113975365505 |access-date=May 29, 2021 |work=[[Today (American TV program)|Today]] |date=May 29, 2021}}</ref><ref>{{cite news |last=Longmire |first=Becca |date=May 28, 2021 |title=Ariana Grande Breaks Instagram Record After Sharing Stunning Photos From Wedding To Dalton Gomez |url=https://etcanada.com/news/785525/ariana-grande-breaks-instagram-record-after-sharing-stunning-photos-from-wedding-to-dalton-gomez/ |archive-url=https://web.archive.org/web/20210528141032/https://etcanada.com/news/785525/ariana-grande-breaks-instagram-record-after-sharing-stunning-photos-from-wedding-to-dalton-gomez/ |archive-date=May 28, 2021 |access-date=May 29, 2021 |work=[[Entertainment Tonight Canada]]}}</ref> Grande and Gomez separated on February 20, 2023, and simultaneously filed for divorce that September due to "[[irreconcilable differences#United States|irreconcilable differences]]".<ref>{{Cite web |last1=Calvario |first1=Liz |last2=Dasrath |first2=Diana |date=October 7, 2023 |title=Ariana Grande and Dalton Gomez settle divorce after two years of marriage |url=https://www.today.com/popculture/news/ariana-grande-dalton-gomez-relationship-timeline-divorce-rcna108116 |access-date=March 19, 2024 |work=Today}}</ref> They agreed on a [[divorce settlement]] in October, which was finalized in March 2024.<ref>{{cite magazine |url=https://people.com/ariana-grande-and-dalton-gomez-settle-divorce-8348933 |title=Ariana Grande and Dalton Gomez Settle Divorce Weeks After Filing |first=Angel |last=Saunders |date=October 6, 2023 |access-date=October 6, 2023 |magazine=[[People (magazine)|People]]}}</ref><ref name="daltongomez_divorce">{{Cite news |date=March 19, 2024 |title=Ariana Grande and Dalton Gomez are officially divorced |url=https://apnews.com/article/ariana-grande-dalton-gomez-divorce-f4393ab6b6c203f11d3fa4534978d6a8 |access-date=March 19, 2024 |work=[[Associated Press News]]}}</ref> As of July 2023, Grande is in a relationship with her ''Wicked'' co-star [[Ethan Slater]].<!-- Do not change to "began dating in July" without a reliable source; the source cited with this statement does not say so--><ref>{{Cite magazine |last=Gibson |first=Kelsie |date=November 5, 2024 |title=Ariana Grande and Ethan Slater's Relationship Timeline |url=https://people.com/ariana-grande-and-ethan-slater-relationship-timeline-7974917 |access-date=December 28, 2024 |magazine=[[People (magazine)|People]]}}</ref> == Filmography == {{Main|Ariana Grande videography}} {{hatnote|This section lists select works only. Refer to the main article for further information.}} {{col-begin}} {{col-2}} '''Films and television''' * ''[[Victorious]]'' (2010–2013) * ''[[Sam & Cat]]'' (2013–2014) * ''[[Swindle (2013 film)|Swindle]]'' (2013) * ''[[Metegol|Underdogs]]'' (2016) * ''[[Hairspray Live!]]'' (2016) * ''[[Don't Look Up]]'' (2021) * ''[[Wicked (2024 film)|Wicked]]'' (2024){{notetag|name="agb"|Credited as Ariana Grande-Butera.}} * ''[[Brighter Days Ahead]]'' (2025){{notetag|Short film; also co-writer, co-director and executive producer.}} * ''[[Wicked: For Good]]'' (2025){{notetag|name="agb"}} {{col-2}} '''Documentaries and concert specials''' * ''[[One Love Manchester]]'' (2017) * ''[[Ariana Grande at the BBC]]'' (2018) * ''[[Ariana Grande: Dangerous Woman Diaries]]'' (2018) * ''[[Ariana Grande: Excuse Me, I Love You]]'' (2020) {{col-end}} == Discography == {{Main|Ariana Grande discography|List of songs recorded by Ariana Grande}} * ''[[Yours Truly (Ariana Grande album)|Yours Truly]]'' (2013) * ''[[My Everything (Ariana Grande album)|My Everything]]'' (2014) * ''[[Dangerous Woman]]'' (2016) * ''[[Sweetener (album)|Sweetener]]'' (2018) * ''[[Thank U, Next]]'' (2019) * ''[[Positions (album)|Positions]]'' (2020) * ''[[Eternal Sunshine (album)|Eternal Sunshine]]'' (2024) == Live performances and tours == {{Main|List of Ariana Grande live performances}} === Musical theater === {| class="wikitable" !Year !Production !Role !Director !Venue !Notes !{{Reference column heading}} |- |2008 | rowspan="2" |''[[13 (musical)|13]]'' | rowspan="2" |Charlotte | rowspan="2" |[[Jeremy Sams]] |[[Norma Terris Theatre]], [[Chester, Connecticut|Chester]] | |<ref>Jones, Kenneth. [http://www.playbill.com/news/article/117016.html "Teen Time! Cast Announced for Goodspeed Run of '13' Musical"] {{Webarchive|url=https://web.archive.org/web/20080502124634/http://www.playbill.com/news/article/117016.html|date=May 2, 2008}}, playbill.com, April 22, 2008</ref> |- |2008–2009 |[[Bernard B. Jacobs Theatre]], [[Manhattan]] |Original [[Broadway theatre|Broadway]] Cast |<ref>Gans, Andrew and Kenneth Jones. [http://www.playbill.com/news/article/123569.html "New Musical 13 to Close on Broadway in January 2009"] {{Webarchive|url=https://web.archive.org/web/20081216011558/http://www.playbill.com/news/article/123569.html|date=December 16, 2008}}, playbill.com, November 21, 2008</ref> |- |2012 |''[[A Snow White Christmas (musical)|A Snow White Christmas]]'' |[[Snow White]] |[[Bonnie Lythgoe]] |[[Pasadena Playhouse]] | |<ref>{{cite web |date=December 30, 2012 |title=A Snow White Christmas |url=http://www.pasadenaplayhouse.org/box-office/mainstage/a-snow-white-christmas.html |archive-url=https://web.archive.org/web/20120914035847/http://www.pasadenaplayhouse.org/box-office/mainstage/a-snow-white-christmas.html |archive-date=September 14, 2012 |access-date=May 11, 2013 |publisher=The Pasadena Playhouse}}</ref><ref>{{Cite web |last=Garcia |first=Dawn |date=December 14, 2012 |title=A Snow White Christmas |url=https://atodmagazine.com/2012/12/14/a-snow-white-christmas/ |access-date=April 15, 2024 |website=atodmagazine.com}}</ref> |- |2027 |[[Sunday in the Park with George|''Sunday in the Park with George'']] |Dot / Marie |[[Marianne Elliott]] |[[Barbican Centre|Barbican Theater]] | |<ref name=":4" /> |} === Tours === ==== Headlining ==== * [[The Listening Sessions]] (2013) * [[The Honeymoon Tour]] (2015) * [[Dangerous Woman Tour]] (2017) * [[Sweetener World Tour]] (2019) * [[The Eternal Sunshine Tour]] (2026) ==== Promotional ==== * [[The Sweetener Sessions]] (2018) ==== Opening act ==== * [[Justin Bieber]] – [[Believe Tour]] (2013) == See also == {{Portal|Biography|Pop music|United States}} * [[List of American Grammy Award winners and nominees]] * [[List of artists who have achieved simultaneous UK and U.S. number-one hits]] * [[List of artists who reached number one in the United States]] * [[List of Billboard Social 50 number-one artists|List of ''Billboard'' Social 50 number-one artists]] * [[Honorific nicknames in popular music]] * [[UK singles chart records and statistics]] == Notes == {{reflist|group=note}} == References == {{Reflist}} {{notelist}} == External links == {{sister project links|d=Q151892|q=Ariana Grande|c=category:Ariana Grande|n=no|b=no|v=no|voy=no|m=no|mw=no|wikt=no|s=no|species=no}} * {{#invoke:Official website|main}} * {{AllMusic}} * {{Discogs artist}} * {{IMDb name}} * {{MusicBrainz artist}} * {{IBDB name}} * {{playbill person}} {{Ariana Grande|state=expanded}} {{Ariana Grande songs}} {{Navboxes |title = [[List of awards and nominations received by Ariana Grande|Awards for Ariana Grande]] |list = {{American Music Award for Artist of the Year}} {{American Music Award for Favorite Pop/Rock Female Artist}} {{American Music Award for New Artist of the Year}} {{Astra Film Award for Best Supporting Actress}} {{Brit International Female}} {{Grammy Award for Best Pop Duo/Group Performance}} {{Grammy Award for Best Pop Vocal Album}} {{Japan Gold Disc Award for Artist of the Year}} {{Nickelodeon Kids' Choice Award for Favorite Female Singer}} {{Nickelodeon Kids' Choice Award for Favorite Female TV Star}} {{Nickelodeon Kids' Choice Award for Favorite Movie Actress}} {{Nickelodeon Kids' Choice Award for Favorite Song}} {{MTV Europe Music Award for Best Female}} {{MTV Europe Music Award for Best Pop}} {{MTV Europe Music Award for Best US Act}} {{MTV Video Music Award for Video of the Year}} {{MTV Video Music Award for Song of the Year}} {{MTV Video Music Award for Artist of the Year}} {{MTV Video Music Award for Best Collaboration}} {{MTV Video Music Award for Best Long Form Video}} {{MTV Video Music Award for Best Pop Video}} {{MTV Video Music Award for Song of Summer}} {{People's Choice Award for Favorite Female Artist}} {{San Diego Film Critics Society Award for Best Supporting Actress}} {{Satellite Award Best Supporting Actress Motion Picture}} {{Teen Choice Award for Choice Music – Female Artist}} }} {{Authority control}} {{DEFAULTSORT:Grande, Ariana}} [[Category:Ariana Grande| ]] [[Category:1993 births]] [[Category:Living people]] [[Category:21st-century American actresses]] [[Category:21st-century American singer-songwriters]] [[Category:21st-century American women singers]] [[Category:21st-century people from Florida]] [[Category:American actors with disabilities]] [[Category:American activists for Palestinian solidarity]] [[Category:American contemporary R&B singers]] [[Category:American former Christians]] [[Category:LGBTQ rights activists from Florida]] [[Category:American musical theatre actresses]] [[Category:American sopranos]] [[Category:American television actresses]] [[Category:American women pop singers]] [[Category:American women singer-songwriters]] [[Category:Anti-bullying activists]] [[Category:Brit Award winners]] [[Category:Kabbalists]] [[Category:Crime witnesses]] [[Category:American dance-pop musicians]] [[Category:American feminist musicians]] [[Category:Grammy Award winners]] [[Category:Judges in American reality television series]] [[Category:MTV Europe Music Award winners]] [[Category:Music Awards Japan winners]] [[Category:Nickelodeon people]] [[Category:Actresses from Boca Raton, Florida]] [[Category:People with post-traumatic stress disorder]] [[Category:Republic Records artists]] [[Category:Singer-songwriters from Florida]] [[Category:Singers with a four-octave vocal range]] [[Category:Universal Music Group artists]] [[Category:American women in electronic music]] [[Category:American musicians with disabilities]] [[Category:Singers with disabilities]] [[Category:Survivors of terrorist attacks]] [[Category:American women company founders]] [[Category:American people of Italian descent]] cbkjzfb5c7vac0rhpg2xqzcqo0uowge User:MrJaroslavik/cswiki.js 2 118532 739091 736299 2026-04-22T13:47:55Z MrJaroslavik 44012 {{delete|user request}} 739091 javascript text/javascript {{delete|user request}} hg49uze9n5ijn0nze4atd7azpd82129 User:MrJaroslavik/global.js 2 118543 739104 737763 2026-04-22T18:20:29Z MrJaroslavik 44012 + 739104 javascript text/javascript // GLOBAL - FOR ALL WIKIS START // //-------------------------------------------------------------// //-------------------------------------------------------------// // GlobalCheckUserList.js - https://test.wikipedia.org/w/index.php?title=User:MrJaroslavik/GlobalCheckUserList.js mw.loader.load('https://test.wikipedia.org/w/index.php?title=User:MrJaroslavik/GlobalCheckUserList.js&action=raw&ctype=text/javascript'); // CheckUserLogCount.js - https://test.wikipedia.org/w/index.php?title=User:MrJaroslavik/CheckUserLogCount.js mw.loader.load('https://test.wikipedia.org/w/index.php?title=User:MrJaroslavik/CheckUserLogCount.js&action=raw&ctype=text/javascript'); // SuppressionLogCount.js - https://test.wikipedia.org/w/index.php?title=User:MrJaroslavik/SuppressionLogCount.js mw.loader.load('https://test.wikipedia.org/w/index.php?title=User:MrJaroslavik/SuppressionLogCount.js&action=raw&ctype=text/javascript'); // GlobalCheckUserStats.js - https://test.wikipedia.org/w/index.php?title=User:MrJaroslavik/GlobalCheckUserStats.js mw.loader.load('https://test.wikipedia.org/w/index.php?title=User:MrJaroslavik/GlobalCheckUserStats.js&action=raw&ctype=text/javascript'); // GlobalSuppressionStats.js - https://test.wikipedia.org/w/index.php?title=User:MrJaroslavik/GlobalSuppressionStats.js mw.loader.load('https://test.wikipedia.org/w/index.php?title=User:MrJaroslavik/GlobalSuppressionStats.js&action=raw&ctype=text/javascript'); // MarkAdmins.js - https://test.wikipedia.org/w/index.php?title=User:MrJaroslavik/MarkAdmins.js mw.loader.load('https://test.wikipedia.org/w/index.php?title=User:MrJaroslavik/MarkAdmins.js&action=raw&ctype=text/javascript'); // userinfo.js - https://test.wikipedia.org/wiki/User:MrJaroslavik/userinfo.js if ([2, 3].indexOf(mw.config.get('wgNamespaceNumber')) !== -1 && mw.config.get('wgAction') === 'view') { mw.loader.load('https://test.wikipedia.org/w/index.php?title=User:MrJaroslavik/userinfo.js&action=raw&ctype=text/javascript'); } // ToggleSidebar.js - https://en.wikipedia.org/w/index.php?title=User:BrandonXLF/ToggleSidebar.js mw.loader.load('https://en.wikipedia.org/w/index.php?title=User:BrandonXLF/ToggleSidebar.js&action=raw&ctype=text/javascript'); // NeverUseMobileVersion.js - https://en.wikipedia.org/w/index.php?title=User:%C3%9Ejarkur/NeverUseMobileVersion.js mw.loader.load('https://en.wikipedia.org/w/index.php?title=User:%C3%9Ejarkur/NeverUseMobileVersion.js&action=raw&ctype=text/javascript'); // REDIRECT TO META IF ACCESSING LOCAL CENTRALAUTH PAGE var relUser = mw.config.get('wgRelevantUserName'); if (mw.config.get('wgCanonicalSpecialPageName') == 'CentralAuth' && mw.config.get('wgDBname') != 'metawiki' && relUser) { location.href = 'https://meta.wikimedia.org/wiki/Special:CentralAuth/' + encodeURIComponent(relUser); } mw.config.get('wgCanonicalSpecialPageName') === 'CentralAuth' && $(function sortCentralAuthByEditCount() { let th = document.querySelector('.mw-centralauth-wikislist th:nth-child(6)'); if (!th) return; let sort = () => { if (!th.classList.contains('headerSort')) return; for (let i = 0; i < 3; i++) { if (th.classList.contains('headerSortDown')) return true; th.click(); } }; if (sort()) return; let observer = new MutationObserver(() => { sort() && observer.disconnect(); }); observer.observe(th, { attributes: true }); let $table = $('.mw-centralauth-wikislist'); if ($table.hasClass('jquery-tablesorter')) return; mw.loader.using('jquery.tablesorter', () => { $table.tablesorter(); }); }); // Change wiki logo link to Recent Changes $(function() { $('.mw-wiki-logo, .mw-logo').attr('href', mw.util.getUrl('Special:RecentChanges')); }); // CustomSidebar.js - https://test.wikipedia.org/wiki/User:MrJaroslavik/CustomSidebar.js mw.loader.load('https://test.wikipedia.org/w/index.php?title=User:MrJaroslavik/CustomSidebar.js&action=raw&ctype=text/javascript'); //-------------------------------------------------------------// //-------------------------------------------------------------// // GLOBAL - FOR ALL WIKIS END // f339dh4fgwtq03fjm4fffcao0k5pa1s User:MrJaroslavik/wikidata.js 2 118544 739089 736309 2026-04-22T13:47:22Z MrJaroslavik 44012 {{delete|user request}} 739089 javascript text/javascript {{delete|user request}} hg49uze9n5ijn0nze4atd7azpd82129 User:MrJaroslavik/skwiki.js 2 118545 739090 736300 2026-04-22T13:47:38Z MrJaroslavik 44012 {{delete|user request}} 739090 javascript text/javascript {{delete|user request}} hg49uze9n5ijn0nze4atd7azpd82129 User:Nardog/sandbox2.js 2 118608 739170 739068 2026-04-23T06:46:55Z Nardog 40946 739170 javascript text/javascript (async function listTools() { let pageAction = mw.config.get('wgAction'); let isView = pageAction === 'view'; let isEdit = ['edit', 'submit'].includes(pageAction); if (!isView && !isEdit) return; let pageType = mw.config.get('wgCanonicalSpecialPageName') || mw.config.get('wgNamespaceNumber'); if (isView && !pageType && !mw.config.exists('wgRedirectedFrom') && !mw.config.get('wgIsRedirect') && !mw.config.get('wgPageName').includes('/') ) { return; } await mw.loader.using([ 'mediawiki.util', 'mediawiki.Title', 'mediawiki.api', 'mediawiki.interface.helpers.styles' ]); mw.loader.addStyleTag(`.listtools:not(#mw-content-subtitle .listtools) { font-size: 85%; } .listtools, .listtools a { font-weight: normal !important; font-style: normal; } .mw-datatable .listtools { display: block; } .listtools + .mw-whatlinkshere-tools, #watchlist-edit-form .listtools ~ .mw-changeslist-links, .mw-special-DisambiguationPageLinks .listtools + a { display: none; }`); let messages = Object.assign({ watched: 'Added "$1" to your watchlist', watchFail: `Couldn't watch "$1"`, unwatchFail: `Couldn't unwatch "$1"` }, window.listtoolsMessages); let getMsg = (key, ...args) => ( Object.hasOwn(messages, key) ? mw.format(messages[key], ...args) : key ); let notif; let watchHandler = async function (e) { e.preventDefault(); let $link = $(this); let $wrapper = $link.parent(); $link.detach(); let params = new URLSearchParams(this.search); let action = params.get('action'); $wrapper.text(getMsg(action + 'ing')); let pn = params.get('title').replaceAll('_', ' '); let promise = new mw.Api()[action](pn); if (notif) { notif.close(); notif = null; } try { let result = await promise; if (!result || !result[action + 'ed']) throw ''; let newAction = action === 'watch' ? 'unwatch' : 'watch'; params.set('action', newAction); $link.add(`.listtools-watch > a[href="${this.pathname + this.search}"]`) .attr('href', this.pathname + '?' + params) .text(getMsg(newAction)); if (action !== 'watch') return; let require = await mw.loader.using([ 'mediawiki.notification', 'mediawiki.watchstar.widgets' ]); notif = await mw.notify( new (require('mediawiki.watchstar.widgets'))('watch', pn, null, $.noop, { message: getMsg('watched', pn) }).$element, { tag: 'listtools' } ); } catch { notif = await mw.notify(getMsg(action + 'Fail', pn), { tag: 'listtools', type: 'error' }); } finally { $wrapper.html($link); } }; let extGetMain = function () { return this.title; }; let re = new RegExp(`(?:\\?title=|${ mw.util.escapeRegExp(mw.format(mw.config.get('wgArticlePath'), '')) })([^#&?]+)`); let processed = new WeakSet(); let processLinks = ($links, module, titles) => { let isBatch = !!titles; titles = titles || new Set(); $links.each(function (i) { if (processed.has(this)) return; let $link = $links.eq(i); let pn; if (module.useText) { pn = $link.text(); } else { let match = $link.attr('href')?.match(re); if (!match) return; pn = decodeURIComponent(match[1]); } let t = mw.Title.newFromText(pn); if (!t) return; if (module.titlesOnly) { let text = $link.text(); if (text !== pn.replaceAll('_', ' ') && (text !== t.getMainText() || t.namespace === 2) ) { return; } } if ($link.is('.external, .extiw')) { Object.assign(t, { getMain: extGetMain, host: this.host, namespace: 0, title: pn }); } else { if (t.namespace < 0) return; if ($link.hasClass('new')) { t.missing = true; } titles.add(t.getSubjectPage().toText()); } let $tools = $('<span>').addClass('listtools mw-changeslist-links') .data('listtools', t); tools.forEach(tool => { addTool($tools, tool); }); if ($link.is(':is(del, bdi) > :only-child')) { if (module.position === 'end') { $link.parent().parent().append(' ', $tools); } else { $link.parent().after(' ', $tools); } } else if (module.position === 'end') { $link.parent().append(' ', $tools); } else { $link.after(' ', $tools); } if (module.post) { module.post($tools); } processed.add(this); }); if (!isBatch) { getWatched(titles); } }; let tools = [ { name: 'edit', url: t => t.getUrl({ action: 'edit' }) }, { name: 'hist', url: t => !t.missing && t.getUrl({ action: 'history' }) }, { name: 'links', url: t => mw.util.getUrl('Special:WhatLinksHere/' + t) }, { name: 'watch', url: t => !t.host && t.getSubjectPage().getUrl({ action: 'watch' }), callback: watchHandler } ]; let addTool = ($tools, tool, escapedName) => { let t = $tools.data('listtools'); let $duplicate = escapedName && $tools.children('.listtools-' + escapedName); let url = tool.url; if (typeof url === 'function') { url = url(t); if (!url) { $duplicate?.remove(); return; } } let $link = $('<a>').attr('href', url).text(getMsg(tool.name)); if (t.host) { $link.prop('host', t.host); } if (tool.callback) { $link.on('click', tool.callback); } let $wrapper = $('<span>').addClass('listtools-' + tool.name) .append($link); let $next = tool.next && $tools.children('.listtools-' + tool.next); if ($next?.length) { $duplicate?.remove(); $next.before($wrapper); } else if ($duplicate?.length) { $duplicate.replaceWith($wrapper); } else { $tools.append($wrapper); } }; let extend = tool => { if (tool.label && !Object.hasOwn(messages, tool.label)) { messages[tool.name] = tool.label; } if (tool.next) { tool.next = $.escapeSelector(tool.next); } let existingTool = tools.find(t => t.name === tool.name); if (existingTool) { Object.assign(existingTool, tool); } else { tools.push(tool); } let escapedName = existingTool && $.escapeSelector(tool.name); let $allTools = $('.listtools'); $allTools.each(function (i) { addTool($allTools.eq(i), tool, escapedName); }); }; let getWatched = async titles => { if (!Array.isArray(titles)) { titles = [...titles].slice(0, 500); } if (!titles.length) return; (await new mw.Api().post({ action: 'query', titles: titles.slice(0, 50), prop: 'info', inprop: 'watched', formatversion: 2 }, { headers: { 'Promise-Non-Write-API-Action': 1 } })).query.pages.forEach(page => { if (!page.watched) return; $(`.listtools-watch > a[href="${mw.util.getUrl(page.title, { action: 'watch' })}"]`) .attr('href', mw.util.getUrl(page.title, { action: 'unwatch' })) .text(getMsg('unwatch')); }); getWatched(titles.slice(50)); }; mw.hook('listtools.ready').fire(extend); let catTreeCallback = (records, observer) => { let $links = $(records[0].target).find('.CategoryTreeItem > bdi > a'); if ($links.length) { observer.takeRecords(); observer.disconnect(); processLinks($links, catTreeModule); } }; let catTreeModule = { selector: '.CategoryTreeItem > bdi > a', types: [14, 'CategoryTree'], position: 'end', post: $tools => { $tools.parent().next('.CategoryTreeChildren').each(function () { new MutationObserver(catTreeCallback) .observe(this, { childList: true }); }); } }; let modules = [ { selector: '#mw-pages li > a, #mw-pages li > span > a', types: [14] }, catTreeModule, { selector: '#mw-imagepage-section-linkstoimage a, #mw-imagepage-section-globalusage a', types: [6] }, { selector: '#mw-globalusage-result a', types: ['GlobalUsage'] }, { selector: '.mw-search-result-heading > a, .searchalttitle > a.mw-redirect, .iw-result__title > a, .mw-search-exists a', types: ['Search'] }, { selector: '.mw-search-createlink a', types: ['Search'], titlesOnly: true }, { selector: '#watchlist-edit-form .cdx-table td > label > a', types: ['EditWatchlist'] }, { selector: '.plainlinks > li > a', types: ['AbuseLog'], titlesOnly: true }, { selector: '#mw-allmessagestable td:first-child > a:first-child:not(.new)', types: ['Allmessages'], position: 'end' }, { selector: '.mw-spcontent li a', types: ['DisambiguationPageLinks', 'Listredirects'], titlesOnly: true }, { selector: 'li > a:first-child', types: ['FileDuplicateSearch'] }, { selector: '.TablePager_col_title > a:first-child, .TablePager_col_template > a', types: ['LintErrors'], post: $tools => { $tools.parent().contents().slice(3).remove(); } }, { selector: 'form > ul > li > a', types: ['Nuke'], position: 'end', titlesOnly: true }, { selector: '.page-assessments a', types: ['PageAssessments'], titlesOnly: true }, { selector: '.TablePager_col_pr_page > a', types: ['Protectedpages'], position: 'end' }, { selector: '#mw-content-text > ul a', types: ['Protectedtitles'], position: 'end' }, { selector: '.mw-fr-pending-changes-page-title', types: ['PendingChanges'], post: $tools => { $tools.parent().contents().slice(3).remove(); } }, { selector: '#mw-content-text > ul a:first-child', types: ['StablePages'], position: 'end' }, { selector: '.TablePager_col__page a', types: ['TopicSubscriptions'] }, { selector: '.undeleteResult > a', types: ['Undelete'], position: 'end', useText: true }, { selector: '.TablePager_col_img_name > a:first-child', // types: ['Listfiles'], position: 'end' }, { selector: '.mw-newpages-pagename', post: $tools => { let $nodes = $tools.parent().contents(); $nodes.slice( $nodes.index($tools) + 1, $nodes.index($nodes.filter('.mw-newpages-length')) ).replaceWith(' '); } }, { selector: '#mw-whatlinkshere-list li > bdi > a' }, { selector: '.mw-changeslist-log-entry > a:not(.mw-changeslist-log-gblblock a, .mw-changeslist-log-globalauth a)', titlesOnly: true }, { selector: '.mw-logevent-loglines > li:not(.mw-logline-gblblock, .mw-logline-globalauth) > a', types: ['Log'], titlesOnly: true }, { selector: '#mw-diff-otitle1 > strong > a, #mw-diff-ntitle1 > strong > a', types: ['ComparePages'], position: 'end' }, { selector: '#movepage-oldlink, #movepage-newlink', types: ['Movepage'] }, { selector: '.mw-undelete-revision a:not(.mw-userlink, .mw-usertoollinks > a)', types: ['Undelete'], useText: true }, { selector: '.galleryfilename, ' + '.mw-allpages-chunk > li > a, ' + '.mw-prefixindex-list > li > a, ' + '.mw-changeslist-line.mw-changeslist-src-mw-categorize .mw-changeslist-line-inner > .comment > a, ' + '.mw-changeslist-line.mw-changeslist-src-mw-categorize .mw-changeslist-line-inner-comment > .comment > a, ' + '.mw-changeslist-line.mw-changeslist-src-mw-categorize .mw-enhanced-rc-nested > .comment > a' }, { selector: '.mw-spcontent li a', position: 'end', titlesOnly: true } ]; if (isEdit) { let post = $tools => { if (!$tools[0].closest('.templatesUsed')) return; $tools.parent().contents().last().each(function () { this.textContent = this.textContent.slice(1); }).end().slice(-3, -1).remove(); }; let callback = mw.util.debounce(() => { processLinks( $('.mw-editfooter-list a, #wikiPreview > .previewnote a'), { titlesOnly: true, post } ); }, 500); mw.hook('wikipage.editform').add($form => { callback(); $form.find('.templatesUsed').each(function () { if (processed.has(this)) return; processed.add(this); new MutationObserver(callback) .observe(this, { childList: true, subtree: true }); }); }); } else if (typeof pageType === 'number') { $(() => { processLinks($('.subpages a, .mw-redirectedfrom a, .redirectText a'), {}); }); } mw.hook('wikipage.content').add($content => { let titles = new Set(); let $links = $content.find('a'); modules.forEach(module => { if (module.types && !module.types.includes(pageType)) return; processLinks($links.filter(module.selector), module, titles); }); getWatched(titles); }); }()); mw.hook('listtools.ready').add(extend => { // extend({ // name: 'talk', // url: t => !t.isTalkPage() && t.canHaveTalkPage() && t.getTalkPage().getUrl(), // next: 'hist' // }); extend({ name: 'subject', url: t => t.isTalkPage() && t.getSubjectPage().getUrl(), next: 'hist' }); extend({ name: 'last', url: t => !t.missing && t.getUrl({ diff: 'cur', diffonly: 1 }), next: 'links' }); // extend({ // name: 'purge', // url: t => t.getUrl({ action: 'purge' }), // next: 'watch', // callback: function (e) { // e.preventDefault(); // let $link = $(this); // let $wrapper = $link.parent(); // $link.detach(); // $wrapper.text('purging'); // let pn = $wrapper.closest('.listtools').data('listtools').toText(); // new mw.Api().post({ // action: 'purge', // forcelinkupdate: 1, // titles: pn, // formatversion: 2 // }).then(response => { // if (response.purge[0].purged) { // mw.notify(`Purged "${pn}"'`); // } // }).always(() => { // $wrapper.html($link); // }); // } // }); extend({ name: 'copy', url: '#', callback: function (e) { e.preventDefault(); let text = $(this).closest('.listtools').data('listtools').toText(); let $input = $('<input>').attr({ type: 'text', readonly: '', style: 'position:fixed;top:-100%' }).val(text).appendTo(document.body); $input[0].select(); let copied; try { copied = document.execCommand('copy'); } catch (err) {} $input.remove(); if (copied) { mw.notify(`Copied "${text}"`); } else { mw.notify('Copy failed', { type: 'error' }); } } }); }); (mw.config.get('wgNamespaceNumber') || mw.config.get('wgAction') !== 'view') && mw.config.get('wgCanonicalSpecialPageName') !== 'GlobalContributions' && (function consecudiff() { mw.loader.addStyleTag('.consecudiff::before{content:" ["} .consecudiff::after{content:"]"} .consecudiff-top::before{content:" ⟨"} .consecudiff-top::after{content:"⟩"}'); let isHist = mw.config.get('wgAction') === 'history'; class Consecudiff { constructor(lis, isContribs) { this.isContribs = isContribs; this.isEnhanced = !isHist && !isContribs && lis[0].classList.contains('mw-enhanced-rc'); this.threshold = isContribs ? window.consecudiffContribsThreshold || 120 : isHist ? window.consecudiffHistThreshold || 720 : window.consecudiffThreshold || 720; this.strictMode = !isContribs && !!window.consecudiffDetectInterruptions; this.diffSelector = isHist ? 'a.mw-history-histlinks-previous' : '.mw-changeslist-diff'; this.permaSelector = this.isEnhanced && '.mw-enhanced-rc-time > a' || (isHist || isContribs) && 'a.mw-changeslist-date'; this.hybridSelector = this.diffSelector; if (this.permaSelector) { this.hybridSelector += ', ' + this.permaSelector; } this.topClass = isContribs ? 'mw-contributions-current' : 'mw-changeslist-last'; let dependencies = ['mediawiki.util']; if ((isHist || isContribs) && mw.config.get('wgUserLanguage') !== 'en') { dependencies.push('mediawiki.language.months'); } mw.loader.using(dependencies, () => { let chunks; if (isHist) { chunks = this.chunkByUser(lis); } else { chunks = []; this.groupByTitle(lis).forEach(group => { chunks.push(...this.chunkByUser(group)); }); } let subchunks = []; chunks.forEach(chunk => { subchunks.push(...this.divideByDate(chunk)); }); let linkPairs = []; subchunks.forEach(subchunk => { linkPairs.push(...this.makeLinks(subchunk)); }); linkPairs.forEach(([$span, parent]) => { $span.appendTo(parent); }); }); } groupByTitle(lis) { let selector = this.isContribs ? '.mw-contributions-title' : '.mw-changeslist-title'; let lisByTitle = {}; lis.forEach(li => { let link = (this.isEnhanced ? li.closest('table') : li) .querySelector(selector); if (!link) return; let title = link.textContent; if (!lisByTitle.hasOwnProperty(title)) { lisByTitle[title] = []; } lisByTitle[title].push(li); }); return Object.values(lisByTitle).filter(group => group.length > 1); } chunkByUser(lis) { if (this.isSingleContribs) { return [lis]; } let chunks = [], lastSplitAt = 0, prevUser; this.isSingleContribs = lis.some((li, i) => { let link = li.querySelector('.mw-userlink'); if (!link && this.isContribs) { return true; } let user = link && link.textContent; if (!link || i && user !== prevUser) { chunks.push(lis.slice(lastSplitAt, i)); lastSplitAt = i; } prevUser = user; }); if (this.isSingleContribs) { return [lis]; } chunks.push(lis.slice(lastSplitAt)); return chunks.filter(chunk => chunk.length > 1); } divideByDate(lis) { let chunks = [], lastSplitAt = 0, prevDate; lis.forEach((li, i) => { let date; if (isHist || this.isContribs) { date = this.parseDate( li.querySelector('.mw-changeslist-date').textContent ); } else { date = Date.parse( li.dataset.mwTs.replace(/(....)(..)(..)(..)(..)(..)/, '$1-$2-$3T$4:$5:$6Z') ); } if (date) { date = date / 60000; } if (i && prevDate - date > this.threshold) { chunks.push(lis.slice(lastSplitAt, i)); lastSplitAt = i; } prevDate = date; if (!this.strictMode || lastSplitAt === i) return; let prevDiff = lis[i - 1].querySelector(this.diffSelector); if (prevDiff) { let prevNext = mw.util.getParamValue('oldid', prevDiff.search); if (prevNext !== li.dataset.mwRevid) { chunks.push(lis.slice(lastSplitAt, i)); lastSplitAt = i; } } }); chunks.push(lis.slice(lastSplitAt)); return chunks.filter(chunk => chunk.length > 1); } makeLinks(lis) { let count = lis.length; let firstPerma; let start = lis.findIndex(li => ( firstPerma = li.querySelector(this.hybridSelector) )); if (start === -1 || count - start < 2) return []; let end, lastDiff; for (let i = count - 1; i > start; i--) { if (!isHist && !this.isContribs) { lastDiff = lis[i].querySelector(this.diffSelector); if (lastDiff || lis[i].classList.contains('mw-changeslist-src-mw-new') ) { end = i + 1; break; } } if (this.permaSelector && lis[i].querySelector(this.permaSelector)) { end = i + 1; break; } } if (!end) return []; count = end - start; let params = { diff: lis[start].dataset.mwRevid }; if (lastDiff) { params.oldid = mw.util.getParamValue('oldid', lastDiff.search); } else { params.oldid = lis[end - 1].dataset.mwRevid; if (isHist && lis[end - 1].querySelector(this.diffSelector) || this.isContribs && !lis[end - 1].querySelector('.newpage') ) { params.direction = 'prev'; } } let title = !isHist && mw.util.getParamValue('title', firstPerma.search); let url = mw.util.getUrl(title, params); let classes = 'consecudiff'; if (!isHist && lis[start].classList.contains(this.topClass)) { classes += ' consecudiff-top'; } return lis.slice(start, end).map((li, i) => [ $('<span>').addClass(classes).append( $('<a>') .attr('href', url) .text(this.convertNumber(count - i + '/' + count)) ), this.isEnhanced ? li.tagName === 'TR' ? li.lastElementChild : li.querySelector('.mw-changeslist-line-inner') : li ]); } parseDate(s) { let date = Date.parse(s); if (date) { return date; } if (s.includes(',')) date = Date.parse(s.replace(',', '')); if (date) { return date; } if (mw.loader.getState('mediawiki.language.months') !== 'ready') return; s = s.replace(/\D/g, c => { let n = mw.language.convertNumber(c, true); return Number.isNaN(n) ? c : n; }); let h, m; s = s.replace(/(\d\d?)[.:h](\d\d?)/, ($0, $1, $2) => { h = $1; m = $2; return ' '; }); if (!h) return; let y, dateFirst; s = s.replace(/^(.*?)(\d{4})(?!\d)/, ($0, $1, $2) => { y = $2; dateFirst = /\d/.test($1); return $1 + ' '; }); if (!y) return; let mo, d; if (dateFirst) { [d, s] = this.getDate(s); if (!d) return; [mo, s] = this.getMonth(s); if (mo === -1) return; } else { [mo, s] = this.getMonth(s); if (mo === -1) return; [d, s] = this.getDate(s); if (!d) return; } return new Date(y, mo, d, h, m).getTime(); } getMonth(s) { if (!this.months) { this.months = mw.language.months.abbrev .concat(mw.language.months.names, mw.language.months.genitive) .reverse(); } let mo = this.months.findIndex(mn => { let temp = s.replace(mn, ' '); if (temp !== s) { s = temp; return true; } }); if (mo === -1) { let [numeric, temp] = this.getDate(s); numeric = parseInt(numeric); if (numeric > 0 && numeric < 13) { mo = numeric - 1; s = temp; } } else { mo = 11 - mo % 12; } return [mo, s]; } getDate(s) { let d; s = s.replace(/(^|\D)(\d\d?)(?!\d)/, ($0, $1, $2) => { d = $2; return $1 + ' '; }); return [d, s]; } convertNumber(num) { try { return mw.language.convertNumber(num); } catch (e) { return num; } } } mw.hook('wikipage.content').add($content => { $content.find('.mw-pager-body').each(function () { let lis = this.querySelectorAll('.mw-contributions-list > li'); if (lis.length > 1) { new Consecudiff([...lis], !isHist); } }); if (isHist) return; let $lists = $content.filter('.mw-changeslist'); if (!$lists.length) { $lists = $content.find('.mw-changeslist'); } $lists.each(function () { let lis = this.querySelectorAll('.mw-changeslist-edit:not(.mw-changeslist-src-mw-categorize)[data-mw-revid]'); if (lis.length > 1) { new Consecudiff([...lis]); } }); }); }()); if (mw.config.get('wgNamespaceNumber') === 14 && ( mw.config.get('wgAction') === 'view' || !mw.config.get('wgArticleId') )) { mw.loader.load('//test.wikipedia.org/w/index.php?title=User:Nardog/sandbox8.js&action=raw&ctype=text/javascript'); mw.loader.using([ 'mediawiki.api', 'mediawiki.util', 'mediawiki.DateFormatter', 'oojs-ui-widgets', 'mediawiki.widgets', 'mediawiki.widgets.UserInputWidget', 'mediawiki.widgets.datetime', 'oojs-ui.styles.icons-interactions', 'oojs-ui.styles.icons-movement', 'mediawiki.interface.helpers.styles', 'user.options' ]); } $(function moveHistory() { if (!document.getElementById('p-tb')) return; mw.loader.using('mediawiki.util', () => { let clicked; mw.util.addPortletLink('p-tb', '#', 'Move history', 't-movehistory').firstElementChild.addEventListener('click', e => { e.preventDefault(); if (clicked) { if (window.moveHistoryDialog) { window.moveHistoryDialog.open(); } return; } clicked = true; mw.loader.load('//test.wikipedia.org/w/index.php?title=User:Nardog/sandbox5.js&action=raw&ctype=text/javascript'); mw.loader.using([ 'mediawiki.api', 'mediawiki.util', 'mediawiki.Title', 'mediawiki.DateFormatter', 'oojs-ui-windows', 'oojs-ui-widgets', 'mediawiki.widgets', 'mediawiki.widgets.DateInputWidget', 'oojs-ui.styles.icons-interactions', 'mediawiki.interface.helpers.styles' ]); }); }); }); $(function sectionSearch() { if (!document.getElementById('p-tb')) return; mw.loader.using('mediawiki.util', () => { let clicked; mw.util.addPortletLink('p-tb', '#', 'Section search', 't-sectionsearch').firstElementChild.addEventListener('click', e => { e.preventDefault(); if (clicked) { if (window.sectionSearchDialog) { window.sectionSearchDialog.open(); } return; } clicked = true; mw.loader.load('//test.wikipedia.org/w/index.php?title=User:Nardog/sandbox7.js&action=raw&ctype=text/javascript'); mw.loader.using([ 'mediawiki.api', 'mediawiki.util', 'oojs-ui-core', 'oojs-ui-windows', 'mediawiki.widgets', 'mediawiki.widgets.NamespacesMultiselectWidget' ]); }); }); }); mw.config.get('wgCanonicalSpecialPageName') === 'CentralAuth' && mw.loader.using('jquery.tablesorter', function sortCentralAuthByEditCount() { mw.hook('wikipage.content').add($content => { let $table = $content.find('.mw-centralauth-wikislist').has('td'); if (!$table.length) return; $table.tablesorter().data('tablesorter').sort([{ 4: 'desc' }, { 1: 'asc' }]); }); }); ['edit', 'submit'].includes(mw.config.get('wgAction')) && [10, 828].includes(mw.config.get('wgNamespaceNumber')) && !mw.config.get('wgTitle').endsWith('/doc') && mw.loader.load('//en.wikipedia.org/w/index.php?title=User:Nardog/AutoTestcases.js&action=raw&ctype=text/javascript', 's'); // ['edit', 'submit'].includes(mw.config.get('wgAction')) && // mw.loader.load('//en.wikipedia.org/w/index.php?title=User:Nardog/TemplatePreviewGuard.js&action=raw&ctype=text/javascript', 's'); // ['edit', 'submit'].includes(mw.config.get('wgAction')) && // $(function templatePreviewGuard() { // let button = document.querySelector('input[name="wpTemplateSandboxPreview"]'); // if (!button) return; // let proceed; // button.addEventListener('click', e => { // if (proceed) { // proceed = false; // return; // } // e.preventDefault(); // e.stopPropagation(); // let formData = new FormData(button.form); // let page = formData.get('wpTemplateSandboxPage'); // let temp = formData.get('wpTemplateSandboxTemplate'); // if (!page || !temp) return; // mw.loader.using('mediawiki.api').then(() => ( // new mw.Api().get({ // action: 'query', // titles: page, // prop: 'templates', // tltemplates: temp, // formatversion: 2 // }) // )).always(response => { // if (((((response || {}).query || {}).pages || [])[0] || {}).templates || // confirm(`"${page}" doesn't appear to transclude "${temp}". Continue?`) // ) { // proceed = true; // button.click(); // } // }); // }, true); // if (!mw.config.get('wgArticleId')) return; // let widgetEl = document.querySelector('#wpTemplateSandboxPage.oo-ui-widget'); // if (!widgetEl) return; // let pn = mw.config.get('wgPageName').replace(/_/g, ' '); // mw.loader.using(['mediawiki.api', 'oojs-ui-core']).then(() => ( // new mw.Api().get({ // action: 'query', // titles: pn, // prop: 'transcludedin', // tiprop: 'title', // tilimit: 'max', // formatversion: 2 // }) // )).then(response => { // if (!response.batchcomplete) return; // let pages = response.query.pages[0].transcludedin // .filter(o => o.title !== pn); // if (!pages.length) return; // let widget = OO.ui.infuse(widgetEl); // if (pages.length === 1) { // widget.setValue(pages[0].title); // return; // } // widget.$element.replaceWith( // new OO.ui.ComboBoxInputWidget({ // id: 'wpTemplateSandboxPage', // maxlength: widget.$input.prop('maxLength'), // name: widget.$input.prop('name'), // options: pages // .sort((a, b) => a.ns - b.ns || -(a.title < b.title)) // .map(o => ({ data: o.title })), // placeholder: widget.$input.prop('placeholder'), // tabIndex: widget.getTabIndex(), // value: widget.getValue() // }).on('enter', e => { // e.preventDefault(); // button.click(); // }).$element // ); // }); // }); ['edit', 'submit'].includes(mw.config.get('wgAction')) && mw.config.get('wgArticleId') && mw.config.get('wgPageContentModel') === 'wikitext' && mw.loader.load('//en.wikipedia.org/w/index.php?title=User:Nardog/AutoSectionLink.js&action=raw&ctype=text/javascript', 's'); (mw.config.get('wgNamespaceNumber') === -1 || mw.config.exists('wgDiffNewId') || mw.config.get('wgAction') === 'history') && (function copyRevId() { let handler = function (e) { e.preventDefault(); let text = this.closest('.diff td')?.querySelector('[data-mw-revid]')?.dataset.mwRevid || this.closest('[data-mw-revid]')?.dataset.mwRevid; if (!text) return; let $input = $('<input>').attr({ type: 'text', readonly: '', style: 'position:fixed;top:-100%' }).val(text).appendTo(document.body); $input[0].select(); document.execCommand('copy'); $input.remove(); let copied; try { copied = document.execCommand('copy'); } catch {} $input.remove(); if (copied) { mw.notify(`Copied "${text}"`); } else { mw.notify('Copy failed', { type: 'error' }); } }; mw.hook('wikipage.diff').add($diff => { $diff.find('#mw-diff-otitle1, #mw-diff-ntitle1').append( ' (', $('<a>').attr({ href: '#', role: 'button' }).on('click', handler).text('id'), ')' ); }); if (mw.config.get('wgAction') !== 'history') return; mw.hook('wikipage.content').add($content => { $content.find('.mw-pager-tools').append( $('<span>').append( $('<a>').attr({ href: '#', role: 'button' }).on('click', handler).text('id') ) ); }); }()); (mw.config.get('wgNamespaceNumber') === -1 || mw.config.exists('wgDiffNewId') || mw.config.get('wgAction') === 'history') && (() => { let handler = async function (e) { e.preventDefault(); let td = this.closest('.diff td'); let rev = td ? td.querySelector('[data-mw-revid]')?.dataset.mwRevid : this.closest('[data-mw-revid]')?.dataset.mwRevid; if (!rev) { mw.notify(`Couldn't get the revision.`, { tag: 'markasunseen', type: 'error' }); return; } let pn = td ? new URLSearchParams([...td.querySelectorAll('a')].pop()?.search).get('title') : mw.config.get('wgPageName'); if (!pn) return; await mw.loader.using('mediawiki.api'); let result = (await new mw.Api().postWithEditToken({ action: 'setnotificationtimestamp', [td ? 'newerthanrevid' : 'torevid']: rev, titles: pn, formatversion: 2 })).setnotificationtimestamp?.[0]; if (Object.hasOwn(result, 'notificationtimestamp')) { mw.notify(`Marked revisions ${td ? 'after' : 'since'} ${rev} as unseen.`, { tag: 'markasunseen', type: 'success' }); } else if (result?.notwatched) { mw.notify('This page is not on your watchlist.', { tag: 'markasunseen', type: 'warn' }); } else { mw.notify(`Couldn't mark revisions ${td ? 'after' : 'since'} ${rev} as unseen.`, { tag: 'markasunseen', type: 'error' }); } }; mw.hook('wikipage.diff').add($diff => { $diff.find('#mw-diff-otitle1').append( ' (', $('<a>').attr({ href: '#', role: 'button', title: 'Mark revisions after this one as unseen' }).on('click', handler).text('unseen'), ')' ); }); if (mw.config.get('wgAction') !== 'history') return; mw.hook('wikipage.content').add($content => { $content.find('.mw-pager-tools').append( $('<span>').append( $('<a>').attr({ href: '#', role: 'button', title: 'Mark revisions since this one as unseen' }).on('click', handler).text('unseen') ) ); }); })(); (mw.config.get('wgNamespaceNumber') === -1 || mw.config.exists('wgDiffNewId') || mw.config.get('wgAction') === 'history') && ((mw.config.get('wgNamespaceNumber') % 2 || mw.config.get('wgNamespaceNumber') === 4) || (mw.config.get('wgWikiID') === 'metawiki' && mw.config.get('wgPageContentModel') === 'wikitext')) && mw.loader.using(['mediawiki.util', 'mediawiki.Title'], function copyUnsig() { let handler = function (e) { e.preventDefault(); let parent = this.closest('li, td'); let ts = parent.textContent.match(/\d\d:\d\d, \d\d? [A-Z][a-z]+ \d{4}/)?.[0]; if (!ts) return; let user = parent.querySelector('.mw-userlink').textContent; if (mw.util.isIPv6Address(user)) { user = user.toUpperCase(); } let temp = mw.util.isIPAddress(user) ? 'unsigned IP' : 'unsigned'; let text = `{{subst:${temp}|${user}|${ts}}}`; let $input = $('<input>').attr({ type: 'text', readonly: '', style: 'position:fixed;top:-100%' }).val(text).appendTo(document.body); $input[0].select(); let copied; try { copied = document.execCommand('copy'); } catch {} $input.remove(); if (copied) { mw.notify(`Copied "${text}"`); } else { mw.notify('Copy failed', { type: 'error' }); } }; mw.hook('wikipage.diff').add($diff => { $diff.find('#mw-diff-otitle1, #mw-diff-ntitle1').filter(function () { if (mw.config.get('wgWikiID') === 'metawiki') { return true; } let link = this.querySelector('strong > a') || this.parentElement.querySelector('#differences-prevlink, #differences-nextlink'); if (!link) return; let t = mw.Title.newFromText(mw.util.getParamValue('title', link.search)); return t.isTalkPage() || t.namespace === 4; }).append( ' (', $('<a>').attr({ href: '#', role: 'button' }).on('click', handler).text('sig'), ')' ); }); if (mw.config.get('wgAction') !== 'history') return; mw.hook('wikipage.content').add($content => { $content.find('.mw-pager-tools').append( $('<span>').append( $('<a>').attr({ href: '#', role: 'button' }).on('click', handler).text('sig') ) ); }); }); // mw.config.get('wgAction') === 'history' && // mw.loader.using('mediawiki.util', function () { // mw.hook('wikipage.content').add($content => { // $content.find('a.mw-changeslist-date').after(function () { // return [ // ' (', // $('<a>').attr('href', mw.util.getUrl(null, { // action: 'edit', // oldid: this.closest('li').dataset.mwRevid // })).text('e'), // ')' // ]; // }); // }); // }); // ['Contributions', 'IPContributions', 'Blankpage'].includes(mw.config.get('wgCanonicalSpecialPageName')) && // mw.hook('wikipage.content').add($content => { // $content.find('.mw-changeslist-history').parent().after(function () { // return $('<span>').append( // $('<a>').attr( // 'href', // this.firstElementChild.getAttribute('href').slice(0, -7) + 'edit' // ).text('e') // ); // }); // }); if (screen.width < 500) { mw.loader.addStyleTag('@font-face{font-family:CharisW;src:url(//fontlibrary.org/assets/fonts/charis/10b9f94ed21e56254b068c91ead7ec6f/017b2b2ad86e09d3c22b8cf0dfc78247/CharisSILRegular.ttf) format(truetype)} @font-face{font-family:CharisW;font-weight:700;src:url(//fontlibrary.org/assets/fonts/charis/10b9f94ed21e56254b068c91ead7ec6f/6f5069ac6a300dad45383c952e92c573/CharisSILBold.ttf) format(truetype)} body .IPA{font-family:CharisW,sans-serif} .mw-highlight-lines > pre{width:120em}'); location.hash && $(() => { let target = document.querySelector(':target'); if (target?.getBoundingClientRect().top < 0) { target.scrollIntoView(); } }); } ['edit', 'submit'].includes(mw.config.get('wgAction')) && (mw.config.exists('wgCodeEditorCurrentLanguage') || mw.config.exists('cmMode') && mw.config.get('cmMode') !== 'mediawiki') && (function saveNEdit() { let notif; $(document.body).on('click', '#wpSave', async function (e) { if (e.ctrlKey || e.shiftKey || e.metaKey || e.altKey || e.originalEvent?.defaultPrevented ) { return; } e.preventDefault(); await mw.loader.using([ 'mediawiki.api', 'mediawiki.util', 'jquery.textSelection', 'oojs-ui-core' ]); let button = OO.ui.infuse(this.parentElement).setDisabled(true); let $textarea = $('#wpTextbox1'); let text = $textarea.textSelection('getContents'); let $summary = $('#wpSummary'); let formData = new FormData(this.form); let promise = new mw.Api().postWithEditToken({ action: 'edit', title: mw.config.get('wgPageName'), text: text, section: formData.get('wpSection') || undefined, summary: $summary.textSelection('getContents'), [$('#wpMinoredit').prop('checked') ? 'minor' : 'notminor']: 1, baserevid: formData.get('editRevId'), basetimestamp: formData.get('wpEdittime'), starttimestamp: formData.get('wpStarttime'), watchlist: $('#wpWatchthis').prop('checked') ? 'watch' : 'unwatch', watchlistexpiry: formData.get('wpWatchlistExpiry') || undefined, undo: formData.get('wpUndidRevision') || undefined, undoafter: formData.get('wpUndoAfter') || undefined, contentformat: formData.get('format'), contentmodel: formData.get('model'), assertuser: mw.config.get('wgUserName'), formatversion: 2 }); notif?.close(); notif = null; try { let response = await promise; if (response?.edit?.result !== 'Success') throw ''; $('#editform > input[name="wpUndidRevision"], #editform > input[name="wpUndoAfter"]').remove(); $textarea.data('origtext', text).prop('defaultValue', text); $summary.val($summary.prop('defaultValue')); if (mw.loader.getState('mediawiki.editRecovery.edit') === 'ready') { let storage = mw.loader.moduleRegistry['mediawiki.editRecovery.edit'].packageExports['storage.js']; storage.deleteData(mw.config.get('wgPageName')); storage.closeDatabase(); } notif = await mw.notify(response.edit.nochange ? 'No change' : [ document.createTextNode('Saved'), $('<p>').append( new OO.ui.ButtonWidget({ href: mw.util.getUrl(), target: '_blank', label: 'View' }).$element, new OO.ui.ButtonWidget({ href: mw.util.getUrl(null, { diff: response.edit.newrevid || 'cur', diffonly: 1 }), target: '_blank', label: 'Diff' }).$element, new OO.ui.ButtonWidget({ href: mw.util.getUrl(null, { action: 'history' }), target: '_blank', label: 'History' }).$element )[0] ], { tag: 'savenedit' }); } catch (error) { notif = await mw.notify(error?.error?.info || error || 'Save failed', { autoHideSeconds: 'long', tag: 'savenedit', type: 'error' }); } finally { button.setDisabled(); } }); }()); mw.config.get('wgNamespaceNumber') === 0 && mw.config.get('wgAction') === 'view' && mw.config.get('wgCategories')?.some(c => c.endsWith(' actors') || c.endsWith(' actresses')) && $(() => { let n = $.escapeSelector(mw.config.get('wgTitle').replace(/ \(.+\)$/, '')); let $links = $(`.hatnote a[title$="${n} filmography"], .hatnote a[title*="${n} on "], .hatnote a[title*="${n} performances"]`); if (!$links.length) return; let titles = {}; $links = $links.filter(function () { let text = this.textContent; return !(titles[text] = Object.hasOwn(titles, text)); }); mw.notify( $links.length === 1 ? $links.clone() : $('<ul>').append($links.clone().wrap('<li>').parent()), { autoHideSeconds: 'long' } ); }); ['Recentchanges', 'Recentchangeslinked', 'Watchlist'].includes(mw.config.get('wgCanonicalSpecialPageName')) && $.when($.ready, mw.loader.using([ 'user.options', 'mediawiki.util', 'mediawiki.api' ])).then(function rcMuter() { let os = mw.user.options.get('userjs-rcmuter'); let set = new Set(os && os.split('|')); let save = () => { let ns = [...set].join('|'); if (ns === mw.user.options.get('userjs-rcmuter')) return; new mw.Api().saveOption('userjs-rcmuter', ns); mw.user.options.set('userjs-rcmuter', ns); $edit.attr('data-rcmuter', set.size); }; mw.loader.addStyleTag('body:not(.rcmuter-disabled) .rcmuter-muted{display:none !important} .rcmuter-edit::after, .rcmuter-togglemuted::after{content:": " attr(data-rcmuter)}'); let $edit = $('<a>').attr({ class: 'rcmuter-edit', href: '#', 'data-rcmuter': set.size }).text('Edit muted').on('click', e => { e.preventDefault(); mw.loader.using([ 'oojs-ui-windows', 'mediawiki.widgets.UsersMultiselectWidget' ]).then(() => OO.ui.getWindowManager().getWindow('message')).then(dialog => { let multiselect = new mw.widgets.UsersMultiselectWidget({ $overlay: dialog.$overlay, ipAllowed: true, selected: [...set] }).connect(dialog, { change: 'updateSize', reorder: 'updateSize' }); let instance = dialog.open({ message: $([ document.createTextNode('Muted users:'), multiselect.$element[0] ]), size: 'medium' }); instance.opened.then(() => { setTimeout(() => { multiselect.focus().menu.toggle(false); }); }); instance.closed.then(result => { if (!result || result.action !== 'accept') return; set = new Set(multiselect.getSelectedUsernames()); save(); mw.notify('Changes will take effect in next load.', { tag: 'rcmuter' }); }); }); }); let buttonsShown; let $toggleButtons = $('<a>').attr('href', '#').text('Show toggle buttons').on('click', function (e) { e.preventDefault(); if (buttonsShown) { mw.hook('wikipage.content').remove(addButtons); $('.rcmuter-toggle').remove(); this.textContent = 'Show toggle buttons'; } else { mw.hook('wikipage.content').add(addButtons); this.textContent = 'Hide toggle buttons'; } buttonsShown = !buttonsShown; }); let $toggle = $('<a>').attr({ class: 'rcmuter-togglemuted', href: '#' }).text('Show muted').on('click', function (e) { e.preventDefault(); this.textContent = document.body.classList.toggle('rcmuter-disabled') ? 'Hide muted' : 'Show muted'; }); let $toggleSpan = $('<span>').hide().append($toggle); mw.util.addSubtitle( $('<span>').addClass('mw-changeslist-links').append( $('<span>').append($edit), $('<span>').append($toggleButtons), $toggleSpan )[0] ); let toggle = function (e) { e.preventDefault(); let user = $(this) .closest('.mw-userlink ~ .mw-usertoollinks, .mw-changeslist-line-inner-userLink ~ .mw-changeslist-line-inner-userTalkLink') .prevAll('.mw-userlink, .mw-changeslist-line-inner-userLink') .last().text().trim(); if (!user) { mw.notify(`Can't retrieve the username.`, { tag: 'rcmuter', type: 'error' }); return; } let muting = this.parentElement.classList.toggle('rcmuter-unmute'); set[muting ? 'add' : 'delete'](user); save(); this.textContent = muting ? 'unmute' : 'mute'; mw.notify(`${muting ? 'Muting' : 'Unmuting'} ${user} from next load.`, { tag: 'rcmuter' }); }; let addButtons = $content => { if (!$content.is('#mw-content-text, .mw-changeslist')) { $content = $('#mw-content-text'); if ($content.has('.rcmuter-toggle').length) return; } let $tools = $content.find('.mw-usertoollinks.mw-changeslist-links'); let $muted = $tools.filter('.rcmuter-muted *'); $tools.not($muted).append( $('<span>').addClass('rcmuter-toggle').append( $('<a>').attr('href', '#').text('mute').on('click', toggle) ) ); if (!$muted.length) return; $muted.append( $('<span>').addClass('rcmuter-toggle rcmuter-unmute').append( $('<a>').attr('href', '#').text('unmute').on('click', toggle) ) ); }; let mutedCount; let filter = function () { let muted = set.has(this.textContent); if (muted) mutedCount++; return muted; }; mw.hook('wikipage.content').add($content => { if (!$content.is('#mw-content-text, .mw-changeslist')) return; if (!set.size) { $toggleSpan.hide(); return; } mutedCount = 0; $content.find('.changedby > .mw-userlink:only-child') .filter(filter).closest('table').addClass('rcmuter-muted'); $content.find('.mw-userlink:not(.changedby > *, .comment *, .rcmuter-muted *)') .filter(filter).closest('.mw-changeslist-line, table').addClass('rcmuter-muted') .closest('table.mw-enhanced-rc').find('.changedby > .mw-userlink').filter(filter).addClass('rcmuter-muted'); $toggleSpan.toggle(!!mutedCount); $toggle.attr('data-rcmuter', mutedCount); }); }); location.hostname.endsWith('.wikipedia.org') && mw.config.get('wgNamespaceNumber') % 2 === 0 && // mw.config.get('wgArticleId') && mw.config.get('wgPageContentModel') === 'wikitext' && $.when($.ready, mw.loader.using('mediawiki.util')).then(function refRenamer() { if (!document.getElementById('p-tb')) return; let messages = Object.assign({ portlet: 'RefRenamer', loading: 'Loading RefRenamer...' }, window.refrenamerMessages); let clicked; mw.util.addPortletLink('p-tb', '#', messages.portlet, 't-refrenamer').firstElementChild.addEventListener('click', e => { e.preventDefault(); if (clicked) { if (window.refRenamer) { window.refRenamer(); } return; } clicked = true; mw.loader.load('//test.wikipedia.org/w/index.php?title=User:Nardog/sandbox6.js&action=raw&ctype=text/javascript'); mw.notify(messages.loading, { autoHideSeconds: 'long', tag: 'refrenamer' }); }); }); if (['edit', 'submit'].includes(mw.config.get('wgAction'))) { mw.loader.load('//en.wikipedia.org/w/index.php?title=User:Nardog/ExpandContractions.js&action=raw&ctype=text/javascript', 's'); mw.loader.load('//en.wikipedia.org/w/index.php?title=User:Nardog/Unpipe.js&action=raw&ctype=text/javascript', 's'); } mw.config.get('wgAction') !== 'history' && mw.loader.load('//en.wikipedia.org/w/index.php?title=User:Nardog/CopyCodeBlock.js&action=raw&ctype=text/javascript', 's'); mw.config.exists('wgDiffNewId') && mw.config.get('wgDiscussionToolsFeaturesEnabled') && (function () { let data = {}, clickHandler, autoClear, run; window.dtc = data; let highlight = revId => { let ids = data[revId]; if (!ids || !ids.length) return; mw.loader.moduleRegistry['ext.discussionTools.init'].packageExports['highlighter.js'] .highlightNewComments(mw.dt.pageThreads, true, ids); if (clickHandler) { $(document.body).off('click', clickHandler); return; } $._data(document.body, 'events').click.some(o => { if (String(o.handler).includes('highlighter.clearHighlightTargetComment(')) { $(document.body).off('click', o.handler); clickHandler = o.handler; return true; } }); $._data(window, 'events').popstate.some(o => { if (String(o.handler).includes('highlighter.highlightTargetComment(')) { $(window).off('popstate', o.handler); return true; } }); }; let scroll = revId => { let ids = data[revId]; if (!ids || !ids.length) return; let yToSpan = Object.fromEntries( ids.map(id => document.getElementById(id)).filter(Boolean) .map(span => [span.getBoundingClientRect().y, span]) ); let ys = Object.keys(yToSpan); if (!ys.length) return; let lower = ys.filter(y => y > 10); if (!lower.length || Math.max(...lower) < document.documentElement.clientHeight ) { yToSpan[Math.min(...ys)].scrollIntoView(); } else { yToSpan[Math.min(...lower)].scrollIntoView(); } }; let scrollToNext = function (e) { e.preventDefault(); let revId = mw.config.get('wgDiffOldId'); if (!revId || !data[revId]) return; let i = data[revId].indexOf( this.closest('[data-mw-thread-id]').dataset.mwThreadId ); if (i === -1) return; let next = data[revId][i + 1] || data[revId][0]; document.getElementById(next).scrollIntoView(); }; mw.hook('wikipage.content').add(async $content => { let revId = mw.config.get('wgDiffOldId'); if (!revId) return; let param = new URLSearchParams(location.search).get('diffonly'); if (param && param !== '0') return; if (data[revId]) { highlight(revId); return; } await mw.loader.using(['ext.discussionTools.init', 'mediawiki.util']); let begin = Date.parse($('#mw-diff-otitle1 .mw-diff-timestamp').data('timestamp')); data[revId] = mw.dt.pageThreads.getCommentItems() .filter(c => c.timestamp > begin).map(c => c.id); if (!data[revId].length) return; await new Promise(setTimeout); highlight(revId); $content.find('.ext-discussiontools-init-replylink-buttons').filter(function () { return data[revId].includes(this.dataset.mwThreadId); }).children('span:last-of-type').before( ' | ', $('<a>').attr({ href: '#', role: 'button' }).text('next').on('click', scrollToNext) ); if (run || !document.getElementById('p-tb')) return; run = true; let portlet = mw.util.addPortletLink('p-tb', '#', 'Scroll to next', 't-scrolltonext'); portlet.firstElementChild.addEventListener('click', e => { e.preventDefault(); scroll(mw.config.get('wgDiffOldId')); }); mw.util.addPortletLink('p-tb', '#', 'Toggle highlight', 't-togglehighlight').firstElementChild.addEventListener('click', e => { e.preventDefault(); autoClear = !autoClear; if (autoClear) { $(document.body).on('click', clickHandler)[0].click(); } else { highlight(mw.config.get('wgDiffOldId')); } }); mw.loader.addStyleTag(`#t-scrolltonext{position:fixed;bottom:${portlet.clientHeight}px} #t-togglehighlight{position:fixed;bottom:0}`); }); }()); mw.config.get('wgNamespaceNumber') === 6 && mw.config.get('wgAction') === 'view' && mw.hook('wikipage.content').add($content => { $content.find('.filehistory .mw-usertoollinks-contribs').after(function () { return [ ' | ', $('<a>').attr('href', `${ mw.config.get('wgScript') }?title=Special:ListFiles/${ this.pathname.replace(/^.+\//, '') }&ilshowall=1`).text('uploads') ]; }); }); ['edit', 'submit'].includes(mw.config.get('wgAction')) && mw.config.get('wgArticleId') && mw.config.get('wgPageContentModel') === 'wikitext' && $(function () { if (!$('input[name="wpSection"]').val()) return; mw.hook('wikipage.content').add(async $content => { let $refs = $content.find('.mw-ext-cite-warning-sectionpreview_no_text'); if (!$refs.length) return; let ids = {}; $refs.each(function () { ids[this.closest('[id]').id.replace(/-\d+$/, '')] = this; }); let response = await $.get(`/api/rest_v1/page/html/${encodeURIComponent(mw.config.get('wgPageName'))}`); $($.parseHTML(response)).find('.mw-reference-text').each(function () { ids[this.id.replace(/^mw-reference-text-|-\d+$/g, '')]?.replaceWith(this); }); }); }); mw.hook('moremenu.ready').add(config => { $('#mm-page-purge-cache > a').on('click', e => { e.preventDefault(); new mw.Api().post({ action: 'purge', forcelinkupdate: 1, titles: config.page.name, formatversion: 2 }).then(() => { location.href = mw.util.getUrl(); }); }); $('#mm-page-search-search-history-wikiblame > a').on('click', function (e) { e.preventDefault(); let q = prompt(); if (q === null) return; let href = this.href; if (q) { let removal = q[0] === '!'; if (removal) { q = q.slice(1); } href += '&needle=' + encodeURIComponent(q); if (removal) { href += '&binary_search_inverse=on'; } href += '&force_wikitags=on'; } open(href, '_blank'); }); $('#mm-page-expand-templates > a').on('click auxclick', function (e) { if (e.which > 2) return; e.preventDefault(); let revId = mw.config.get('wgRevisionId') || Number($('input[name=oldid]').val()); let url = revId ? '/w/rest.php/v1/revision/' + revId : '/w/rest.php/v1/page/' + config.page.encodedName; $.get(url).then(response => { $('<form>').attr({ method: 'post', action: this.href, target: '_blank' }).append( [ ['wpInput', response.source], ['wpContextTitle', config.page.name], ['wpRemoveComments', 1] ].map(([n, v]) => $('<input>').attr({ name: n, type: 'hidden' }).val(v)) ).appendTo(document.body).trigger('submit').remove(); }); }); }); mw.config.get('wgCanonicalSpecialPageName') === 'ApiSandbox' && mw.hook('apisandbox.formatRequest').add((...args) => { args[4].complete = function () { setTimeout(() => { mw.hook('wikipage.content').fire($('.oo-ui-pageLayout-active')); }, 100); }; }); ['edit', 'submit'].includes(mw.config.get('wgAction')) && mw.config.get('wgArticleId') && mw.config.get('wgPageContentModel') === 'wikitext' && $.when($.ready, mw.loader.using('mediawiki.storage')).then(async () => { let infuseAndCall = (query, method, ...args) => { let $widget = $(query); if ($widget.length) { return OO.ui.infuse($widget)[method](...args); } }; let section = $('input[name="wpSection"]').val(); if (section) { let $textarea = $('#wpTextbox1'); let source = $textarea.prop('defaultValue'); let save = () => { let newSource = $textarea.textSelection('getContents'); if (newSource === source) { mw.storage.session.remove('editfullpage'); } else { mw.storage.session.setObject('editfullpage', [ mw.config.get('wgPageName'), section, newSource.trimEnd(), infuseAndCall('#wpSummaryWidget', 'getValue') || '', Number(infuseAndCall('#wpMinoreditWidget', 'isSelected')) || 0, Number(infuseAndCall('#wpWatchthisWidget', 'isSelected')) || 0, infuseAndCall('#wpWatchlistExpiryWidget', 'getValue') || 'infinite' ]); } }; await mw.loader.using(['jquery.textSelection', 'oojs-ui-core']); setInterval(() => { mw.requestIdleCallback(save); }, 3000); window.addEventListener('beforeunload', save); return; } let data = mw.storage.session.getObject('editfullpage'); mw.storage.session.remove('editfullpage'); console.log(data); if (!data || data[0] !== mw.config.get('wgPageName')) return; let isNew = data[1] === 'new'; let isLead = data[1] === '0'; let $textarea = $('#wpTextbox1'); let source = $textarea.prop('defaultValue'); let newSource, start, msg, notifOpts = { autoHideSeconds: 'long' }; let orig = []; if (isNew) { await mw.loader.using(['jquery.textSelection', 'oojs-ui-core']); newSource = source + (data[3] ? '\n== ' + data[3] + ' ==\n\n' : '\n') + data[2] + '\n'; start = source.length; } else { await mw.loader.using(['jquery.textSelection', 'oojs-ui-core', 'mediawiki.api']); let { parse } = await new mw.Api().get({ action: 'parse', page: mw.config.get('wgPageName'), prop: 'sections', wrapoutputclass: '', disablelimitreport: 1, disableeditsection: 1, disabletoc: 1, formatversion: 2 }); let target = !isLead && parse.sections.find(s => s.index === data[1]); if (isLead || target) { let next = parse.sections.find(s => s.index - 1 === Number(data[1])); newSource = (isLead ? '' : [...source].slice(0, target.byteoffset)).join('') + data[2] + (next ? '\n\n' + [...source].slice(next.byteoffset).join('') : '\n'); start = isLead ? 0 : target.byteoffset; } else { newSource = source + '\n\n' + data[2] + '\n'; start = source.length; msg = `Section restored. Couldn't find the section. The source is appended at bottom.`; notifOpts.type = 'warn'; } orig[0] = infuseAndCall('#wpSummaryWidget', 'getValue'); infuseAndCall('#wpSummaryWidget', 'setValue', data[3]); } $textarea.textSelection('setContents', newSource); orig[1] = infuseAndCall('#wpMinoreditWidget', 'getSelected'); infuseAndCall('#wpMinoreditWidget', 'setSelected', data[4]); orig[2] = infuseAndCall('#wpWatchthisWidget', 'getSelected'); infuseAndCall('#wpWatchthisWidget', 'setSelected', data[5]); orig[3] = infuseAndCall('#wpWatchlistExpiryWidget', 'getValue'); infuseAndCall('#wpWatchlistExpiryWidget', 'setValue', data[6]); setTimeout(() => { $textarea.textSelection('setSelection', { start }); }); let notif = await mw.notify($([ document.createTextNode(msg || 'Section restored.'), $('<p>').append( new OO.ui.ButtonWidget({ flags: 'destructive', label: 'Discard' }).on('click', () => { $textarea.textSelection('setContents', source); if (orig[0]) { infuseAndCall('#wpSummaryWidget', 'setValue', orig[0]); } infuseAndCall('#wpMinoreditWidget', 'setSelected', orig[1]); infuseAndCall('#wpWatchthisWidget', 'setSelected', orig[2]); infuseAndCall('#wpWatchlistExpiryWidget', 'setValue', orig[3]); notif.close(); }).$element )[0] ]), notifOpts); }); mw.config.exists('wgPostEdit') && mw.loader.using('mediawiki.storage', () => { mw.storage.session.remove('editfullpage'); }); mw.config.get('wgAction') === 'history' && mw.hook('wikipage.content').add(async $content => { if (!$content.has('.mw-history-line-updated').length) return; let href = $content.find('a.mw-history-histlinks-current:not(.mw-history-line-updated a)').attr('href'); if (!href) { await mw.loader.using(['mediawiki.api', 'mediawiki.util']); let page = (await new mw.Api().get({ action: 'query', titles: mw.config.get('wgPageName'), prop: 'info', inprop: 'notificationtimestamp', formatversion: 2 })).query.pages[0]; let rev = (await new mw.Api().get({ action: 'query', titles: page.title, prop: 'revisions', rvprop: 'ids', rvlimit: 1, rvstart: Date.parse(page.notificationtimestamp) / 1000 - 1, formatversion: 2 })).query.pages[0].revisions?.[0].revid; if (!rev || rev >= page.lastrevid) return; href = mw.util.getUrl(page.title, { diff: page.lastrevid, oldid: rev }); } $content.find('.mw-history-compareselectedversions-button').first().after( ' ', $('<a>').attr({ class: 'unseendiff', href: href }).text('unseen') ); }); (async () => { let cspn = mw.config.get('wgCanonicalSpecialPageName'); let isBp = cspn === 'Blankpage'; if (!isBp && cspn !== 'Watchlist') return; await mw.loader.using('mediawiki.util'); let notify = async (text, options, pn) => { let msg = [document.createTextNode(text)]; if (pn) { msg.push( $('<p>').append( $('<a>').attr('href', mw.util.getUrl(pn)).text(pn), ' ', $('<span>').addClass('mw-changeslist-links').append( $('<span>').append( $('<a>') .attr('href', mw.util.getUrl(pn, { action: 'edit' })) .text('edit') ), $('<span>').append( $('<a>') .attr('href', mw.util.getUrl(pn, { action: 'history' })) .text('history') ) ) )[0] ); } if (isBp) { await $.ready; $('#mw-content-text').html(msg); } else { return mw.notify(msg, Object.assign(options || {}, { tag: 'unseendiff' })); } }; let getUrl = async pn => { await mw.loader.using('mediawiki.api'); let page = (await new mw.Api().get({ action: 'query', titles: pn, prop: 'info', inprop: 'notificationtimestamp', formatversion: 2 })).query.pages[0]; if (!page.notificationtimestamp) { notify(`Couldn't get the last seen time.`, { type: 'warn' }, pn); return; } let rev = (await new mw.Api().get({ action: 'query', titles: pn, prop: 'revisions', rvprop: 'ids', rvlimit: 1, rvstart: Date.parse(page.notificationtimestamp) / 1000 - 1, formatversion: 2 })).query.pages[0].revisions?.[0].revid; if (rev === page.lastrevid) { notify('Already seen.', { type: 'warn' }, pn); return; } if (!rev) { rev = (await new mw.Api().get({ action: 'query', titles: pn, prop: 'revisions', rvprop: 'ids', rvlimit: 1, rvstart: Date.parse(page.notificationtimestamp) / 1000 - 1, rvdir: 'newer', formatversion: 2 })).query.pages[0].revisions?.[0].revid; if (!rev) { notify(`Couldn't get the last seen revision.`, { type: 'warn' }, pn); return; } } if (rev > page.lastrevid) { notify(`Invalid rev for "${pn}" (rev: ${rev}, lastrevid: ${page.lastrevid})`, { autoHideSeconds: 'long', type: 'warn' }, pn); return; } return mw.util.getUrl(page.title, { diff: page.lastrevid, oldid: rev }); }; if (isBp) { let pn = mw.config.get('wgTitle').match(/^[^/]+\/unseendiff\/(.+)$/)?.[1]; if (!pn) return; notify('Loading...', null, pn); let href = await getUrl(pn); if (!href) return; notify('Redirecting...', null, pn); location.href = href; return; } let handler = async function (e) { if (e.which > 2) return; e.preventDefault(); let pn = this.dataset.pn; if (!pn) { notify(`Couldn't get the page name.`, { type: 'error' }); return; } let notifPromise = notify('Loading...', { autoHideSeconds: 'long' }); let href = await getUrl(pn); if (!href) return; $(`.unseendiff-loader[data-pn="${$.escapeSelector(pn)}"]`).attr({ class: 'unseendiff', href: href, target: '_blank' }).off('click auxclick', handler); if (e.type === 'auxclick' || e.ctrlKey || e.metaKey || e.shiftKey) { open(href); } else { this.click(); } (await notifPromise).close(); }; mw.hook('wikipage.content').add($content => { $content.find( '.mw-changeslist-src-mw-edit.mw-changeslist-watchedunseen:not(.mw-changeslist-watchedseen) .mw-changeslist-line-inner' ).each(function () { let pn = this.dataset.targetPage || this.closest('[data-target-page]')?.dataset.targetPage || this.closest('table.mw-enhanced-rc')?.querySelector('[data-target-page]')?.dataset.targetPage; if (!pn) return; $('<span>').append( $('<a>').attr({ class: 'unseendiff-loader', href: mw.util.getUrl(`Special:BlankPage/unseendiff/${pn}`), 'data-pn': pn }).on('click auxclick', handler).text('unseen') ).appendTo( [...this.querySelectorAll('.mw-pager-tools')].pop() || $('<span>').addClass('mw-changeslist-links mw-pager-tools').appendTo(this).before(' ') ); }); }); })(); ['Contributions', 'IPContributions', 'Blankpage'].includes(mw.config.get('wgCanonicalSpecialPageName')) && mw.loader.using('mediawiki.util', () => { let watched = new Set(); let query = async lis => { let titles = Object.keys(lis).slice(0, 50); if (!titles.length) return; await mw.loader.using('mediawiki.api'); let pages = (await new mw.Api().post({ action: 'query', titles: titles, prop: 'info', inprop: 'notificationtimestamp|watched', formatversion: 2 }, { headers: { 'Promise-Non-Write-API-Action': 1 } })).query.pages; for (let page of pages) { if (!Object.hasOwn(lis, page.title)) continue; if (page.watched) { watched.add(page); $(lis[page.title]).addClass('watched'); } if (!page.notificationtimestamp) continue; let rev = (await new mw.Api().get({ action: 'query', titles: page.title, prop: 'revisions', rvprop: 'ids', rvlimit: 1, rvstart: Date.parse(page.notificationtimestamp) / 1000 - 1, formatversion: 2 })).query.pages[0].revisions?.[0].revid; if (!rev || rev === page.lastrevid) continue; if (rev > page.lastrevid) { mw.notify($([ document.createTextNode('Invalid rev for "'), $('<a>').attr({ href: mw.util.getUrl(page.title, { action: 'history' }), target: '_blank' }).text(page.title)[0], document.createTextNode(`" (rev: ${rev}, lastrevid: ${page.lastrevid})`), ]), { autoHideSeconds: 'long', type: 'warn' }); continue; } $('<span>').append( $('<a>').attr({ class: 'unseendiff', href: mw.util.getUrl(page.title, { diff: page.lastrevid, oldid: rev }) }).text('unseen') ).appendTo( lis[page.title].map(li => ( [...li.querySelectorAll(':scope > .mw-pager-tools')].pop() || $('<span>').addClass('mw-changeslist-links mw-pager-tools').appendTo(li).before(' ') )) ); } titles.forEach(title => { delete lis[title]; }); query(lis); }; mw.hook('wikipage.content').add($content => { $content.find( '.mw-contributions-list > li:not(.mw-contributions-current)[data-mw-revid]' ).each(function () { let link = this.querySelector('a.mw-changeslist-date, a.mw-changeslist-history'); let pn = link ? new URLSearchParams(link.search).get('title') : ''; $('<span>').append( $('<a>').attr({ class: 'mw-changeslist-diff', href: mw.util.getUrl(pn, { diff: 'cur', oldid: this.dataset.mwRevid }) }).text('cur') ).appendTo( [...this.querySelectorAll(':scope > .mw-pager-tools')].pop() || $('<span>').addClass('mw-changeslist-links mw-pager-tools').appendTo(this).before(' ') ); }); if (mw.config.get('wgWikiID') === 'wikidatawiki') return; let lis = {}; $content.find('.mw-contributions-title').each(function () { let title = this.textContent; if (!Object.hasOwn(lis, title)) { lis[title] = []; } lis[title].push(this.closest('li')); }); Object.keys(lis).forEach(title => { if (watched.has(title)) { $(lis[title]).addClass('watched'); delete lis[title]; } }); query(lis); }); }); ['edit', 'submit'].includes(mw.config.get('wgAction')) && mw.loader.load('//test.wikipedia.org/w/index.php?title=User:Nardog/sandbox9.js&action=raw&ctype=text/javascript'); mw.config.get('wgWikiID') === 'metawiki' && (async () => { let css = mw.loader.addStyleTag(`.wishtitle { font-size: 90%; font-style: italic; word-break: break-word; } .wishtitle > a { color: var(--color-warning, #886425); } .wishtitle > a:visited { color: var(--border-color-warning--hover, #735421); } .wishtitle-declined > a { text-decoration: line-through; } .wishtitle-declined > a:hover, .wishtitle-declined > a:focus, .mw-underline-always .wishtitle-declined > a { text-decoration: line-through underline; } #watchlist-edit-form .wishtitle { display: inline-block; } .mw-search-result-heading > .wishtitle, .catchangesviewer-table .wishtitle { display: block; } .catchangesviewer-table:has(.wishtitle) { white-space: wrap; }`); let lang = mw.config.get('wgUserLanguage'); let titles; let loadTitles = async () => { await mw.loader.using('mediawiki.storage'); titles = titles || mw.storage.getObject('wishtitles'); if (titles?.lang !== lang) { titles = { lang, w: [], fa: [] }; } }; let updateTitles = async (crwstatuses, crwcontinue) => { await mw.loader.using('mediawiki.api'); let params = { action: 'query', list: 'communityrequests-wishes', crwlang: lang, crwstatuses: crwstatuses, crwprop: 'title|updated', crwsort: 'updated', crwdir: 'ascending', crwlimit: 'max', crwcontinue: crwcontinue, formatversion: 2 }; if (!crwcontinue && !crwstatuses && titles._) { params.crwcontinue = `|${titles._}|0`; } let response = await new mw.Api().get(params); let wishes = response?.query?.['communityrequests-wishes']; if (wishes?.length) { let $span = $('<span>'); wishes.forEach(w => { let id = w.crwtitle.match(/^Community Wishlist\/W(\d+)/)?.[1]; if (!id) return; titles.w[id - 1] = $span.html(w.title).text(); if (crwstatuses === 'declined') { (titles.wd = titles.wd || []).push(id - 1); } let faId = w.crfatitle?.match(/^Community Wishlist\/FA(\d+)/)?.[1]; if (!faId) return; titles.fa[faId - 1] = w.focusareatitle; }); if (!crwstatuses) { titles._ = wishes.at(-1).updated.replace(/\D/g, ''); } } let expiry = 86400; if (crwstatuses || crwcontinue) { let prev = mw.storage.getObject('_EXPIRY_wishtitles'); if (prev) { expiry = Math.round(Date.now() / 1000) + 86400 - prev; } } mw.storage.setObject('wishtitles', titles, expiry); crwcontinue = response?.continue?.crwcontinue; if (crwcontinue) { await updateTitles(crwstatuses, crwcontinue); } }; let getTitle = id => ( id[0] === 'W' ? titles.w[id.slice(1) - 1] : titles.fa[id.slice(2) - 1] ); let renderTitle = (title, id, tag = 'span') => { let classes = 'wishtitle'; if (id[0] === 'W' && titles.wd?.includes(id.slice(1) - 1)) { classes += ' wishtitle-declined'; } return $(`<${tag}>`).addClass(classes).append( $('<a>').attr({ href: `/wiki/Community_Wishlist/${id}`, title: `Community Wishlist/${id}` }).text(title) ); }; let callback = ([id, links]) => { let title = getTitle(id); if (!title) { return true; } $(links).after(' ', renderTitle(title, id)); }; let selector = '.mw-changeslist-title, ' + '.mw-changeslist-log-entry > a:not(.mw-userlink), ' + '.mw-changeslist-line.mw-changeslist-src-mw-categorize :is(.mw-changeslist-line-inner, .mw-changeslist-line-inner-comment, .mw-enhanced-rc-nested) > .comment > a, ' + '#watchlist-edit-form .cdx-table td > label > a, ' + '.mw-search-result-heading > a:not(:has(> .ext-communityrequests-entity-link--label)), ' + '.mw-contributions-title, ' + '#mw-whatlinkshere-list li > bdi > a, ' + '.mw-allpages-chunk > li > a, ' + '.mw-prefixindex-list > li > a, ' + '.mw-logevent-loglines > li > a, ' + '#mw-pages li > a, ' + '.catchangesviewer-table td:nth-child(3) > a'; mw.hook('wikipage.content').add(async $content => { let links = {}; $content.find('a').each(function () { if (!this.matches(selector)) return; let id = this.textContent.match( /^(?:Talk:|Translations:)?Community Wishlist\/((?:W|FA)\d+)/ )?.[1]; if (!id) return; (links[id] = links[id] || []).push(this); }); links = Object.entries(links); if (!links.length) return; await loadTitles(); links = links.filter(callback); if (!links.length) return; await updateTitles(); links = links.filter(callback); if (!links.length) return; await updateTitles('declined'); links.forEach(callback); }); let pn = mw.config.get('wgRelevantPageName'); let id = pn.match(/^(?:Talk:|Translations:)?Community_Wishlist\/((?:W|FA)\d+)/)?.[1]; if (!id) return; await $.ready; let extTitle = document.querySelector('.ext-communityrequests-wish--title'); if (extTitle && $('.mw-pt-languages-selected').attr('lang') === lang) return; await loadTitles(); let title = getTitle(id); if (!title) { await updateTitles(); title = getTitle(id); if (!title) { await updateTitles('declined'); title = getTitle(id); if (!title) return; } } let $title = renderTitle(title, id, 'div'); if (mw.config.get('skin') === 'vector-2022') { $title.prependTo('.vector-page-toolbar'); } else { $title.insertAfter('#firstHeading'); } css.textContent += ' .ext-communityrequests-entity-talk-header{display:none}'; if (extTitle) return; document.title = document.title.replace( pn.replaceAll('_', ' '), `${pn.replace(`Community_Wishlist/${id}`, title)} ($&)` ); })(); mw.config.get('wgWikiID') === 'metawiki' && mw.hook('wikipage.watchlistChange').add(async (isWatched, expiry) => { if (![0, 1].includes(mw.config.get('wgNamespaceNumber'))) return; let title = mw.config.get('wgTitle'); if (!/^Community Wishlist\/(?:W|FA)\d+$/.test(title)) return; if (isWatched) { await new mw.Api().watch(title + '/Votes', expiry); mw.notify('Watching /Votes too.'); } else { await new mw.Api().unwatch(title + '/Votes'); mw.notify('Unwatched /Votes too.'); } }); ['edit', 'submit'].includes(mw.config.get('wgAction')) && $(async () => { let $input = $('#wpTemplateSandboxTemplate'); if (!$input.length) return; mw.loader.addStyleTag('#templatesandbox-editform .oo-ui-fieldLayout{max-width:50em} #templatesandbox-editform .oo-ui-fieldLayout-field{flex-grow:999}'); let makeTemplateField = () => new OO.ui.FieldLayout( new mw.widgets.TitleInputWidget({ inputId: 'wpTemplateSandboxTemplate', name: 'wpTemplateSandboxTemplate', showMissing: false, value: $input.val() }), { label: 'Template name:' } ); if (mw.loader.getState('ext.TemplateSandbox') !== 'registered') { await mw.loader.using('mediawiki.widgets'); $input.parent().replaceWith(makeTemplateField().$element); return; } let require = await mw.loader.using([ 'ext.TemplateSandbox.TemplateSandboxTitleWidget', 'ext.TemplateSandbox.styles', 'jquery.makeCollapsible', 'user.options' ]); let widget = new (require('ext.TemplateSandbox.TemplateSandboxTitleWidget'))({ $overlay: true, id: 'wpTemplateSandboxPage', maxLength: 255, name: 'wpTemplateSandboxPage', placeholder: 'Page title', required: false, tabIndex: 10, templateTitleFunc: () => $('#wpTemplateSandboxTemplate').val() }); widget.$element.attr('data-ooui', '{"_":"mw.widgets.TemplateSandboxTitleWidget"}') .data('oouiInfused', widget); let fieldset = new OO.ui.FieldsetLayout({ classes: ['mw-templatesandbox-fieldset', 'mw-collapsed'], id: 'templatesandbox-editform', items: [ makeTemplateField(), new OO.ui.ActionFieldLayout( widget, new OO.ui.ButtonInputWidget({ id: 'wpTemplateSandboxPreview', name: 'wpTemplateSandboxPreview', label: 'Show preview', tabIndex: 10, type: 'submit', useInputTag: true }), { align: 'top' } ) ], label: 'Preview page with this template' }); fieldset.$label.append('&nbsp;', $('<span>').addClass('mw-collapsible-toggle-placeholder')); fieldset.$group.addClass('mw-collapsible-content'); $('#templatesandbox-editform').replaceWith(fieldset.$element.makeCollapsible()); let modules = ['ext.TemplateSandbox']; if (Number(mw.user.options.get('uselivepreview'))) { modules.push('ext.TemplateSandbox.preview'); } mw.loader.load(modules); }); mw.config.get('wgWikiID') === 'enwiki' && mw.config.get('wgCanonicalSpecialPageName') === 'Watchlist' && (async () => { mw.loader.addStyleTag('.xfdnotifier-sublinks::before{content:" ["} .xfdnotifier-sublinks::after{content:"]"} .xfdnotifier-sublinks > span:not(:first-child)::before{content:"\\2009·\\2009"} .mw-portlet.vector-menu[id^="p-xfdnotifier-"] a{display:inline}'); await mw.loader.using(['mediawiki.api', 'mediawiki.Title', 'mediawiki.storage']); let xfds = [ { id: 'rm', label: 'RM', full: 'Requested moves', cat: 'Requested moves', }, { id: 'rmt', label: 'RM/T', full: 'Requested moves (technical)', page: 'Wikipedia:Requested_moves/Technical_requests', titleExtractor: $page => ( $page.find(`[data-mw*='"wt":"RMassist/core"']`).closest('li').map(function () { return this.querySelector('a[rel="mw:WikiLink"]')?.title; }).get() ) }, { id: 'afd', label: 'AfD', full: 'Articles for deletion', cat: 'Articles for deletion' }, { id: 'mfd', label: 'MfD', full: 'Miscellaneous for deletion', cat: 'Miscellaneous pages for deletion' }, { id: 'tfd', label: 'TfD', full: 'Templates for deletion', cat: 'Templates for deletion' }, { id: 'tfm', label: 'TfM', full: 'Templates for merging', cat: 'Templates for merging' }, { id: 'cfd', label: 'CfD', full: 'Categories for deletion', cat: 'Categories for deletion' }, { id: 'cfr', label: 'CfR', full: 'Categories for renaming', cat: 'Categories for renaming' }, { id: 'cfsr', label: 'CfSR', full: 'Categories for speedy renaming', cat: 'Categories for speedy renaming' }, { id: 'cfm', label: 'CfM', full: 'Categories for merging', cat: 'Categories for merging' }, { id: 'cfs', label: 'CfS', full: 'Categories for splitting', cat: 'Categories for splitting' }, { id: 'cfl', label: 'CfL', full: 'Categories for listifying', cat: 'Categories for listifying' }, { id: 'cfc', label: 'CfC', full: 'Categories for conversion', cat: 'Categories for conversion' }, { id: 'cfgd', label: 'CfGD', full: 'Categories for general discussion', cat: 'Categories for general discussion' }, { id: 'ffd', label: 'FfD', full: 'Files for discussion', cat: 'Wikipedia files for discussion' }, { id: 'rfd', label: 'RfD', full: 'Redirects for discussion', cat: 'All redirects for discussion' }, { id: 'prod', label: 'PROD', full: 'Articles proposed for deletion', cat: 'All articles proposed for deletion' } ]; window.xfd = xfds; let queryTitles = async (xfd, titles) => { if (!titles.length) return; let response = await new mw.Api().get({ action: 'query', titles: titles.slice(0, 50), prop: 'info', inprop: 'watched', formatversion: 2 }); response?.query?.pages?.forEach(p => { if (p.watched) { xfd.pages.push(p.title); } }); await queryTitles(xfd, titles.slice(50)); }; let queryPage = async xfd => { let $page = $($.parseHTML(await $.get( `https://en.wikipedia.org/w/rest.php/v1/page/${encodeURIComponent(xfd.page)}/html` ))); await queryTitles(xfd, xfd.titleExtractor($page)); }; let queryCat = async (xfd, gcmcontinue) => { let response = await new mw.Api().get({ action: 'query', prop: 'info|categories', inprop: 'watched', clprop: 'sortkey', clcategories: `Category:${xfd.cat}`, generator: 'categorymembers', gcmtitle: `Category:${xfd.cat}`, gcmlimit: 'max', gcmsort: 'timestamp', gcmdir: 'older', gcmcontinue: gcmcontinue, formatversion: 2 }); response?.query?.pages?.forEach(p => { if (p.watched && p.categories?.[0]?.sortkeyprefix !== ' ') { xfd.pages.push(p.title); } }); if (response?.continue?.gcmcontinue) { await queryCat(xfd, response.continue.gcmcontinue); } }; let show = async (xfd, lastId, isCache) => { if (xfd.portlet && isCache) return; let portletId = 'p-xfdnotifier-' + xfd.id; if (xfd.portlet) { $(xfd.portlet).find('ul').empty(); if (!xfd.pages.length) return; } else { await $.ready; xfd.portlet = mw.util.addPortlet(portletId, xfd.label, '#' + lastId); } let $label = $(`#${portletId}-label`).attr('title', xfd.full); if (xfd.page) { $label.wrapInner($('<a>').attr('href', mw.util.getUrl(xfd.page))); } xfd.pages.forEach(p => { let t = mw.Title.newFromText(p); let isTalk = t.isTalkPage(); let $other = $('<a>').attr({ href: t[isTalk ? 'getSubjectPage' : 'getTalkPage']().getUrl(), title: isTalk ? 'subject' : 'talk' }).text(isTalk ? 's' : 't'); let link = mw.util.addPortletLink(portletId, t.getUrl(), p).querySelector('a'); $('<span>').addClass('xfdnotifier-sublinks').append( $('<span>').append($other), $('<span>').append( $('<a>').attr({ href: t.getUrl({ action: 'history' }), title: 'history' }).text('h') ) ).insertAfter(link); }); }; mw.hook('wikipage.content').add(mw.util.throttle(async () => { let cache = mw.storage.getObject('xfdnotifier') || {}; let lastId = 'p-tb'; for (let xfd of xfds) { let portletId = 'p-xfdnotifier-' + xfd.id; let now = Math.floor(Date.now() / 1000); if (now - cache[xfd.id]?.[0] < 600) { xfd.pages = cache[xfd.id].slice(1); await show(xfd, lastId, true); lastId = portletId; continue; } xfd.pages = []; if (xfd.cat) { await queryCat(xfd); } else if (xfd.page) { await queryPage(xfd); } cache[xfd.id] = [now, ...xfd.pages]; mw.storage.setObject('xfdnotifier', cache, 604800); await show(xfd, lastId); lastId = portletId; } }, 1800000)); })(); qokjvoo5p424gm3lz30whzb574lioj4 User:SongVĩ.Bot II 2 124239 739102 739037 2026-04-22T17:00:16Z SongVĩ.Bot II 52414 [[User:SongVĩ.Bot II|Task 0]]: Đã 1577 ngày... 739102 wikitext text/x-wiki Cập nhật lần cuối: 23-04-2026 Đã 1577 ngày... lul1kofeyaqadbgb57oeeb7cyadebnl Vorlage:Coordinate/LatRange 0 148890 739169 634624 2026-04-23T00:03:39Z InternetArchiveBot 34092 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 739169 wikitext text/x-wiki {{Infobox Gemeinde in Deutschland |Art = Stadt |Wappen = Reinbek Wappen.svg |Breitengrad = 53.510211 |Längengrad = 10.250318 |Lageplan = Reinbek in OD.svg |Bundesland = Schleswig-Holstein |Kreis = Stormarn |Höhe = 27 |PLZ = 21465 |Vorwahl = 040, 04104 |Gemeindeschlüssel = 01062060 |LOCODE = DE REI |Gliederung = [[Liste der Bezirke und Stadtteile Reinbeks|6 statistische Bezirke und 22 Stadtteile]] |Straße = Hamburger Straße 5–7 |Website = [https://www.reinbek.de/ www.reinbek.de] |Bürgermeister = [[Björn Warmer]] |Partei = SPD }} '''Reinbek''' ([[Niederdeutsche Sprache|niederdeutsch]] ''Reinbeek''), in der südlichen [[Geest]] [[Schleswig-Holstein]]s gelegen, ist mit etwa 28.000 Einwohnern die zweitgrößte Stadt im [[Kreis Stormarn]]. Die [[Mittelstadt]] liegt im östlichen Ballungsraum [[Hamburg]]s und gehört zur [[Metropolregion Hamburg]]. == Geografie == Die Ost- und Südgrenze Reinbeks bildet die zum ''Mühlenteich'' aufgestaute, naturgeschützte [[Bille]]. Die zwischen den Ortsteilen liegenden Flächen werden zum Teil noch landwirtschaftlich genutzt. Geprägt vom angrenzenden [[Sachsenwald]], bietet Reinbek ein grünes, erholsames Stadtbild. Ein Großteil der Stadt ist mit Einzelhäusern bebaut, das Gebiet rings um den Täby-Platz und das Paul Luckow-Stadion besteht zum großen Teil aus mehrstöckigen Mietshäusern, die im Stil der 1960er Jahre erbaut wurden. Das höchste von ihnen, das Sachsenwald-Hochhaus mit 20 Stockwerken, befindet sich in der Hamburger Straße. Zu Reinbek gehören die Stadtteile ''Alt-Reinbek'', [[Hinschendorf]], [[Schönningstedt]], [[Neuschönningstedt]], [[Ohe (Reinbek)|Ohe]] mit [[Büchsenschinken]] und das jüngere Neubaugebiet [[Krabbenkamp]] (→[[Liste der Bezirke und Stadtteile Reinbeks]]). Direkt angrenzend liegen die Hamburger Stadtteile [[Hamburg-Bergedorf|Bergedorf]] und [[Hamburg-Lohbrügge|Lohbrügge]]. == Geschichte == {{Hauptartikel|Geschichte der Stadt Reinbek}} Von der Besiedlung des heutigen Reinbeker Gebietes in bereits vorgeschichtlicher Zeit zeugen zahlreiche [[Hügelgrab|Hügelgräber]]. Die erste urkundlich überlieferte Erwähnung Reinbeks datiert allerdings erst auf das Jahr 1238 und geht auf die Gründung des gleichnamigen [[Zisterzienserinnen]]klosters (siehe [[Kloster Reinbek]]) zurück. Die ältesten bekannten Schreibformen des Ortsnamens sind ''(ville) Reinebec'' (1238), ''(in) Reynebeke'' (1309 und 1350), ''(to deme) Reynenbeke'' (1400) und ''(tome) Rynenbeke'' (1466); der Name wird als Kompositum aus dem Grundwort ''bek'' für „Bach“ und dem Adjektiv „rein“ als Bestimmungswort gedeutet.<ref>[[Wolfgang Laur]]: ''Historisches Ortsnamenlexikon von Schleswig-Holstein'', 2.&nbsp;Aufl., S.&nbsp;538.</ref> Nach der Zerstörung des Klosters (1534) gewann der Ort erst mit dem Bau der Schlossanlage (1572) wieder an Bedeutung. [[Datei:Mühlenteich und Reinbeker Schloss im Winter.jpg|mini|Der Mühlenteich und das Reinbeker Schloss im Winter]] Die Ansiedlung von Handwerkern im späten 18. Jahrhundert brachte endlich wirtschaftliches Wachstum. Einen entscheidenden Impuls für die Entwicklung des Ortes gab jedoch der Bau der Eisenbahnstrecke zwischen Hamburg und [[Berlin]] (1846): Reinbek wurde vorübergehend zum Kurort und beliebten Ausflugsziel. Die alte Schreibweise „Reinbeck“ wurde am 1. September 1877 durch eine Anordnung über die einheitliche Regelung der Schreibweise für Ortsnamen von der Provinzialregierung in Schleswig in „Reinbek“ geändert. Zum Ende des [[Zweiter Weltkrieg|Zweiten Weltkrieges]] wurde Deutschland schrittweise besetzt. Am 3. Mai 1945 besetzten britischen Truppen auch Reinbek, das benachbarte [[Glinde]] sowie den letzten Teil des noch unbesetzten [[Kreis Stormarn|Stormarns]].<ref>[[Hamburger Abendblatt]]: [http://www.abendblatt.de/region/stormarn/article205288543/Vor-siebzig-Jahren-kapitulierte-die-Stadt-Ahrensburg.html Kriegsende. Vor siebzig Jahren kapitulierte die Stadt Ahrensburg], vom: 2. Mai 2015; abgerufen am: 31. Mai 2017</ref> Des Weiteren begann am Nachmittag des Tages auch die Besetzung [[Hamburg]]s, die zuvor in der [[Villa Möllering]] bei [[Lüneburg]] vereinbart worden war. Einen Tag später unterschrieb zudem [[Hans-Georg von Friedeburg]] im Auftrag des letzten [[Reichspräsident]]en [[Karl Dönitz]], der sich zuvor mit der [[Regierung Dönitz|letzten Reichsregierung]] in den [[Sonderbereich Mürwik]] abgesetzt hatte, die [[Teilkapitulation der Wehrmacht für Nordwestdeutschland, Dänemark und die Niederlande]].<ref>[https://web.archive.org/web/20131104080252/http://www.volksbund.de/fileadmin/redaktion/BereichInfo/Textsammlungen/Ausstellungen/0400_ausstellung_timeloberg/Timeloberg.pdf Die Kapitulation auf dem Timeloberg] (PDF, 16. S.; 455&nbsp;kB)</ref> Die [[Bedingungslose Kapitulation der Wehrmacht]] folgte am 8. Mai 1945. Zum Kriegsende erlebte Reinbek einen verstärkten Zuzug von Flüchtlingen und durch Kriegseinwirkung obdachlos gewordenen Hamburgern. Seit den 1960er Jahren wurden mehrere Gewerbegebiete erschlossen und erweitert. Am 28. Juni 1952 erhielt Reinbek das [[Stadtrecht]]. Am 1. Januar 1974 wurden die Gemeinde [[Schönningstedt]] (mit [[Neuschönningstedt]] und [[Ohe (Reinbek)|Ohe]]) sowie ein Teil der Gemeinde Glinde mit damals etwa 100 Einwohnern und ein Teil der aufgelösten Gemeinde Stemwarde eingegliedert.<ref>{{Literatur | Herausgeber = Statistisches Bundesamt | Titel = Historisches Gemeindeverzeichnis für die Bundesrepublik Deutschland. Namens-, Grenz- und Schlüsselnummernänderungen bei Gemeinden, Kreisen und Regierungsbezirken vom 27. Mai 1970 bis 31. Dezember 1982 | Jahr = 1983 | Verlag = W. Kohlhammer GmbH | Ort = Stuttgart/Mainz | ISBN = 3-17-003263-1 | Seiten = 186}}</ref> Im Jahre 1978 kam das bisher landwirtschaftlich genutzte Gebiet Krabbenkamp, das vormals zu Schönningstedt gehörte, als weiterer Stadtteil hinzu. == Religion == Reinbek gehörte ursprünglich zum [[Kirchspiel]] [[Kirchsteinbek|Steinbek]], bis es 1894 zu einer eigenständigen [[Evangelisch-lutherische Kirchen|evangelisch-lutherischen]] [[Kirchengemeinde]] wurde. Die [[Neogotik|neogotische]] Kirche (heute Maria-Magdalenen-Kirche) wurde 1901 errichtet. 1908 gründete sich die [[Römisch-katholische Kirche|römisch-katholische]] Kirchengemeinde, die 1953 die Herz-Jesu-Kirche erbauen ließ. In Reinbek sind 44 % der Bevölkerung evangelisch und 9 % katholisch, 26 % gehören anderen Konfessionen an, 22 % sind ohne Religionszugehörigkeit. Die bedeutendsten Gemeinden der Stadt sind: * [[Ansgar von Bremen|Ansgar]]-Kirchengemeinde Schönningstedt-Ohe (evangelisch-lutherisch) * Kirchengemeinde [[Gethsemane]] Neuschönningstedt (evangelisch-lutherisch) * [[Maria-Magdalenen-Kirche (Reinbek)|Maria-Magdalenen-Kirche]] (evangelisch-lutherisch) * [[Nathan-Söderblom-Kirche (Reinbek)|Nathan-Söderblom-Kirche]] (evangelisch-lutherisch) * [[Herz-Jesu-Kirche (Reinbek)|Herz-Jesu]]-Gemeinde (römisch-katholisch) * [[Evangelisch-Freikirchliche Gemeinde]] ([[Baptisten]]) == Politik == === Stadtvertretung === Die letzten drei Kommunalwahlen [[Kommunalwahlen in Schleswig-Holstein 2018|am 6. Mai 2018]], [[Kommunalwahlen in Schleswig-Holstein 2013|am 26. Mai 2013]]<ref>{{Webarchiv|url=http://www.reinbek.de/wahlen/KW2013.html |wayback=20160304064515 |text=Archivierte Kopie}}</ref> und [[Kommunalwahlen in Schleswig-Holstein 2008|am 25. Mai 2008]]<ref>{{Cite web |title=Archived copy |url=http://www.reinbek.de/files/Wahlen/GKW_25052008.pdf#page=10 |access-date=2023-02-21 |archive-date=2016-03-04 |archive-url=https://web.archive.org/web/20160304074748/http://www.reinbek.de/files/Wahlen/GKW_25052008.pdf#page=10 }}</ref> führten zu folgenden Ergebnissen: {| class="wikitable" | colspan="2" | '''Parteien und Wählergemeinschaften''' | align="center" | '''%<br />2018''' | align="center" | '''Sitze<br />2018''' | align="center" | '''%<br />2013''' | align="center" | '''Sitze<br />2013''' | align="center" | '''%<br />2008''' | align="center" | '''Sitze<br />2008''' | rowspan="12" |{{Wahldiagramm | LAND = DE | TITEL = Kommunalwahl 2018 | JAHRALT = 2013 | JAHRNEU = 2018 | GUV = ja | PARTEI1 = CDU | ERGEBNIS1 = 27.5 | ERGEBNISALT1 = 30.7 | PARTEI3 = SPD | ERGEBNIS3 = 20.7 | ERGEBNISALT3 = 26.6 | PARTEI2 = GRÜNE | ERGEBNIS2 = 22.1 | ERGEBNISALT2 = 17.2 | PARTEI5 = Forum21 | ERGEBNIS5 = 11.0 | ERGEBNISALT5 = 13.2 | FARBE5 = 0000FF | PARTEI4 = FDP | ERGEBNIS4 = 17.0 | ERGEBNISALT4 = 10.9 | PARTEI6 = [[Klaus-Peter Puls|Puls]] | ERGEBNIS6 = 1.7 | ERGEBNISALT6 = 1.5 | FARBE6 = CCCCCC }} | rowspan="12" |{{Sitzverteilung | Land = DE | Überschrift = Sitzverteilung in der Stadtverordnetenversammlung | SPD|Grüne|Forum21|Puls|FDP|CDU| | Legende = ja | SPD = 6 | Grüne = 7 | Forum21 = 3 | Puls = 1 | FDP = 5 | CDU = 9 | Forum21 Farbe = 0000FF | Puls Farbe = CCCCCC | Puls Link = [[Klaus-Peter Puls|Puls]] }} |- style="text-align:right" | style="text-align:left" | CDU | style="text-align:left" | [[Christlich Demokratische Union Deutschlands]] | 27,5 | 9 | 30,7 | 10 | 33,6 | 13 |- style="text-align:right" | style="text-align:left" | SPD | style="text-align:left" | [[Sozialdemokratische Partei Deutschlands]] | 20,7 | 6 | 26,6 | 8 | 24,3 | 9 |- style="text-align:right" | style="text-align:left" | GRÜNE | style="text-align:left" | [[Bündnis 90/Die Grünen]] | 22,1 | 7 | 17,2 | 5 | 15,4 | 5 |- style="text-align:right" | Forum21 | Forum21 | 11,0 | 3 | 13,2 | 4 | 13,0 | 4 |- style="text-align:right" | style="text-align:left" | FDP | style="text-align:left" | [[Freie Demokratische Partei]] | 17,0 | 5 | 10,9 | 3 | 13,8 | 5 |- style="text-align:right" | style="text-align:left" | Puls | style="text-align:left" | Einzelbewerber [[Klaus-Peter Puls]]<ref>http://www.bergedorfer-zeitung.de/printarchiv/reinbek/article188444/Kommunalwahl-am-26-Mai-2013-Vorstellung-der-Reinbeker-Kandidaten-Wahlkreis-13.html</ref><ref>http://www.abendblatt.de/region/stormarn/article115057641/Klaus-Peter-Puls-tritt-aus-der-SPD-aus.html</ref> | 1,7 | 1 | 1,5 | 1 | — | — |- class="hintergrundfarbe5" style="text-align:right" | colspan="2" style="text-align:left" | '''gesamt''' | '''100,0''' | '''31''' | '''100,0''' | '''31''' | '''100,0''' | '''36''' |- ! colspan="2" style="text-align:left" | Wahlbeteiligung in % ! colspan="2" | ! colspan="2" | 45,5 ! colspan="2" | |} [[Datei:Reinbeker Rathaus.JPG|mini|Reinbeker Rathaus]] === Bürgermeister === <!-- Amtsvorgänger bitte mit Amtszeit und Partei nachtragen --> {| class="wikitable" ! colspan="2" | Amtszeit !! rowspan="2" | Name |- ! von !! bis |- | 17. Februar 1931 || 13. September 1945 | Eduard Claußen (NSDAP)<ref>[https://www.museumsverein-reinbek.de/wp-content/uploads/2018/06/Eduard-Claussen.pdf ''Eduard Claußen''], museumsverein-reinbek.de</ref><ref>Claußen half trotz seiner NSDAP-Zugehörigkeit im Rahmen seiner Möglichkeiten mehreren jüdischen Einwohnern und sorgte dafür, dass Reinbek kampflos den Engländern übergeben wurde, vgl. dazu: Detlev Landgrebe: Kückallee 37. Eine Kindheit am Rande des Holocaust. Rheinbach 2009, ISBN 978-3-87062-104-9, S. 163, S. 167 u.&nbsp;a.</ref> |- | 15. Dezember 1945 || 31. Januar 1946 || Wilhelm Kleist |- | 1. Februar 1946 || 22. September 1946 || Carl Dobbertin |- | 23. September 1946 || 11. November 1948 || Alwin Hemken |- | 12. November 1948 || 28. April 1950 || Carl Dobbertin |- | 28. April 1950 || 31. März 1951 || Wilhelm Kleist |- | 1. April 1951 || 31. Dezember 1971 || [[Hermann Körner]] |- | 1. Januar 1972 || 31. Januar 1990 || Günther Kock |- | 1. Februar 1990 || 31. Januar 1996 || Manfred Neumann |- | 1. September 1996 || 31. August 2008 || Detlef Palm |- | 1. September 2008 || 31. August 2014 || [[Axel Bärendorf]] |- | 1. September 2014 || || [[Björn Warmer]] |} === Wappen === [[Blasonierung]]: „In Rot ein silberner Wellenbalken, begleitet von drei im Dreipass mit den Stielen einander zugekehrten Eichenblättern, und zwar zwei oben und einem unten.“<ref>[{{SH-Wappenrolle|262|Stadt Reinbek, Kreis Stormarn|nurLink=1}} Kommunale Wappenrolle Schleswig-Holstein]</ref> Die Blätter, in ihrer Anordnung an das Wappen der Familie [[Bismarck (Adelsgeschlecht)|Bismarck]] angelehnt, versteht man als Symbole für den [[Sachsenwald]], während das Band für die [[Bille]] steht. Eine ähnliche Symbolik findet sich auf den Wappen der Nachbarorte [[Wohltorf]] und [[Aumühle]]; die Farben Rot und Weiß entsprechen den Wappen [[Holstein]]s und [[Kreis Stormarn|Stormarns]]. Das Wappen wurde 1935 genehmigt. === Städtepartnerschaften === * 1956–2011: Städtefreundschaft mit [[Täby]] ([[Schweden]]). Der Marktplatz in Reinbek-Klosterbergen, der ''Täbyplatz'', wurde nach der Partnerstadt benannt. * Seit 1961: Städtefreundschaft mit [[Königslutter am Elm]] ([[Niedersachsen]]). * Seit 1974: Patenschaft zwischen der [[Freiwillige Feuerwehr|Freiwilligen Feuerwehr]] Ohe und der Gemeinde [[Padasjoki]] ([[Finnland]]). * Seit 1999: Städtepartnerschaft mit [[Koło]] ([[Polen]]). == Kultur und Sehenswürdigkeiten == [[Datei:Das Reinbeker Schloss.jpg|mini|Reinbeker Schloss]] [[Datei:Museum Rade.JPG|mini|Ehemaliges Museum Rade]] === Theater, Kino und Museen === * Das Kultur- und Kongresszentrum ''Sachsenwald-Forum'' bietet ein wechselndes Programm von Tournee- und Privattheatern. * Der Filmring Reinbek e.&nbsp;V. führt ehrenamtlich monatlich eine Kinoveranstaltung in der Nathan-Söderblom-Kirche durch. * Das gegenüber vom Schloss gelegene ''Museum Rade'' stellte die Sammlung volkstümlicher Kunst des Hamburger Schriftstellers und Kunstsammlers [[Rolf Italiaander]] aus. Seit Sommer 2017 ist das Museum dauerhaft geschlossen, die Sammlung wurde Ende 2018 ins Schloss Reinbek verlegt [[Datei:Reinbek Sankt Maria Magdalena.JPG|hochkant|mini|Maria-Magdalenen-Kirche]] === Bauwerke === [[Datei:Reinbek dänenbrücke P4070041.JPG|mini|„Dänenbrücke“ von 1793]] [[Datei:RK 1810 P1650787 Bismarcksäule Friedrichsruh.jpg|mini|Bismarcksäule]] Verschont von den Zerstörungswellen des Zweiten Weltkrieges, zeigt Reinbeks Stadtarchitektur ein kontinuierliches Bild durch die Epochen norddeutscher Baugeschichte, angefangen bei der niederländischen Renaissance und alten Bauernkaten, über [[großbürger]]liche Villen der Kaiserzeit, Klinkerexpressionismus der Weimarer Republik und Wohngroßbauten der 1970er bis hin zu einer eher behutsamen Architektur der 1990er Jahre. * Ältestes und bedeutendstes Bauwerk ist das [[Schloss Reinbek]] im Stil der [[Niederländische Renaissance|Niederländischen Renaissance]]. [[Adolf I. (Schleswig-Holstein-Gottorf)|Herzog Adolf I. von Gottorf]] ließ das Schloss zwischen 1572 und 1576 in seiner heute noch vorhandenen Form errichten. Zunächst Nebenwohnsitz des Landesherren, war das Schloss in dänischer Zeit Residenz des Amtmannes und später kurzzeitig der Sitz des Landratsamtes für den [[Kreis Stormarn]]. Heute steht das originalgetreu restaurierte Gebäude für öffentliche Nutzung zur Verfügung. * Über die 1793 erbaute ''Dänenbrücke'', in unmittelbarer Nähe zum Schloss, verlief einst der Verkehr zwischen dem dänischen Amt Reinbek und dem [[Herzogtum Sachsen-Lauenburg]]. * Die ''Schönningstedter Mühle'', erbaut 1886, wurde seit der Stilllegung (1968) als Gaststätte betrieben. Sie wurde durch einen Brand (1991) vollständig zerstört. Sie wurde durch eine andere am Ursprungsort abgebaute auf den Grundmauern der Alten Mühle neu errichtet. * Die [[Bismarcksäule (Friedrichsruh)|Bismarcksäule]] auf dem ''Hammelsberg'' zwischen den Ortsteilen Krabbenkamp und Schönningstedt, in der Nähe des ehemaligen bismarckschen Guts Schönau, wurde 1903 fertiggestellt. Das 19 Meter hohe Monument entspricht dem üblichen Bismarcksäulen-Typus eines Feuerturmes, den [[Wilhelm Kreis]] 1898 entworfen hatte, und wurde aus Mitteln der deutschen Studentenschaft finanziert. Der Turm steht seit 1989 unter Denkmalschutz. * In Reinbek gibt es [[Liste der Stolpersteine in Reinbek|sieben Stolpersteine]] zur Erinnerung an Opfer des [[Nationalsozialismus]].<ref>[http://www.akens.org/akens/texte/stolpersteine/Stolpersteineliste.htm#Reinbek Stolpersteine: Reinbek]</ref> In der [[Liste der Kulturdenkmale in Reinbek]] stehen die in der Denkmalliste des Landes Schleswig-Holstein eingetragenen Kulturdenkmale. === Grünflächen und Naherholung === * Die Wald- und Wiesenlandschaft in und um Reinbek sowie der Schlosspark laden zum Spazieren, Wandern und Radfahren ein. Auf der Bille und auf dem Mühlenteich werden Kanufahrten veranstaltet. * Jährlich wird in Reinbek auf dem Täbyplatz oder am ''Waldhaus'' im Sommer oder im Herbst die sogenannte „Reinbeker Sommersause“ bzw. „Reinbeker Herbstsause“ gefeiert. Bei diesen Festen treten unter anderem regionale Musiker und Coverbands auf. === Sport === * Das ''Freizeitbad Reinbek'' und der angrenzende ''Sport-Park Reinbek'' bieten neben einem Hallenbad mit Außenschwimmbecken auch eine Sauna und verschiedene Sportprogramme an. * Die [[TSV Reinbek]] und der [[FC Voran Ohe]] bieten verschiedene Sportarten an. == Wirtschaft, Infrastruktur, öffentliche Einrichtungen == === Unternehmen === Reinbek zeichnet sich durch eine vielfältige, vorwiegend klein- und mittelständische Wirtschaftsstruktur aus. Zahlreiche bedeutende Firmen hatten bzw. haben hier ihren Sitz, wie zum Beispiel der [[Rowohlt Verlag]] (von 1960 bis März 2019), E.&nbsp;Michaelis & Co. – Papiergroßhandel, [[Almirall]] Almirall Hermal und [[Dermapharm|Allergopharma]] (die seit Mai 2021 an der Herstellung des Impfstoffs von [[Biontech]] beteiligt sind)<ref>[https://www.ndr.de/nachrichten/schleswig-holstein/coronavirus/Corona-Biontech-Impfstoff-kommt-jetzt-auch-aus-Reinbek,spahn290.html ''Corona: Biontech-Impfstoff kommt jetzt auch aus Reinbek''] {{Webarchive|url=https://web.archive.org/web/20220328133934/https://www.ndr.de/nachrichten/schleswig-holstein/coronavirus/Corona-Biontech-Impfstoff-kommt-jetzt-auch-aus-Reinbek,spahn290.html |date=2022-03-28 }}, ndr.de, 30. April 2021</ref>, [[Fürst-Bismarck-Quelle]], Grossmann-Feinkost, [[Kahl Gruppe|Amandus Kahl]] (Neuhaus Neotec), Peek&nbsp;&&nbsp;Cloppenburg (Verteilzentrum) und Lutz Aufzüge (Maschinen- und Anlagentechnik), Wollenhaupt (Teehandel). Ein weiterer großer Arbeitgeber ist das Krankenhaus Reinbek St. Adolf-Stift (Gesundheitswesen). Anfang der 1960er Jahre wurde das gemeinsame Gewerbegebiet Reinbek-[[Glinde]] erschlossen. Seitdem erfolgten immer wieder Erweiterungen und Neuausweisungen von Gewerbeflächen. Zuletzt wurde das Gewerbegebiet Haidland vermarktet (ca. 22&nbsp;ha): bis 2018 sind dort mehr als 30 Firmen angesiedelt worden, dadurch wurden 1200 Arbeitsplätze gesichert und ca. 400 neu geschaffen. Geplant ist die Erweiterung des Gewerbegebietes. Die wirtschaftliche Dynamik Reinbeks zeigt sich unter anderem in der Entwicklung der Gewerbebetriebe: deren Zahl stieg auf 2532 Betriebe (31. August 2018). Auch die positiven Arbeitsmarktdaten sind ein Beweis für die Besonderheit des Standortes. Im Geschäftsstellenbezirk der Arbeitsagentur Bad Oldesloe wird der Bezirk Reinbek mit einer der niedrigsten Arbeitslosenquoten aufgeführt, vergleichbar mit denen süddeutscher Wirtschaftsregionen. In der Region Südstormarn liegen einige der Kommunen mit der höchsten Kaufkraft in Deutschland. Auch Reinbek lag im Jahr 2017 mit einer Kaufkraftkennziffer von 118 über dem Durchschnitt (CIMA Lübeck, Jahresbericht interkommunales Einzelhandelsforum 2017). Reinbek ist perspektivisch weiter ein dynamischer Wirtschaftsstandort mit einer hohen Gewerbeflächennachfrage und steigenden Gewerbesteuereinnahmen, u.&nbsp;a. wegen der verkehrsgünstigen zentralen Lage in der Metropolregion direkt benachbart der Weltstadt Hamburg. Die Arbeitsplatzzentralität ist mit einem knapp 80-%-Anteil an den Beschäftigten hoch. === Öffentliche Einrichtungen === Reinbek ist Sitz eines [[Amtsgericht]]s. === Bildung === In Reinbek gibt es vier [[Grundschule]]n, eine [[Gemeinschaftsschule mit Oberstufe]] (mit auslaufenden Haupt- und Realschulklassen) und ein [[Sachsenwaldschule Gymnasium Reinbek|Gymnasium]]. Außerdem gibt es eine [[Förderschule (Deutschland)|Förderschule]]. Gemeinschaftsschule und Förderschule sind zum Schulzentrum Mühlenredder zusammengefasst. Die ''Volkshochschule Sachsenwald'' hat ein umfangreiches Angebot an Kursen verschiedener Fachrichtungen und deckt auch das Angebot für die Nachbargemeinde [[Wentorf bei Hamburg|Wentorf]] mit ab. Die meisten Kurse finden im eigenen, gut ausgestatteten Haus mitten in Reinbek statt. Die ''Reinbeker Stadtbibliothek'' bietet ein breit gefächertes Angebot aus alten wie neuen Medien und unterhält einen ständigen Bücherflohmarkt aus gespendeten und ausgemusterten Büchern. Seit 1989 besteht der [[Museumsverein Reinbek|Geschichts- und Museumsverein Reinbek e.&nbsp;V.]] === Verkehr === [[Datei:Reinbeker Bahnhof.jpg|mini|Der Reinbeker Bahnhof]] Reinbek liegt in der [[Metropolregion Hamburg]]. Von Reinbek ist die Hamburger Innenstadt mit der [[S-Bahn Hamburg|S-Bahn-Linie]] S&nbsp;21 in 25&nbsp;Minuten zu erreichen. Die S-Bahn verbindet Reinbek mit den Nachbarorten [[Wohltorf]] und [[Bahnhof Aumühle|Aumühle]], innerhalb Reinbeks fahren mehrere Buslinien, die von den zum [[Hamburger Verkehrsverbund|HVV]] gehörenden [[VHH PVG Unternehmensgruppe|VHH]] betrieben werden. Die Fernverkehrsstraßen [[Bundesstraße 5|B&nbsp;5]], [[Bundesautobahn 24|A&nbsp;24]] und [[Bundesautobahn 1|A&nbsp;1]] führen in die Hamburger Innenstadt bzw. in Richtung [[Berlin]], [[Lübeck]] und [[Bremen]]. Der nächstgelegene Fernbahnhof ist [[Bahnhof Hamburg-Bergedorf|Hamburg-Bergedorf]], die [[Bahnstrecke Hamburg–Berlin]] durchquert die Stadt ohne Halt parallel zur S-Bahn. == Persönlichkeiten == === Ehrenbürger === <!-- chronologisch nach Geburtsdatum geordnet --> {{Mehrspaltige Liste|liste= * [[Paul Lingens]] (1895–1976), Stadtverordneter der CDU, Bürgervorsteher * Karl Meißner (1912–2010), Stadtverordneter der SPD, Bürgervorsteher * [[Georges-Arthur Goldschmidt]] (* 1928), französisch-deutscher Schriftsteller, Essayist und Übersetzer * Lothar Zug (1928–2020), Stadtverordneter der CDU, Bürgervorsteher * Helmut Schomann (1932–2009), Stadtverordneter der SPD, Bürgervorsteher }} === Söhne und Töchter der Stadt === <!-- chronologisch nach Geburtsdatum geordnet --> {{Mehrspaltige Liste|liste= * [[Minna Specht]] (1879–1961), Pädagogin und Sozialistin * [[Wilhelm Bisse]] (1881–1946), Reichstagsabgeordneter der NSDAP * [[Horst Seifart]] (1916–2004), Journalist und Fernseh-Regisseur * [[Donat de Chapeaurouge]] (1925–2019), Kunsthistoriker * [[Georges-Arthur Goldschmidt]] (* 1928), französisch-deutscher Schriftsteller, Essayist und Übersetzer * Helmut Schomann (1932–2009), Politiker, Ehrenbürger und Träger des Bundesverdienstkreuzes * [[Hartmut Berg]] (* 1936), Wirtschaftswissenschaftler * [[Ekkehard Wachmann]] (* 1937), Entomologe * [[Wittko Francke]] (1940–2020), Chemiker * [[Hans Klapdor-Kleingrothaus]] (* 1942), Physiker * [[Klaus-Peter Puls]] (* 1943), Politiker * [[Albert Maringer]] (* 1945), Manager * [[Wolfgang Seifert (Japanologe)|Wolfgang Seifert]] (* 1946), Japanologe * [[Claus Peter Ortlieb]] (1947–2019), Mathematiker * [[Eckart Modrow]] (* 1948), Pädagoge und Sachbuchautor * [[Johannes Spallek]] (* 1948), Archivar und Kulturreferent * [[Christine Christ-von Wedel]] (* 1948), Historikerin * [[Dieter Matz]] (* 1948), Sportjournalist * [[Angela Sommer-Bodenburg]] (* 1948), Kinderbuchautorin und Malerin; bekannt wurde sie durch ihre Bücher über den ''Kleinen Vampir'' * [[Christel Hüttemann]] (* 1949), Trägerin des Bundesverdienstkreuzes * [[Mathias Nolte]] (* 1952), Buchautor und Journalist * [[Mathias Petersen]] (* 1955), Politiker * [[Harald Lemke (Politiker, 1956)|Harald Lemke]] (* 1956), Staatssekretär * [[Norbert Meier]] (* 1958), Fußballtrainer und ehemaliger -spieler * [[Sabine Sütterlin-Waack]] (* 1958), Rechtsanwältin und Politikerin (CDU) * [[Martin Rheinheimer]] (* 1960), Historiker * [[Jan van Aken (Politiker)|Jan van Aken]] (* 1961), Politiker * [[Dietrich Becker (Diplomat)|Dietrich Becker]] (* 1961), Diplomat * [[Ralf Sommer (Elektroingenieur)|Ralf Sommer]] (* 1961), Elektroingenieur * [[Thomas Röske]] (* 1962), Kunsthistoriker * [[Gerd Gottlob]] (* 1964), Journalist und Fußballkommentator * [[Gundula Bavendamm]] (* 1965), Historikerin und Kulturmanagerin * [[Christiane Bruns (Medizinerin)|Christiane Bruns]] (* 1965), Chirurgin * [[Kerstin Drechsel]] (* 1966), Malerin * [[Andreas Herbig]] (1966–2022), Produzent, Echopreisträger * [[Birte Karalus]] (* 1966), Journalistin und Moderatorin * [[Lena Johannson]] (* 1967), Schriftstellerin * [[Michael Meyer-Hermann (Physiker)|Michael Meyer-Hermann]] (* 1967), Physiker und Hochschullehrer * [[Thorsten Schröder]] (* 1967), Journalist, Moderator und Sprecher der Tagesschau * [[Lars Uwe Höltich]] (* 1968), TV-Producer * [[Sönke Lieberam-Schmidt]] (* 1969), Wirtschaftsinformatiker und Professor * [[Heiko Nieder]] (* 1972), Koch, mit zwei Sternen im ''Guide Michelin'' ausgezeichnet * [[Christine Berger]] (* 1973), Theater- und Fernsehschauspielerin * [[Andreas Dobberkau]] (* 1975), Schauspieler * [[Helmut Fritz]] (* 1975), fiktiver Popsänger * [[Julian Krafftzig]] (* 1977), Radiomoderator * [[Torben Liebrecht]] (* 1977), Schauspieler, Regisseur und Drehbuchautor * [[Alexander Nerlich]] (* 1979), Regisseur * [[Imke Wedekind]] (* 1984), Volleyballspielerin * [[Ann-Kathrin Karschnick]] (* 1985), Fantasy-Autorin * [[Max Kruse (Fußballspieler)|Max Kruse]] (* 1988), Fußballspieler * [[Marvin Boadu]] (* 1989), Basketballspieler * [[Felix Brügmann]] (* 1992), Fußballspieler * [[Maximilian Buhk]] (* 1992), Automobilrennfahrer * [[Felix von der Laden]] (* 1994), Webvideoproduzent (bekannt als „Dner“), Automobilrennfahrer und Unternehmer * [[Sina Aylin Demirhan]] (* 1994), Politikerin (Bündnis 90/Die Grünen) * [[Larina Aylin Hillemann]] (* 1996), Ruderin * [[Victoria Helene Bergemann]] (* 1997), Komikerin und Autorin * [[Noma Noha Akugue]] (* 2003), Tennisspielerin }} === Mit Reinbek verbunden ===<!-- chronologisch nach Geburtsdatum geordnet --> {{Mehrspaltige Liste|liste= * [[Georg Julius Andresen]] (1815–1882), Autor, Mediziner, Hydrotherapeut und Gründer des Sophienbads * [[Arthur Goldschmidt (Jurist)|Arthur Goldschmidt]] (1873–1947), Jurist und Politiker * [[Hans E. B. Kruse]] (1891–1968), Kaufmann und Hamburger Senator, wohnte und starb in Reinbek * [[Franz Heske]] (1892–1963), Forstwissenschaftler * [[Bernhard Rogge (Marineoffizier)|Bernhard Rogge]] (1899–1982), Admiral * [[Helene Francke-Grosmann]] (1900–1990), Forstwissenschaftlerin * [[Erwin Freytag]] (1907–1987), Autor und evangelisch-lutherischer Theologe * [[Heinrich Maria Ledig-Rowohlt]] (1908–1992), bis 1982 Verleger des [[Rowohlt Verlag]]s * [[Rolf Italiaander]] (1913–1991), Schriftsteller, Übersetzer, Forschungsreisender, Ethnograf * [[Sandro von Lorsch]] (1919–1992), Maler * [[Arwed Imiela]] (1929–1982), Frauenmörder * [[Günter Gaus]] (1929–2004), Journalist, Publizist, Diplomat und Politiker * [[Hans-Jürgen von Maydell]] (''Baron Maydell''; 1932–2010), Forstwissenschaftler * [[Heinz-Georg Keerl]] (1946–2011), General * [[Thomas Straubhaar]] (* 1957), Ökonom * [[Holger Waldenberger]] (* 1967), Quizspieler * [[Bjarne Mädel]] (* 1968), Schauspieler * [[Moritz Bleibtreu]] (* 1971), Schauspieler * [[Ann-Katrin Schröder]] (* 1973), Journalistin und Fernsehmoderatorin * [[Bodo Wartke]] (* 1977), Musik-Kabarettist * [[Martin Habersaat]] (* 1977), Politiker, lebt seit 2014 in Reinbek * [[Julian Reister]] (* 1986), Tennisspieler }} == Literatur == ;Antiquarisch * Mathilde Weise-Minck: ''Kindertage in Reinbek.'' Piper, München 1947, {{DNB|576902853}}. * Curt Davids: ''Festschrift zur 725-Jahrfeier von Reinbek.'' 1963, {{DNB|451252543}}. * Walter Fink: ''Das Amt Reinbek.'' Zentralstelle f. Personen- u. Familiengeschichte, Frankfurt am Main 1969, {{DNB|999410660}}. * Herbert Rathmann: ''Ich bin ein Reinbeker.'' 1978, {{OCLC|248265316}}. * Curt Davids: ''Die Wassermühle in Reinbek.'' 1982, {{DNB|840196717}}. * Hans Heuer: ''Das Kloster Reinbek.'' Beitrag zur Geschichte der Landschaft Stormarn. Wachholtz, Neumünster 1985, ISBN 3-529-02186-5. * [[Dirk Bavendamm]]: ''Reinbek. Geschichte einer holsteinischen Stadt zwischen Hamburg und Sachsenwald.'' 1988, ISBN 3-9801817-0-7. * ''Reinbek in alten Ansichten.'' Bildband. Europäische Bibliothek, Zaltbommel 1996, ISBN 90-288-6082-7. ;Aktuellere Titel * Wolf Gütschow, Michael Zapf: ''Reinbek und der Sachsenwald im Wandel.'' Bildband. Schubert, Hamburg 1997, ISBN 3-929229-44-7. * ''Reinbek gestern und heute.'' Bildband. Europäische Bibliothek, Zaltbommel 2000, ISBN 90-288-6634-5. * Georges-Arthur Goldschmidt: ''Ein Garten in Deutschland.'' 2000, ISBN 3-250-10118-4. * Frank Göhre: ''Endstation Reinbek.'' Krimi. Hamburger Abendblatt, Hamburg 2001, ISBN 3-921305-20-9. * Antje Wendt: ''Das Schloß Reinbek.'' Wachholtz, Neumünster 1994, ISBN 3-529-02739-1. * Detlev Landgrebe: ''Kückallee 37: Eine Kindheit am Rande des Holocaust.'' CMZ, Rheinbach 2009, ISBN 978-3-87062-104-9. == Weblinks == {{Commonscat}} {{Wikivoyage}} * [https://www.reinbek.de/ Website der Stadt Reinbek] == Einzelnachweise == <references /> {{NaviBlock |Navigationsleiste Städte und Gemeinden im Kreis Stormarn |Navigationsleiste Stadtteile von Reinbek}} {{Normdaten|TYP=g|GND=4049222-9|LCCN=n50052582|VIAF=312788140}} [[Kategorie:Ort im Kreis Stormarn]] [[Kategorie:Ort an der Bille]] [[Kategorie:Reinbek| ]] [[Kategorie:Ersterwähnung 1238]] [[Kategorie:Stadt in Schleswig-Holstein]] [[Kategorie:Stadtrechtsverleihung 1952]] 662mj3g32r6t7m0uw1b3ydmnt611kvz Test 0 155073 739101 737348 2026-04-22T16:08:22Z ~2026-24712-13 73661 739101 wikitext text/x-wiki {{Ver desambig|este=o filme de Marcel Camus|a peça teatral de Vinícius de Moraes|Orfeu da Conceição}} {{Info/Filme |título = Orfeu Negro |título-pt = Orfeu Negro |título-br = Orfeu do Carnaval |imagem = [[Imagem:Orfeu Negro, 1959.jpg|Orfeu Negro, 1959|230px]] |ano = 1959 |duração = 100 |idioma = [[Língua portuguesa|Português]] |país = [[Brasil]] • [[França]] • [[Itália]] |direção = [[Marcel Camus]] |roteiro = Marcel Camus<br />[[Jacques Viot]] |criação original = {{Baseado em|[[Orfeu da Conceição]]|[[Vinicius de Moraes]]}} |produção = Sasha Gordine. |co-produtor = |produção executivo = |música = [[Tom Jobim]]<br />[[Luiz Bonfá]] |edição = Andrée Feix |diretor de arte = |diretor de fotografia = [[Jean Bourgoin]] |figurino = |precedido_por = |seguido_por = |estúdio = Dispat Films<br />Gemma Cinematografica<br />Tupan Filmes |elenco = [[Breno Mello]]<br />[[Marpessa Dawn]]<br />[[Lourdes de Oliveira]]<br />[[Léa Garcia]] |código-IMDB = 0053146 |tipo = LF |cor-pb = cor. }} '''''Orfeu Negro'''''<ref>{{Citation|title=Orfeu do Carnaval|url=https://www.adorocinema.com/filmes/filme-261/|accessdate=2023-02-18|language=pt-BR|last=AdoroCinema}}</ref> ou '''''Orfeu do Carnaval'''''<ref>{{Citar web|url=https://web.archive.org/web/20130522152505/http://noticias.r7.com/rio-de-janeiro/noticias/a-espera-de-obama-chapeu-mangueira-e-babilonia-preparam-documentario-e-cartas-ao-presidente-20110316.html|titulo=À espera de Obama, Chapéu Mangueira e Babilônia preparam documentário e cartas ao presidente - Rio de Janeiro - R7|data=2013-05-22|acessodata=2023-02-18|website=web.archive.org}}</ref> (na [[França]], '''''Orphée Noir'''''; na [[Itália]], '''''Orfeo Negro''''') é um [[filme]] ítalo-franco-[[brasil]]eiro de [[1959 no cinema|1959]], dirigido por [[Marcel Camus]] e com [[roteiro]] adaptado por Camus e [[Jacques Viot]] a, partir da [[peça teatral]] ''[[Orfeu da Conceição]]'', de [[Vinícius de Moraes]].. A trilha sonora é de [[Tom Jobim]] e [[Luís Bonfá]]. Vinícius e [[Antônio Maria de Araújo Morais|Antônio Maria]] também tiveram músicas incluídas, mas, assim como [[Agostinho dos Santos]], que interpretou a música-tema de Orfeu, "[[Manhã de Carnaval]]", não receberam os créditos. O filme teve outra versão em 1999, sob o nome ''[[Orfeu (filme)|Orfeu]]'', dirigida por [[Cacá Diegues]]. O filme ganhou o [[Oscar de Melhor Filme Internacional]] em 1960, representando a França.<ref>{{citar web|título=A França no Oscar: veja a lista dos filmes franceses premiados|url=http://blogs.oglobo.globo.com/paris/post/a-franca-no-oscar-veja-lista-dos-filmes-franceses-premiados-561194.html|acessodata=2 de Junho de 2016}}</ref> Trata-se da primeira produção de [[língua portuguesa]] a conquistar a estatueta do [[Oscar]].<ref>{{citar web|título=Quando os portugueses chegaram aos Óscares|url=http://mag.sapo.pt/cinema/atualidade-cinema/artigos/quando-os-portugueses-chegaram-aos-oscares?artigo-completo=sim|acessodata=2 de Junho de 2016}}</ref> É também, juntamente com ''[[Mustang (filme)|Mustang]]'', ''[[Emilia Pérez|Emilia Perez]]'' e ''[[Un Simple Accident|It Was Just an Accident]]'', um dos filmes não francófonos a representar a França no [[Oscar]]. test test test test test test == Enredo == O enredo é inspirado na [[mitologia grega]], na história de [[Orfeu]] e [[Eurídice]]. A adaptação ambientou a obra no Brasil, em uma [[favela]] do [[Rio de Janeiro (cidade)|Rio de Janeiro]], na época do [[Carnaval]]. Eurídice vem fugida do [[Sertão brasileiro|sertão nordestino]] para morar na favela com sua prima Serafina. Ela tem medo de um homem que está perseguindo-a e quer matá-la; ela não sabe o motivo, mas pensa que esse homem talvez tenha gostado dela e, como ela não lhe deu confiança, ele agora quer se vingar. Ela apaixona-se perdidamente por Orfeu, que é noivo da bela e sedutora Mira. O tempo passa, Mira passa a perseguir Eurídice, com ciúmes. Serafina ajuda a prima a namorar Orfeu. Eurídice conhece o carnaval [[Carioca (gentílico)|carioca]] ao lado de Orfeu, mas sempre se apavora e corre quando vê que o tal homem está perto. Um dia, ela revela tudo a Orfeu. Ele a protege e diz que vai ficar ao seu lado. O namoro deles é puro e inocente, sem malícia. Passa o tempo. Um dia, se divertindo no último dia de carnaval, Eurídice teme que o homem apareça, e acha melhor voltar para a favela, que fica perto. Ela entra num beco escuro, para subir a favela, mas ela não conhece bem o local e fica assustada. O homem a encontra e a persegue. Ela sai correndo desesperada e entra num galpão velho e escuro. Ela tenta se esconder do homem, mas este a acha. Desesperada, ela pula de um tablado e se segura em um fio de alta tensão. Orfeu chega e liga a tensão, Eurídice cai e morre eletrocutada. Orfeu briga com homem e fica inconsciente, quando acorda se dá conta dos fatos. Ele fica desolado. A ambulância chega e leva o corpo ao [[Instituto Médico Legal]]. Ele não pode ir junto. [[Quarta-feira de cinzas]] e Orfeu só sabe chorar. Ele vai atrás do corpo, faz uma sessão [[Espiritismo|espírita]] na qual Eurídice baixa no corpo de uma senhora, mas, enfim, Orfeu acha seu corpo. Ele sequestra-o e leva à favela. Mira vê, e enfurecida, joga uma pedra na cabeça de Orfeu. Com a pancada ele cai de uma ribanceira com o corpo morto de Eurídice nos braços e morre também. == Elenco principal == [[Ficheiro:Marpessa Dawn, 1959.tif|miniaturadaimagem|[[Breno Mello]] e [[Marpessa Dawn]] atuando em Orfeu Negro]] * [[Breno Mello]] .... Orfeu * [[Marpessa Dawn]] .... Eurídice * [[Lourdes de Oliveira]] .... Mira * [[Léa Garcia]] .... Serafina * [[Adhemar Ferreira da Silva]] .... Morte * [[Alexandro Constantino]] .... Hermes * [[Waldemar de Souza|Waldir de Souza]] (Waldir 59) .... Chico Bôto * [[Jorge dos Santos]] .... Benedito * [[Aurino Cassiano]] .... Zeca * [[Tião Macalé]] .... Homem vendendo o Gramofone. * [[Cartola_(compositor)|Cartola]] (participação especial) == Principais prêmios e indicações == [[Festival de Cannes]] 1959 (França) * Recebeu a [[Palma de Ouro]]. ''[[Óscar|Oscar]]'' 1960 (EUA) * Vencedor na categoria de melhor filme em língua estrangeira (português/diretor). [[Prêmios Globo de Ouro|Globo de Ouro]] 1960 (EUA) * Venceu na categoria de melhor filme estrangeiro (França). ''[[BAFTA|British Academy of Film and Television Arts]]'' 1961 (Reino Unido) * Indicado na categoria de melhor filme em língua estrangeira (Brasil, França e Itália/produção). == Influência == Orfeu Negro foi citado por [[Jean-Michel Basquiat]] como uma de suas primeiras influências musicais, enquanto [[Barack Obama]] observa em seu livro de memórias [[Dreams from My Father]] (1995) que era o filme favorito de sua mãe.<ref name=":0">{{Citar web|ultimo=|url=https://www.correiobraziliense.com.br/app/noticia/diversao-e-arte/2010/06/05/interna_diversao_arte,196187/obama-e-quase-brasileiro.shtml|titulo=Obama é 'quase' brasileiro|data=18-2-2023|acessodata=2023-02-18|website=Acervo|lingua=pt-BR}}</ref> Obama, no entanto, não compartilhar preferências de sua mãe após a primeira a ver o filme durante seus primeiros anos na [[Universidade Columbia|Universidade de Columbia]]: "de repente eu percebi que a representação dos negros infantis que eu estava vendo agora na tela, a imagem inversa de selvagens escuros de Conrad, era o que minha mãe tinha levado com ela para o [[Havaí]] todos aqueles anos antes, um reflexo das fantasias simples que haviam sido proibidas de uma menina branca, de classe média do [[Kansas]], a promessa de uma outra vida: quente, sensual, exótica, diferente.<ref name=":0" /> == Remakes e adaptações == Em [[1999]], um novo filme, [[Orfeu (filme)|Orfeu]], foi feita por [[Cacá Diegues]], com uma trilha sonora que caracteriza o cantor e compositor brasileiro [[Caetano Veloso]]. O diretor disse que não era um remake de Orfeu Negro, mas um filme baseado na peça original de Vinicius de Moraes, de 1956.<ref>{{Citar web|url=https://www1.folha.uol.com.br/fsp/ilustrad/fq23049921.htm|titulo=Folha de S.Paulo - Cinema - "Orfeu": Filme confirma mito, diz Caetano Veloso - 23/04/1999|acessodata=2023-02-18|website=www1.folha.uol.com.br}}</ref> Em julho de 2014, uma adaptação musical de Broadway Orfeu Negro foi anunciada, a ser escrita por [[Lynn Nottage]] e dirigido por George C. Wolfe.<ref>{{Citar web|ultimo=Archive|primeiro=View Author|ultimo2=Twitter|primeiro2=Follow on|url=https://nypost.com/2020/02/13/antonio-carlos-jobims-music-finally-coming-to-broadway/|titulo=Antônio Carlos Jobim's music finally coming to Broadway|data=2020-02-13|acessodata=2023-02-18|lingua=en-US|ultimo3=feed|primeiro3=Get author RSS}}</ref> == Na cultura popular == Cenas do filme foram utilizados no lyric vídeo da música Afterlife da banda [[Arcade Fire]], de 2013.<ref>{{Citar web|ultimo=G1|primeiro=Do|ultimo2=Paulo|primeiro2=em São|url=http://g1.globo.com/musica/noticia/2013/10/arcade-fire-lanca-clipe-com-imagens-do-filme-orfeu-do-carnaval.html|titulo=Arcade Fire lança clipe com imagens do filme 'Orfeu do Carnaval'|data=2013-10-22|acessodata=2023-02-18|website=Música|lingua=pt-br}}</ref> == Ver também == * [[Lista de indicações brasileiras ao Oscar]] {{Referências}} == Bibliografia == * {{Citar periódico|ultimo=Campos-Muñoz|primeiro=Germán|data=2012|titulo=Contrapuntos órficos: Mitografía brasileña y el mito de Orfeo|url=https://muse.jhu.edu/article/502895|jornal=Latin American Research Review|lingua=es|volume=47|numero=4|paginas=31–48|doi=10.1353/lar.2012.0048|issn=1542-4278}} {{Oscar de melhor filme estrangeiro}} {{Palma de Ouro}} {{Portal3|Cinema|Rio de Janeiro|Brasil|França|Itália}} {{Controle de autoridade}} [[Categoria:Filmes do Brasil de 1959]] [[Categoria:Filmes da França de 1959]] [[Categoria:Filmes da Itália de 1959]] [[Categoria:Filmes de drama da Itália]] [[Categoria:Filmes premiados com o Oscar de melhor filme internacional]] [[Categoria:Filmes premiados com a Palma de Ouro]] [[Categoria:Filmes baseados em peças de teatro]] [[Categoria:Filmes premiados com o Globo de Ouro de melhor filme em língua estrangeira]] [[Categoria:Filmes de drama do Brasil]] [[Categoria:Filmes de drama da França]] [[Categoria:Filmes de fantasia romântica]] [[Categoria:Filmes em língua portuguesa]] [[Categoria:Filmes baseados na mitologia greco-romana]] [[Categoria:Filmes ambientados na cidade do Rio de Janeiro]] [[Categoria:Filmes gravados na cidade do Rio de Janeiro]] [[Categoria:Filmes sobre afro-brasileiros]] [[Category:Wiki_Club_SHUATS]] == Testing == cross-origin edit testing hCaptcha bot detection q3szs4siiubkp5ok4x31daem6owjs39 739174 739101 2026-04-23T10:55:46Z ~2026-24985-19 73675 showcaptcha 739174 wikitext text/x-wiki {{Ver desambig|este=o filme de Marcel Camus|a peça teatral de Vinícius de Moraes|Orfeu da Conceição}} {{Info/Filme |título = Orfeu Negro |título-pt = Orfeu Negro |título-br = Orfeu do Carnaval |imagem = [[Imagem:Orfeu Negro, 1959.jpg|Orfeu Negro, 1959|230px]] |ano = 1959 |duração = 100 |idioma = [[Língua portuguesa|Português]] |país = [[Brasil]] • [[França]] • [[Itália]] |direção = [[Marcel Camus]] |roteiro = Marcel Camus<br />[[Jacques Viot]] |criação original = {{Baseado em|[[Orfeu da Conceição]]|[[Vinicius de Moraes]]}} |produção = Sasha Gordine. |co-produtor = |produção executivo = |música = [[Tom Jobim]]<br />[[Luiz Bonfá]] |edição = Andrée Feix |diretor de arte = |diretor de fotografia = [[Jean Bourgoin]] |figurino = |precedido_por = |seguido_por = |estúdio = Dispat Films<br />Gemma Cinematografica<br />Tupan Filmes |elenco = [[Breno Mello]]<br />[[Marpessa Dawn]]<br />[[Lourdes de Oliveira]]<br />[[Léa Garcia]] |código-IMDB = 0053146 |tipo = LF |cor-pb = cor. }} '''''Orfeu Negro'''''<ref>{{Citation|title=Orfeu do Carnaval|url=https://www.adorocinema.com/filmes/filme-261/|accessdate=2023-02-18|language=pt-BR|last=AdoroCinema}}</ref> ou '''''Orfeu do Carnaval'''''<ref>{{Citar web|url=https://web.archive.org/web/20130522152505/http://noticias.r7.com/rio-de-janeiro/noticias/a-espera-de-obama-chapeu-mangueira-e-babilonia-preparam-documentario-e-cartas-ao-presidente-20110316.html|titulo=À espera de Obama, Chapéu Mangueira e Babilônia preparam documentário e cartas ao presidente - Rio de Janeiro - R7|data=2013-05-22|acessodata=2023-02-18|website=web.archive.org}}</ref> (na [[França]], '''''Orphée Noir'''''; na [[Itália]], '''''Orfeo Negro''''') é um [[filme]] ítalo-franco-[[brasil]]eiro de [[1959 no cinema|1959]], dirigido por [[Marcel Camus]] e com [[roteiro]] adaptado por Camus e [[Jacques Viot]] a, partir da [[peça teatral]] ''[[Orfeu da Conceição]]'', de [[Vinícius de Moraes]].. A trilha sonora é de [[Tom Jobim]] e [[Luís Bonfá]]. Vinícius e [[Antônio Maria de Araújo Morais|Antônio Maria]] também tiveram músicas incluídas, mas, assim como [[Agostinho dos Santos]], que interpretou a música-tema de Orfeu, "[[Manhã de Carnaval]]", não receberam os créditos. O filme teve outra versão em 1999, sob o nome ''[[Orfeu (filme)|Orfeu]]'', dirigida por [[Cacá Diegues]] O filme ganhou o [[Oscar de Melhor Filme Internacional]] em 1960, representando a França.<ref>{{citar web|título=A França no Oscar: veja a lista dos filmes franceses premiados|url=http://blogs.oglobo.globo.com/paris/post/a-franca-no-oscar-veja-lista-dos-filmes-franceses-premiados-561194.html|acessodata=2 de Junho de 2016}}</ref> Trata-se da primeira produção de [[língua portuguesa]] a conquistar a estatueta do [[Oscar]].<ref>{{citar web|título=Quando os portugueses chegaram aos Óscares|url=http://mag.sapo.pt/cinema/atualidade-cinema/artigos/quando-os-portugueses-chegaram-aos-oscares?artigo-completo=sim|acessodata=2 de Junho de 2016}}</ref> É também, juntamente com ''[[Mustang (filme)|Mustang]]'', ''[[Emilia Pérez|Emilia Perez]]'' e ''[[Un Simple Accident|It Was Just an Accident]]'', um dos filmes não francófonos a representar a França no [[Oscar]]. test test test test test test == Enredo == O enredo é inspirado na [[mitologia grega]], na história de [[Orfeu]] e [[Eurídice]]. A adaptação ambientou a obra no Brasil, em uma [[favela]] do [[Rio de Janeiro (cidade)|Rio de Janeiro]], na época do [[Carnaval]]. Eurídice vem fugida do [[Sertão brasileiro|sertão nordestino]] para morar na favela com sua prima Serafina. Ela tem medo de um homem que está perseguindo-a e quer matá-la; ela não sabe o motivo, mas pensa que esse homem talvez tenha gostado dela e, como ela não lhe deu confiança, ele agora quer se vingar. Ela apaixona-se perdidamente por Orfeu, que é noivo da bela e sedutora Mira. O tempo passa, Mira passa a perseguir Eurídice, com ciúmes. Serafina ajuda a prima a namorar Orfeu. Eurídice conhece o carnaval [[Carioca (gentílico)|carioca]] ao lado de Orfeu, mas sempre se apavora e corre quando vê que o tal homem está perto. Um dia, ela revela tudo a Orfeu. Ele a protege e diz que vai ficar ao seu lado. O namoro deles é puro e inocente, sem malícia. Passa o tempo. Um dia, se divertindo no último dia de carnaval, Eurídice teme que o homem apareça, e acha melhor voltar para a favela, que fica perto. Ela entra num beco escuro, para subir a favela, mas ela não conhece bem o local e fica assustada. O homem a encontra e a persegue. Ela sai correndo desesperada e entra num galpão velho e escuro. Ela tenta se esconder do homem, mas este a acha. Desesperada, ela pula de um tablado e se segura em um fio de alta tensão. Orfeu chega e liga a tensão, Eurídice cai e morre eletrocutada. Orfeu briga com homem e fica inconsciente, quando acorda se dá conta dos fatos. Ele fica desolado. A ambulância chega e leva o corpo ao [[Instituto Médico Legal]]. Ele não pode ir junto. [[Quarta-feira de cinzas]] e Orfeu só sabe chorar. Ele vai atrás do corpo, faz uma sessão [[Espiritismo|espírita]] na qual Eurídice baixa no corpo de uma senhora, mas, enfim, Orfeu acha seu corpo. Ele sequestra-o e leva à favela. Mira vê, e enfurecida, joga uma pedra na cabeça de Orfeu. Com a pancada ele cai de uma ribanceira com o corpo morto de Eurídice nos braços e morre também. == Elenco principal == [[Ficheiro:Marpessa Dawn, 1959.tif|miniaturadaimagem|[[Breno Mello]] e [[Marpessa Dawn]] atuando em Orfeu Negro]] * [[Breno Mello]] .... Orfeu * [[Marpessa Dawn]] .... Eurídice * [[Lourdes de Oliveira]] .... Mira * [[Léa Garcia]] .... Serafina * [[Adhemar Ferreira da Silva]] .... Morte * [[Alexandro Constantino]] .... Hermes * [[Waldemar de Souza|Waldir de Souza]] (Waldir 59) .... Chico Bôto * [[Jorge dos Santos]] .... Benedito * [[Aurino Cassiano]] .... Zeca * [[Tião Macalé]] .... Homem vendendo o Gramofone. * [[Cartola_(compositor)|Cartola]] (participação especial) == Principais prêmios e indicações == [[Festival de Cannes]] 1959 (França) * Recebeu a [[Palma de Ouro]]. ''[[Óscar|Oscar]]'' 1960 (EUA) * Vencedor na categoria de melhor filme em língua estrangeira (português/diretor). [[Prêmios Globo de Ouro|Globo de Ouro]] 1960 (EUA) * Venceu na categoria de melhor filme estrangeiro (França). ''[[BAFTA|British Academy of Film and Television Arts]]'' 1961 (Reino Unido) * Indicado na categoria de melhor filme em língua estrangeira (Brasil, França e Itália/produção). == Influência == Orfeu Negro foi citado por [[Jean-Michel Basquiat]] como uma de suas primeiras influências musicais, enquanto [[Barack Obama]] observa em seu livro de memórias [[Dreams from My Father]] (1995) que era o filme favorito de sua mãe.<ref name=":0">{{Citar web|ultimo=|url=https://www.correiobraziliense.com.br/app/noticia/diversao-e-arte/2010/06/05/interna_diversao_arte,196187/obama-e-quase-brasileiro.shtml|titulo=Obama é 'quase' brasileiro|data=18-2-2023|acessodata=2023-02-18|website=Acervo|lingua=pt-BR}}</ref> Obama, no entanto, não compartilhar preferências de sua mãe após a primeira a ver o filme durante seus primeiros anos na [[Universidade Columbia|Universidade de Columbia]]: "de repente eu percebi que a representação dos negros infantis que eu estava vendo agora na tela, a imagem inversa de selvagens escuros de Conrad, era o que minha mãe tinha levado com ela para o [[Havaí]] todos aqueles anos antes, um reflexo das fantasias simples que haviam sido proibidas de uma menina branca, de classe média do [[Kansas]], a promessa de uma outra vida: quente, sensual, exótica, diferente.<ref name=":0" /> == Remakes e adaptações == Em [[1999]], um novo filme, [[Orfeu (filme)|Orfeu]], foi feita por [[Cacá Diegues]], com uma trilha sonora que caracteriza o cantor e compositor brasileiro [[Caetano Veloso]]. O diretor disse que não era um remake de Orfeu Negro, mas um filme baseado na peça original de Vinicius de Moraes, de 1956.<ref>{{Citar web|url=https://www1.folha.uol.com.br/fsp/ilustrad/fq23049921.htm|titulo=Folha de S.Paulo - Cinema - "Orfeu": Filme confirma mito, diz Caetano Veloso - 23/04/1999|acessodata=2023-02-18|website=www1.folha.uol.com.br}}</ref> Em julho de 2014, uma adaptação musical de Broadway Orfeu Negro foi anunciada, a ser escrita por [[Lynn Nottage]] e dirigido por George C. Wolfe.<ref>{{Citar web|ultimo=Archive|primeiro=View Author|ultimo2=Twitter|primeiro2=Follow on|url=https://nypost.com/2020/02/13/antonio-carlos-jobims-music-finally-coming-to-broadway/|titulo=Antônio Carlos Jobim's music finally coming to Broadway|data=2020-02-13|acessodata=2023-02-18|lingua=en-US|ultimo3=feed|primeiro3=Get author RSS}}</ref> == Na cultura popular == Cenas do filme foram utilizados no lyric vídeo da música Afterlife da banda [[Arcade Fire]], de 2013.<ref>{{Citar web|ultimo=G1|primeiro=Do|ultimo2=Paulo|primeiro2=em São|url=http://g1.globo.com/musica/noticia/2013/10/arcade-fire-lanca-clipe-com-imagens-do-filme-orfeu-do-carnaval.html|titulo=Arcade Fire lança clipe com imagens do filme 'Orfeu do Carnaval'|data=2013-10-22|acessodata=2023-02-18|website=Música|lingua=pt-br}}</ref> == Ver também == * [[Lista de indicações brasileiras ao Oscar]] {{Referências}} == Bibliografia == * {{Citar periódico|ultimo=Campos-Muñoz|primeiro=Germán|data=2012|titulo=Contrapuntos órficos: Mitografía brasileña y el mito de Orfeo|url=https://muse.jhu.edu/article/502895|jornal=Latin American Research Review|lingua=es|volume=47|numero=4|paginas=31–48|doi=10.1353/lar.2012.0048|issn=1542-4278}} {{Oscar de melhor filme estrangeiro}} {{Palma de Ouro}} {{Portal3|Cinema|Rio de Janeiro|Brasil|França|Itália}} {{Controle de autoridade}} [[Categoria:Filmes do Brasil de 1959]] [[Categoria:Filmes da França de 1959]] [[Categoria:Filmes da Itália de 1959]] [[Categoria:Filmes de drama da Itália]] [[Categoria:Filmes premiados com o Oscar de melhor filme internacional]] [[Categoria:Filmes premiados com a Palma de Ouro]] [[Categoria:Filmes baseados em peças de teatro]] [[Categoria:Filmes premiados com o Globo de Ouro de melhor filme em língua estrangeira]] [[Categoria:Filmes de drama do Brasil]] [[Categoria:Filmes de drama da França]] [[Categoria:Filmes de fantasia romântica]] [[Categoria:Filmes em língua portuguesa]] [[Categoria:Filmes baseados na mitologia greco-romana]] [[Categoria:Filmes ambientados na cidade do Rio de Janeiro]] [[Categoria:Filmes gravados na cidade do Rio de Janeiro]] [[Categoria:Filmes sobre afro-brasileiros]] [[Category:Wiki_Club_SHUATS]] == Testing == cross-origin edit testing hCaptcha bot detection nj26hc93auot8255q0vmewbjoi0eexb User talk:Dev Jadiya 3 167790 739171 672392 2026-04-23T07:15:59Z Dev Jadiya 66010 Bot: Adding Hello. ~~~~ 739171 wikitext text/x-wiki Hello. [[User:Dev Jadiya|Dev Jadiya]] ([[User talk:Dev Jadiya|talk]]) 07:15, 23 April 2026 (UTC) == Your recent edits == Hello Dev Jadiya. Please note, that the editing you recently did is not appreciated here. Several hundreds of edits in few minutes is something that needs to be done with flood/bot flag. What you did makes is impossible to find vandalism or other useful edits here. I just deleted the page and edits you created. Testwiki isn't for getting up your edit count or whatever. -[[User:Barras|<span style="color:blue; font-family:Bookman Old Style">'''Barras'''</span>]] [[User Talk:Barras|<span style="color:red; font-family:Bookman Old Style">'''talk'''</span>]] 12:33, 26 August 2025 (UTC) :Hi Barras. Apologies for the spam I was testing scripts and didn’t mean to cause issues. I’ll be more careful while testing tools here and follow the rules next time. Thanks for the informing. [[User:Dev Jadiya|Dev Jadiya]] ([[User talk:Dev Jadiya|talk]]) 12:37, 26 August 2025 (UTC) 2kgvsnvicg7v2ls0iukz5h6wpcnpo0p User talk:JWBTH/CD test cases 3 174831 739172 737963 2026-04-23T09:30:21Z JWBTH 52211 739172 wikitext text/x-wiki == Specific content == === Outdent templates === : Comment. [[User:Example|Example]] 21:10, 25 April 2026 (UTC) :: Comment. [[User:Example|Example]] 21:20, 25 April 2026 (UTC) ::: Comment. [[User:Example|Example]] 21:30, 25 April 2026 (UTC) :::: Comment. [[User:Example|Example]] 21:40, 25 April 2026 (UTC) :: {{od|2}} Outdent. :: [[User:Example|Example]] 21:50, 25 April 2026 (UTC) : Comment. [[User:Example|Example]] 21:10, 26 April 2026 (UTC) :: Comment. [[User:Example|Example]] 21:20, 26 April 2026 (UTC) ::: Comment. [[User:Example|Example]] 21:30, 26 April 2026 (UTC) :::: Comment. [[User:Example|Example]] 21:40, 26 April 2026 (UTC) :: {{od|2}} :: Outdent. [[User:Example|Example]] 21:50, 26 April 2026 (UTC) : Comment. [[User:Example|Example]] 21:10, 27 April 2026 (UTC) :: Comment. [[User:Example|Example]] 21:20, 27 April 2026 (UTC) ::: Comment. [[User:Example|Example]] 21:30, 27 April 2026 (UTC) :::: Comment. [[User:Example|Example]] 21:40, 27 April 2026 (UTC) :: {{od|2}} Outdent. :: Continue. :: [[User:Example|Example]] 21:50, 27 April 2026 (UTC) 80vh3ju4mirht9081u5jijvo4bcfb3t MediaWiki:Guidedtour-tour-aelect.js 8 174951 739161 738976 2026-04-22T21:32:47Z Chaotic Enby 58843 fetch 739161 javascript text/javascript ( function ( window, document, $, mw, gt ) { var tour; tour = new gt.TourBuilder( { name: 'aelect' } ); // Information defining each tour step tour.firstStep( { name: 'create', title: 'Welcome', description: 'Start by creating a new SecurePoll', attachTo: '#mw-content-subtitle a[href="/wiki/Special:SecurePoll/create"]', position: 'right', buttons: [ { name: 'Start', action: 'wikiLink', page: 'Special:SecurePoll/create', type: 'progressive' } ], allowAutomaticOkay: false, closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage('Special:SecurePoll/create') && $( '#mw-input-wpelection_title' ).length > 0 ) { return 'title'; } else if ( !gt.isPage('Special:SecurePoll') ) { return gt.TransitionAction.END; } } ) tour.step( { name: 'title', title: 'Title', description: new mw.Title('MediaWiki:Guidedtour-tour-aelect/title'), attachTo: '#mw-input-wpelection_title', position: 'right', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'startDate' ) tour.step( { name: 'startDate', title: 'Start date', description: new mw.Title('MediaWiki:Guidedtour-tour-aelect/startDate'), attachTo: '#mw-input-wpelection_startdate', position: 'right', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'endDate' ) tour.step( { name: 'endDate', title: 'End date', description: new mw.Title('MediaWiki:Guidedtour-tour-aelect/endDate'), attachTo: '#mw-input-wpelection_enddate', position: 'right', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'pollType' ) tour.step( { name: 'pollType', title: 'Poll type', description: 'Range voting (histogram range)', attachTo: '#mw-input-wpelection_type > .oo-ui-widget label:eq(4)', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'crypt' ) tour.step( { name: 'crypt', title: 'Encryption', description: 'OpenSSL', attachTo: '#mw-input-wpelection_crypt > .oo-ui-widget label:eq(1)', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'admins' ) tour.step( { name: 'admins', title: 'Poll administrators', description: 'Add all election clerks and election scrutineers, including backups, as poll administrators', attachTo: '.oo-ui-tagMultiselectWidget-inlined', // There is only one multiselect widget, making this more robust than the id #ooui-php-106 position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'shuffle' ) tour.step( { name: 'shuffle', title: 'Shuffle options', description: new mw.guidedTour.WikitextDescription("Make sure to '''not''' shuffle options"), attachTo: 'label.oo-ui-labelElement-label:contains("Shuffle options on the voting page")', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'openSSL' ) tour.step( { name: 'openSSL', title: 'Generating OpenSSL keys', description: new mw.Title('MediaWiki:Guidedtour-tour-aelect/openSSL'), autoFocus: false, overlay: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'openSSL2' ) tour.step( { name: 'openSSL2', title: 'Generating OpenSSL keys', description: new mw.guidedTour.WikitextDescription(`Type the following commands:\n <syntaxhighlight lang="ps1">openssl genpkey -algorithm rsa -out encrypt-private.pem\n openssl pkey -in encrypt-private.pem -pubout -out encrypt-public.pem\n openssl genpkey -algorithm rsa -out sign-private.pem\n openssl pkey -in sign-private.pem -pubout -out sign-public.pem</syntaxhighlight>`), autoFocus: false, overlay: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'encryptionKey' ) tour.step( { name: 'encryptionKey', title: 'Encryption key', description: new mw.guidedTour.WikitextDescription("Paste the entire contents of encrypt-'''public'''.pem here, including delimiters like <code>-----BEGIN PUBLIC KEY-----</code>"), attachTo: '#mw-input-wpopenssl-encrypt-key', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'signingKey' ) tour.step( { name: 'signingKey', title: 'Signing key', description: new mw.guidedTour.WikitextDescription("Paste the entire contents of sign-'''private'''.pem here, including delimiters like <code>-----BEGIN PRIVATE KEY-----</code>"), attachTo: '#mw-input-wpopenssl-sign-key', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'questionText' ) tour.step( { name: 'questionText', title: 'Question text', description: new mw.Title('MediaWiki:Guidedtour-tour-aelect/questionText'), attachTo: '#mw-input-wpquestions--0--text', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'customMessages' ) tour.step( { name: 'customMessages', title: 'Custom messages', description: 'Use the following custom messages: "Oppose", "Neutral", "Support"', attachTo: 'label.oo-ui-labelElement-label:contains("Use custom messages for column labels")', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'candidateNames' ) tour.step( { name: 'candidateNames', title: 'Candidate names', description: new mw.Title('MediaWiki:Guidedtour-tour-aelect/candidateNames'), attachTo: '#mw-input-wpquestions--0--options--0--text', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'editSummary' ) tour.step( { name: 'editSummary', title: 'Edit summary', description: 'Add a short edit summary, e.g. "Create"', attachTo: '#mw-input-wpcomment', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'createPoll' ) tour.step( { name: 'createPoll', title: 'Create poll', description: 'Click here to create the poll', attachTo: '.mw-htmlform-submit-buttons .oo-ui-widget', position: 'right', autoFocus: true, buttons: [ { action: 'end' } ], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) // The following should be the last line of your tour. } ( window, document, jQuery, mediaWiki, mediaWiki.guidedTour ) ); rwlwgcxwbbkctbkt1dkm9xafjgp716l SecurePoll:1034/msg/en 830 174953 739127 738974 2026-04-22T19:46:24Z Chaotic Enby 58843 do nothing 739127 SecurePoll application/json { "id": "1034", "lang": "en", "messages": { "intro": "[[Wikipedia:Administrator elections/May 2026|Election main page]] • [[Wikipedia talk:Administrator elections|Report problems or issues]] • [[Wikipedia:Administrator elections/May 2026#What data does SecurePoll collect?|What data does SecurePoll collect?]]\r\n\r\n\r\n'''''Instructions'''''\r\n\r\n* '''Use the radio buttons.''' Please use the radio buttons below to indicate your preference for each candidate with \"Oppose\", \"Abstain\", or \"Support\". An \"Abstain\" vote does not affect the outcome in any way.\r\n\r\n* '''Vote in a single sitting.''' Voting must be done in a single sitting.\r\n\r\n* '''You may change your vote by starting over.''' After your vote has been accepted, you may change your vote any time before the close of voting. To do so, reopen the voting interface and a fresh ballot page will be displayed. You will need to complete the voting process again from scratch. For this reason, consider keeping a private record of your vote. Your new ballot will override the old one.", "title": "English Wikipedia test election, May 2026", "unqualified-error": "For the reason(s) above, your account does not meet the requirements to vote in this election. If you believe you are receiving this message in error, please post on the [[Wikipedia talk:Administrator elections|election talk page]]." }, "questions": [ { "id": "1035", "messages": { "column+1": "Support", "column-1": "Oppose", "column0": "Neutral", "text": "May 2026 English Wikipedia Administrator Election candidates" }, "options": [ { "id": "1036", "messages": { "text": "''Mononykus''" } }, { "id": "1037", "messages": { "text": "''Stegouros''" } }, { "id": "1038", "messages": { "text": "''Kulindadromeus''" } } ] } ] } etmfqm87hq8ro8v9pvh9lw132u2wylx User:MrJaroslavik/CheckUserLogCount.js 2 174966 739098 2026-04-22T14:31:59Z MrJaroslavik 44012 Creating CheckUserLogCount.js 739098 javascript text/javascript // CheckUserLogCount.js // Based on countCUStats.js - https://meta.wikimedia.org/wiki/User:Glaisher/countCUStats.js // Features: // - Counts total CheckUser actions per user within a selected date range. // - Breakdown by Total actions, Months, Quarters (Q1–Q4), or Years // - Adds an interactive control panel directly to the [[Special:CheckUserLog]] page. // - Shows a sortable table with direct links to user CheckUsers log entries. // - Automatically loads all data even for very busy periods. // - Shows the date of the very last CheckUser action for every user in the results. // - Highlights current CheckUsers with green background and identifies inactive ones. // - Generates ready-to-copy Wikitext table. // - With help of Gemini 3 (function() { 'use strict'; // Only run on the CheckUserLog special page if (mw.config.get('wgCanonicalSpecialPageName') !== 'CheckUserLog') { return; } // Load required MediaWiki modules for API and UI mw.loader.using(['mediawiki.api', 'mediawiki.util', 'jquery.tablesorter']).then(async function() { const api = new mw.Api(); const now = new Date(); const currYear = now.getUTCFullYear(); const currMonth = now.getUTCMonth() + 1; // Build the user interface panel function setupUI() { // Prevent duplicate panels on the page $('.cu-stats-wrapper').remove(); // Generate year options (from 2005 to present) let yearOpts = ''; for (let y = currYear; y >= 2005; y--) { yearOpts += `<option value="${y}">${y}</option>`; } // Generate month selection menus let monthOptsFrom = ''; let monthOptsTo = ''; for (let m = 1; m <= 12; m++) { const label = String(m).padStart(2, '0'); // Default starting month to January monthOptsFrom += `<option value="${m}" ${m === 1 ? 'selected' : ''}>${label}</option>`; // Default ending month to current month monthOptsTo += `<option value="${m}" ${m === currMonth ? 'selected' : ''}>${label}</option>`; } // Define the HTML structure for the control panel with mode selection const html = ` <div class="cu-stats-wrapper" style="border: 1px solid #a2a9b1; padding: 15px; margin-bottom: 20px; background: #f8f9fa; border-radius: 2px;"> <h3 style="margin-top:0; border-bottom: 1px solid #a2a9b1; padding-bottom: 5px;">CheckUserLogCount.js</h3> <div style="margin-bottom: 10px; display: flex; align-items: center; gap: 10px; flex-wrap: wrap;"> <span>From:</span> <select id="cu-year-from" style="padding: 3px;">${yearOpts}</select> <select id="cu-month-from" style="padding: 3px;">${monthOptsFrom}</select> <span>To:</span> <select id="cu-year-to" style="padding: 3px;">${yearOpts}</select> <select id="cu-month-to" style="padding: 3px;">${monthOptsTo}</select> </div> <div style="margin-bottom: 10px; display: flex; gap: 15px; font-size: 0.9em; align-items: center;"> <span style="font-weight:bold;">View mode:</span> <label><input type="radio" name="cu-mode" value="total" checked> Total only</label> <label><input type="radio" name="cu-mode" value="months"> By Months</label> <label><input type="radio" name="cu-mode" value="quarters"> By Quarters</label> <label><input type="radio" name="cu-mode" value="years"> By Years</label> <button id="cu-stats-run" class="mw-ui-button mw-ui-progressive" style="margin-left: auto;">Run</button> </div> <div id="cu-stats-results" style="display:none; margin-top: 15px; border-top: 1px solid #c8ccd1; padding-top: 10px;"> <div id="cu-loader" style="font-weight:bold; margin-bottom: 5px;"></div> <div id="cu-table-container"></div> </div> </div>`; // Add the interface to the top of the page content $('#mw-content-text').prepend(html); // Handle the "Run" button click event $('#cu-stats-run').click(function() { const $btn = $(this); const params = { yf: parseInt($('#cu-year-from').val()), mf: parseInt($('#cu-month-from').val()), yt: parseInt($('#cu-year-to').val()), mt: parseInt($('#cu-month-to').val()), mode: $('input[name="cu-mode"]:checked').val() }; // Disable the button during processing $btn.prop('disabled', true).text('Running...'); // Run the audit with collected parameters runAudit(params).finally(() => { $btn.prop('disabled', false).text('Run'); }); }); } // Main logic to fetch and process CheckUser data with timeline support async function runAudit(cfg) { $('#cu-stats-results').show(); $('#cu-table-container').empty(); $('#cu-loader').text('Connecting to API...').css("color", "#202122").show(); // Prepare dates and range limits const START = `${cfg.yf}-${String(cfg.mf).padStart(2, '0')}-01T00:00:00Z`; const lastDay = new Date(Date.UTC(cfg.yt, cfg.mt, 0)).getUTCDate(); const END = `${cfg.yt}-${String(cfg.mt).padStart(2, '0')}-${String(lastDay).padStart(2, '0')}T23:59:59Z`; const userStats = {}; let totalActions = 0; let continueToken = ''; try { // Phase 1: Get current CheckUsers (even those with no activity) const currentCUs = []; const auRes = await api.get({ action: 'query', list: 'allusers', augroup: 'checkuser', aulimit: 'max', formatversion: 2 }); (auRes.query.allusers || []).forEach(u => { userStats[u.name] = { total: 0, timeline: {} }; currentCUs.push(u.name); }); // Phase 2: Fetch logs and build the activity timeline let finished = false; while (!finished) { const params = { action: 'query', list: 'checkuserlog', culfrom: START, culto: END, culdir: 'newer', cullimit: 'max', formatversion: 2 }; if (continueToken) params.culcontinue = continueToken; const res = await api.get(params); const entries = res.query?.checkuserlog?.entries || []; entries.forEach(e => { if (e.checkuser) { const u = e.checkuser; const monthKey = e.timestamp.substring(0, 7); // Extract YYYY-MM if (!userStats[u]) { userStats[u] = { total: 0, timeline: {} }; } userStats[u].total++; userStats[u].timeline[monthKey] = (userStats[u].timeline[monthKey] || 0) + 1; totalActions++; } }); if (res.continue?.culcontinue) { continueToken = res.continue.culcontinue; $('#cu-loader').text(`Processing logs... Found ${totalActions} actions.`); } else { finished = true; } } // Phase 3: Get the absolute last action date for each user const lastActions = {}; const usernames = Object.keys(userStats); for (let j = 0; j < usernames.length; j++) { const u = usernames[j]; $('#cu-loader').text(`Checking last activity for ${u} (${j + 1}/${usernames.length})...`); const lastRes = await api.get({ action: 'query', list: 'checkuserlog', cullimit: 1, culuser: u, formatversion: 2 }); const lastEntry = lastRes.query?.checkuserlog?.entries?.[0]; lastActions[u] = lastEntry ? lastEntry.timestamp.replace('T', ' ').substring(0, 16) : 'Never'; } $('#cu-loader').hide(); renderTable(userStats, totalActions, lastActions, currentCUs, cfg); } catch (err) { console.error("CheckUser Stats Error:", err); const errorMsg = err.statusText || err; $('#cu-loader').text(`API Error: ${errorMsg}`).css("color", "#d33"); } } // Create the dynamic results table and Wikitext export function renderTable(userStats, total, lastActions, currentCUs, cfg) { // Sort users: highest total first, then alphabetical const sortedUsers = Object.keys(userStats).map(u => ({ name: u, ...userStats[u] })) .sort((a, b) => b.total - a.total || a.name.localeCompare(b.name)); // 1. Generate time columns based on the selected range and mode const timeCols = []; let startIter = new Date(Date.UTC(cfg.yf, cfg.mf - 1, 1)); const endIter = new Date(Date.UTC(cfg.yt, cfg.mt - 1, 1)); while (startIter <= endIter) { const k = startIter.toISOString().substring(0, 7); // "YYYY-MM" if (cfg.mode === 'months') { timeCols.push({ id: k, label: k }); } else if (cfg.mode === 'quarters') { const q = Math.floor(startIter.getUTCMonth() / 3) + 1; const qid = `${startIter.getUTCFullYear()}-Q${q}`; if (!timeCols.find(c => c.id === qid)) { timeCols.push({ id: qid, label: qid, months: [] }); } timeCols.find(c => c.id === qid).months.push(k); } else if (cfg.mode === 'years') { const yid = `${startIter.getUTCFullYear()}`; if (!timeCols.find(c => c.id === yid)) { timeCols.push({ id: yid, label: yid, months: [] }); } timeCols.find(c => c.id === yid).months.push(k); } startIter.setUTCMonth(startIter.getUTCMonth() + 1); } // 2. Build HTML table headers and rows const headerHtml = timeCols.map(c => `<th>${c.label}</th>`).join(''); const rows = sortedUsers.map(stat => { const isCurrent = currentCUs.includes(stat.name); const hasActions = stat.total > 0; let trStyle = ''; if (isCurrent) trStyle = 'style="background-color: #94e1cc;"'; else if (!hasActions) trStyle = 'style="color: #72777d;"'; // Generate cells for the timeline (HTML and Wikitext) const timeCells = timeCols.map(c => { let val = 0; if (cfg.mode === 'months') { val = stat.timeline[c.id] || 0; } else { // Works for both quarters and years c.months.forEach(m => val += (stat.timeline[m] || 0)); } return `<td style="font-size:0.9em; color:#54595d;">${val > 0 ? val : '-'}</td>`; }).join(''); return ` <tr ${trStyle}> <td style="text-align:left; white-space: nowrap;"> <a href="${mw.util.getUrl('Special:CheckUserLog', { cuInitiator: stat.name })}"> ${mw.html.escape(stat.name)} </a> <small style="color: #72777d;">Last: ${lastActions[stat.name]}</small> </td> <td><strong>${stat.total}</strong></td> ${timeCells} </tr>`; }).join(''); // 3. Prepare Wikitext for reports (cleaned structure) const dbName = mw.config.get('wgDBname'); const dateStr = new Date().toISOString().replace('T', ' ').substring(0, 16); let wikitext = `== CheckUser Stats for ${dbName} (${cfg.mf}/${cfg.yf} – ${cfg.mt}/${cfg.yt}) ==\n`; wikitext += `''Report generated on: ${dateStr} (UTC)<br />\nGenerated with [[testwiki:User:MrJaroslavik/CheckUserLogCount.js|CheckUserLogCount.js]]''\n`; wikitext += `\n'''Total actions in period: ${total}'''\n\n`; // Header logic: handle total only vs timeline columns const colHeader = timeCols.length ? ' !! ' + timeCols.map(c => c.label).join(' !! ') : ''; wikitext += `{| class="wikitable sortable" style="text-align:right;"\n! Initiator !! Total${colHeader}\n`; sortedUsers.forEach(stat => { let timelineStr = ''; if (timeCols.length) { timelineStr = ' || ' + timeCols.map(c => { let val = 0; if (cfg.mode === 'months') { val = stat.timeline[c.id] || 0; } else { c.months.forEach(m => val += (stat.timeline[m] || 0)); } return val; }).join(' || '); } wikitext += `|-\n| style="text-align:left; white-space:nowrap;" | [[User:${stat.name}|${stat.name}]] <small>(Last: ${lastActions[stat.name]})</small> || '''${stat.total}'''${timelineStr}\n`; }); wikitext += `|}\n`; // 4. Update the UI container $('#cu-table-container').html(` <p><strong>Total actions found: ${total}</strong></p> <div style="overflow-x: auto;"> <table class="wikitable sortable" style="width:100%; text-align:center;"> <thead> <tr> <th style="text-align:left">Initiator</th> <th>Total</th> ${headerHtml} </tr> </thead> <tbody>${rows}</tbody> </table> </div> <div style="margin-top: 20px;"> <label style="font-weight:bold; display:block; margin-bottom:5px;">Report Wikitext:</label> <textarea readonly style="width:100%; height:150px; font-family:monospace; font-size:11px; padding:5px; border:1px solid #c8ccd1;">${wikitext}</textarea> </div> `); // Enable sorting $('table.sortable').tablesorter(); } // Initialize the UI on page load setupUI(); }); })(); 1frlidob73wxq6x3htahhnqi06wdwi0 User:MrJaroslavik/GlobalCheckUserStats.js 2 174967 739099 2026-04-22T14:44:34Z MrJaroslavik 44012 Creating GlobalCheckUserStats.js 739099 javascript text/javascript // GlobalCheckUserStats.js // ------------------------------------------------------- // Features: // - Global Stats: Scans logs across 800+ projects at once. // - Smart Roles: Identifies Local CheckUsers, Stewards, Staff, and Ombuds - and distinguishes between Former/Current roles. // - Deep Scan: Bypasses API limits to get full history (limit 500 entries). // - Stable: Retries 3x on rate limits so no wiki is missed. // - Error Logs: Lists failed projects (ex. because of 429) at the end of the report. // - UI: Integrated at [[meta:Special:BlankPage/GlobalCheckUserStats]]. // - Output: sortable Wikitables and detailed rights change logs and CSV file // - With help of Gemini 3 // ------------------------------------------------------- (function() { 'use strict'; // Run only on Special:BlankPage/GlobalCheckUserStats const isBlank = mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage'; const isGCUS = mw.config.get('wgTitle').includes('GlobalCheckUserStats'); if (!isBlank || !isGCUS) { return; } // Wait 500ms between requests to avoid hitting API limits const DELAY_MS = 500; const sleep = ms => new Promise(r => setTimeout(r, ms)); // Save data here so we don't have to download it twice let userCache = {}; let historyCache = {}; // This map of all wikis will be filled automatically let globalWikiMap = {}; // Turn different API formats into a clean list of groups const extractGroups = (data) => { if (!data) return []; let groups = []; // Check if data is already a list, an object, or just text if (Array.isArray(data)) { groups = data; } else if (typeof data === 'object') { groups = Object.values(data); } else if (typeof data === 'string') { groups = data.split(',').map(s => s.trim()); } // Normalize names so "Check User" becomes "checkuser" return groups.map(name => { if (typeof name !== 'string') return name; return name.replace(/\s+/g, '').toLowerCase(); }); }; // Makes API calls and waits automatically if the server is busy async function robustCall(api, params) { let retries = 0; const maxRetries = 3; while (retries < maxRetries) { try { // Try to get data from the server return await api.get(params); } catch (err) { // If we get a "too many requests" error if (err?.status === 429) { retries++; // See how long the server wants us to wait const waitTime = parseInt(err.xhr?.getResponseHeader('Retry-After')) || (30 * retries); // Update the UI so the user knows we are waiting $('#status-msg').html( `<span style="color:orange; font-weight:bold;">Server is busy! Waiting ${waitTime}s...</span>` ); await sleep(waitTime * 1000); } else { // Stop if it is a different kind of error throw err; } } } // Give up after 3 tries throw new Error("Failed to reach API after multiple attempts"); } // List of wikis where CheckUser extension is disabled - https://noc.wikimedia.org/conf/highlight.php?file=dblists/checkuser-disabled.dblist const disabledCUWikis = [ 'aawikibooks', 'abwiktionary', 'advisorywiki', 'akwiktionary', 'angwikiquote', 'angwikisource', 'astwikibooks', 'astwikiquote', 'aswikibooks', 'aswiktionary', 'avwiktionary', 'aywikibooks', 'bhwiktionary', 'biwikibooks', 'biwiktionary', 'bmwikibooks', 'bmwikiquote', 'bmwiktionary', 'bowiktionary', 'chwikibooks', 'chwiktionary', 'cnwikimedia', 'crwikiquote', 'crwiktionary', 'dzwiktionary', 'gawikibooks', 'gnwikibooks', 'gotwikibooks', 'guwikibooks', 'htwikisource', 'huwikinews', 'hzwiki', 'iewikibooks', 'iiwiki', 'internalwiki', 'kjwiki', 'kkwikiquote', 'knwikibooks', 'krwiki', 'krwikiquote', 'kswikibooks', 'kswikiquote', 'kwwikiquote', 'lbwikibooks', 'lbwikiquote', 'lnwikibooks', 'lvwikibooks', 'mhwiktionary', 'mnwikibooks', 'muswiki', 'nahwikibooks', 'nawikibooks', 'nawikiquote', 'ndswikibooks', 'ndswikiquote', 'piwiktionary', 'pswikibooks', 'quwikibooks', 'quwikiquote', 'rmwikibooks', 'rmwiktionary', 'rnwiktionary', 'scwiktionary', 'searchcomwiki', 'snwiktionary', 'spcomwiki', 'swwikibooks', 'thwikinews', 'tkwikibooks', 'tkwikiquote', 'towiktionary', 'transitionteamwiki', 'trwikinews', 'ttwikiquote', 'twwiktionary', 'ugwikibooks', 'ugwikiquote', 'vowikibooks', 'vowikiquote', 'wawikibooks', 'wikimania2005wiki', 'wikimania2006wiki', 'wikimania2007wiki', 'wikimania2009wiki', 'wikimania2015wiki', 'wowikiquote', 'xhwikibooks', 'xhwiktionary', 'yowikibooks', 'yowiktionary', 'zawikibooks', 'zawikiquote', 'zawiktionary', 'zh_min_nanwikibooks', 'zuwikibooks' ]; // Fetch all wikis and filter out the ones we cannot or should not scan function loadGlobalWikiMap() { const api = new mw.Api(); return api.get({ action: 'sitematrix', format: 'json', smtype: 'language|special', smlangprop: 'site', smsiteprop: 'dbname|url', formatversion: 2, origin: '*' }).then(function(data) { const matrix = data.sitematrix; const wikiMap = {}; // Loop through all language-based wikis Object.keys(matrix).forEach(key => { const entry = matrix[key]; if (entry.site && Array.isArray(entry.site)) { entry.site.forEach(site => { // Skip if it is private, a fishbowl, or has CheckUser disabled if (site.private || site.fishbowl || disabledCUWikis.includes(site.dbname)) { return; } wikiMap[site.dbname] = site.url; }); } }); // Loop through special projects like Commons or Meta if (matrix.specials && Array.isArray(matrix.specials)) { matrix.specials.forEach(special => { // Apply the same filters to special wikis if (special.private || special.fishbowl || disabledCUWikis.includes(special.dbname)) { return; } wikiMap[special.dbname] = special.url; }); } return wikiMap; }); } // Convert database names to short codes for linking function getInterwikiPrefix(db) { // Map special projects and specific language codes const specialMap = { 'commonswiki': 'c', 'metawiki': 'm', 'wikidatawiki': 'd', 'wikifunctionswiki': 'f', 'mediawikiwiki': 'mw', 'specieswiki': 'species', 'sourceswiki': 'oldwikisource', 'foundationwiki': 'foundation', 'incubatorwiki': 'incubator', 'outreachwiki': 'outreach', 'betawikiversity': 'betawikiversity', 'be_x_oldwiki': 'be-tarask', 'zh_classicalwiki': 'lzh', 'zh_min_nanwiki': 'nan', 'zh_yuewiki': 'yue' }; if (specialMap[db]) return specialMap[db]; const name = db.replace(/_/g, '-'); // Map project types like Wikibooks or Wiktionary to short prefixes if (name.endsWith('wikisource')) return 's:' + name.slice(0, -10); if (name.endsWith('wikiversity')) return 'v:' + name.slice(0, -11); if (name.endsWith('wiktionary')) return 'wikt:' + name.slice(0, -10); if (name.endsWith('wikivoyage')) return 'voy:' + name.slice(0, -10); if (name.endsWith('wikibooks')) return 'b:' + name.slice(0, -9); if (name.endsWith('wikiquote')) return 'q:' + name.slice(0, -9); if (name.endsWith('wikinews')) return 'n:' + name.slice(0, -8); // Format links for local Wikimedia chapters if (name.endsWith('wikimedia')) { return 'wm' + name.slice(0, -9); } // Create a Wikipedia link for standard project names if (name.endsWith('wiki')) { return 'w:' + name.slice(0, -4); } return 'w:' + name; } // Load required modules and start the script mw.loader.using(['mediawiki.api', 'mediawiki.ForeignApi']).then(async function() { // Display initial status message to the user $('#mw-content-text').html('<strong>GlobalCheckUserStats.js: Loading wiki list...</strong>'); // Download and cache the list of all Wikimedia wikis globalWikiMap = await loadGlobalWikiMap(); // Prepare the Meta-Wiki API and data containers const metaApi = new mw.ForeignApi('https://meta.wikimedia.org/w/api.php'); const now = new Date(); // Variables for storing audit results and script state let results = {}; let emptyWikis = []; let failedWikis = []; let scannedWikis = []; let isRunning = false; // Current UI filter settings let currentFilterMode = 'all'; let currentUserFilter = 'all'; // Prepare the year and month selection menus function setupUI() { const currentYear = now.getFullYear(); // Generate options for years from 2005 to today let yearOpts = ''; for (let y = currentYear; y >= 2005; y--) { yearOpts += `<option value="${y}">${y}</option>`; } // Generate options for the month range (January to December) let monthOptsFrom = ''; let monthOptsTo = ''; for (let m = 1; m <= 12; m++) { monthOptsFrom += `<option value="${m}" ${m === 1 ? 'selected' : ''}>${m}</option>`; monthOptsTo += `<option value="${m}" ${m === 12 ? 'selected' : ''}>${m}</option>`; } // Set the page title and build the HTML interface $('#firstHeading').text('GlobalCheckUserStats.js'); $('#mw-content-text').empty().append(` <div style="border:1px solid #a2a9b1; padding:15px; background:#f8f9fa;"> <h3 style="margin-top:0;">Stats Range</h3> <div> From: <select id="y-f" style="width:70px;">${yearOpts}</select> <select id="m-f" style="width:50px;">${monthOptsFrom}</select> &nbsp;&nbsp;&nbsp; To: <select id="y-t" style="width:70px;">${yearOpts}</select> <select id="m-t" style="width:50px;">${monthOptsTo}</select> </div> <div style="margin-top:15px; display:flex; align-items:center; gap:20px; font-size:13px;"> <strong>Wiki Filter:</strong> <label style="cursor:pointer;"><input type="radio" name="wiki-mode" id="btn-all" checked> All</label> <label style="cursor:pointer;"><input type="radio" name="wiki-mode" id="btn-except"> All except</label> <label style="cursor:pointer;"><input type="radio" name="wiki-mode" id="btn-only"> Only these</label> <span id="wiki-help-trigger" style="cursor:help; background:#36c; color:#fff; border-radius:50%; width:18px; height:18px; display:inline-block; text-align:center; font-weight:bold;" title="Show available DB names">?</span> </div> <div id="filter-input-container" style="display:none; margin-top:10px;"> <input id="wiki-filter" type="text" style="width:100%;" placeholder="Example: enwiki, dewiki, commonswiki..."> </div> <div style="margin-top:15px; display:flex; align-items:center; gap:20px; font-size:13px;"> <strong>User Filter:</strong> <label style="cursor:pointer;"><input type="radio" name="user-mode" id="u-all" checked> All</label> <label style="cursor:pointer;"><input type="radio" name="user-mode" id="u-local"> Local CheckUsers</label> <label style="cursor:pointer;"><input type="radio" name="user-mode" id="u-steward"> Steward actions</label> </div> <div style="margin-top:15px; display:flex; align-items:center; gap:20px; font-size:13px;"> <strong>View mode (Wikitext):</strong> <label style="cursor:pointer;"><input type="radio" name="cu-view-mode" value="total"> Total only</label> <label style="cursor:pointer;"><input type="radio" name="cu-view-mode" value="months" checked> Months</label> <label style="cursor:pointer;"><input type="radio" name="cu-view-mode" value="quarters"> Q1-Q4</label> <label style="cursor:pointer;"><input type="radio" name="cu-view-mode" value="years"> Years</label> </div> <div id="wiki-list-help" style="display:none; margin-top:10px; padding:10px; background:#fff; border:1px solid #a2a9b1; font-size:11px; max-height:120px; overflow-y:auto; font-family:monospace;"> <strong>Available database names:</strong><br>${Object.keys(globalWikiMap).sort().join(', ')} </div> <div style="margin-top:20px;"> <button id="start" class="mw-ui-button mw-ui-progressive">Run</button> <button id="stop" class="mw-ui-button mw-ui-destructive" disabled>Stop</button> </div> <div id="status-msg" style="margin-top:10px; font-weight:bold; color:#0056b3;">Ready.</div> <div style="margin-top:5px;"> <progress id="bar" value="0" max="${Object.keys(globalWikiMap).length}" style="width:100%"></progress> </div> <div id="output-containers" style="display:none; margin-top:10px;"> <div style="margin-bottom:10px;"> <strong>Wikitext:</strong> <textarea id="out" style="width:100%; height:250px; font-family:monospace; font-size:12px;"></textarea> </div> <div> <strong>CSV:</strong> <textarea id="csv-out" style="width:100%; height:150px; font-family:monospace; font-size:12px;"></textarea> </div> </div> </div> `); // Listen for filter changes and button clicks $('#btn-all').on('click', () => { currentFilterMode = 'all'; $('#filter-input-container').hide(); }); $('#btn-except').on('click', () => { currentFilterMode = 'exclude'; $('#filter-input-container').show(); $('#wiki-filter').focus(); }); $('#btn-only').on('click', () => { currentFilterMode = 'include'; $('#filter-input-container').show(); $('#wiki-filter').focus(); }); // User type filters $('#u-all').on('click', () => { currentUserFilter = 'all'; }); $('#u-local').on('click', () => { currentUserFilter = 'local'; }); $('#u-steward').on('click', () => { currentUserFilter = 'steward'; }); // Help and Execution controls $('#wiki-help-trigger').on('click', () => $('#wiki-list-help').toggle()); $('#start').on('click', () => { runAudit( $('#y-f').val(), $('#m-f').val(), $('#y-t').val(), $('#m-t').val() ); }); $('#stop').on('click', () => { isRunning = false; }); } // Get the number of active users for a specific wiki async function fetchWikiMetrics(db) { try { // Find the correct server URL for this database const baseUrl = globalWikiMap[db]; const api = new mw.ForeignApi(baseUrl + '/w/api.php'); // Request site statistics from the API const res = await robustCall(api, { action: 'query', meta: 'siteinfo', siprop: 'statistics', formatversion: 2 }); // Return the count of active users return { active: res.query.statistics.activeusers || 0 }; } catch (err) { // If the wiki is unreachable, return zero as a fallback return { active: 0 }; } } // Checks if the user held global roles (Steward/Staff/Ombuds) async function checkGlobalHistory(user, start, end) { try { const res = await robustCall(metaApi, { action: 'query', list: 'logevents', letype: 'gblrights', letitle: 'User:' + user, lelimit: 'max', formatversion: 2 }); const logs = res.query.logevents || []; const auditStart = new Date(start); const auditEnd = new Date(end); let status = { wasSteward: false, wasStaff: false, wasOmbuds: false }; logs.forEach(log => { const ts = new Date(log.timestamp); const p = log.params || {}; // Handle both new (named) and old (indexed) API formats const current = extractGroups(p.newGroups || p.add || p[1] || p["1"]); const old = extractGroups(p.oldGroups || p.remove || p[2] || p["0"]); if (ts >= auditStart && ts <= auditEnd) { if (current.includes('steward') || old.includes('steward')) status.wasSteward = true; if (current.includes('staff') || old.includes('staff')) status.wasStaff = true; if (current.some(g => g.includes('ombud')) || old.some(g => g.includes('ombud'))) status.wasOmbuds = true; } }); // If no changes during the period, check the state immediately before it started if (!status.wasSteward && !status.wasStaff && !status.wasOmbuds) { const priorLogs = logs .filter(log => new Date(log.timestamp) < auditStart) .sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp)); if (priorLogs.length > 0) { const p = priorLogs[0].params || {}; // Crucial: check both newGroups and legacy indexed params const groupsBefore = extractGroups(p.newGroups || p.add || p[1] || p["1"]); status.wasSteward = groupsBefore.includes('steward'); status.wasStaff = groupsBefore.includes('staff'); status.wasOmbuds = groupsBefore.some(g => g.includes('ombud')); } } return status; } catch (err) { return { wasSteward: false, wasStaff: false, wasOmbuds: false }; } } // Gather user information and fetch their rights logs async function fetchUserData(user, db, start, end) { const auditStart = new Date(start); const auditEnd = new Date(end); // Get current global groups from Meta-Wiki if not already cached if (!userCache[user]) { try { const globalRes = await robustCall(metaApi, { action: 'query', meta: 'globaluserinfo', guiprop: 'groups', guiuser: user, formatversion: 2 }); userCache[user] = globalRes.query.globaluserinfo.groups || []; } catch (err) { userCache[user] = []; } } // Canonical variables for current global status const currentGlobalGroups = userCache[user]; const isGloballySteward = currentGlobalGroups.includes('steward'); const isGloballyStaff = currentGlobalGroups.includes('staff'); const isGloballyOmbuds = currentGlobalGroups.includes('ombuds') || currentGlobalGroups.includes('ombudsman'); // Check for global role history in cache or fetch new data if (!historyCache[user]) { historyCache[user] = await checkGlobalHistory(user, start, end); } const historyRes = historyCache[user]; let isCurrentLocal = false; // Check current local CheckUser rights on the target wiki try { const wikiUrl = globalWikiMap[db]; const localApi = new mw.ForeignApi(wikiUrl + '/w/api.php'); // Request user group information from the local API const localRes = await robustCall(localApi, { action: 'query', list: 'users', ususers: user, usprop: 'groups', formatversion: 2 }); // Parse response and verify if 'checkuser' group is present const localUserData = localRes.query.users[0]; const localGroups = (localUserData && localUserData.groups) || []; isCurrentLocal = localGroups.includes('checkuser'); } catch (err) { // Default to false if the local rights check fails isCurrentLocal = false; } // Define the target string for CentralAuth rights logs const target = 'User:' + user + '@' + db; let logText = '', isSelfAssign = false, maxDurationMins = -1, longestTimeStr = "", assignCount = 0, hasLocalRightsInPeriod = false; // Retrieve all rights change logs from Meta-Wiki let events = [], continueToken = null, finished = false; while (!finished) { let params = { action: 'query', list: 'logevents', letype: 'rights', letitle: target, ledir: 'older', lelimit: 'max', formatversion: 2 }; // Handle API pagination with continue tokens if (continueToken) Object.assign(params, continueToken); // Execute the API call and merge the results const res = await robustCall(metaApi, params); const batch = res.query.logevents || []; events = events.concat(batch); // Check for more results to continue pagination if (res.continue) { continueToken = res.continue; } else { finished = true; } } // Initialize state variables for log processing let logEntries = [], pendingRemoved = null, lastPairedDate = null, capturedExpiry = null; // Iterate through collected events to process rights changes for (let i = 0; i < events.length; i++) { const e = events[i]; const p = e.params || {}; // Extract the performing user, stripping import prefixes if present const actor = e.user && e.user.includes('>') ? e.user.split('>')[1] : e.user; // Determine CheckUser status before and after the event using various param keys const hadCU = extractGroups(p.oldgroups || p.oldGroups || p["0"]).includes('checkuser'); const hasCU = extractGroups(p.newgroups || p.newGroups || p["1"]).includes('checkuser'); // Extract expiry metadata if the user already has rights and they are being updated if (hasCU && hadCU) { const rawMeta = p.newmetadata || p.newMetadata; if (rawMeta) { const metaArray = Array.isArray(rawMeta) ? rawMeta : Object.values(rawMeta); const cuMeta = metaArray.find(m => m && (m.group === 'checkuser' || m.group === 'check user')); if (cuMeta && cuMeta.expiry && cuMeta.expiry !== 'infinity') capturedExpiry = new Date(cuMeta.expiry); } } // Identify if CheckUser was added or removed in this event let cuAdded = (hasCU && !hadCU), cuRemoved = (hadCU && !hasCU); if (cuAdded || cuRemoved) { const eventDate = new Date(e.timestamp), exactTime = e.timestamp.replace('T', ' ').replace('Z', ''); const isInPeriod = (eventDate >= auditStart && eventDate <= auditEnd); if (isInPeriod) hasLocalRightsInPeriod = true; // Process events relevant to the audit timeframe or pairing logic if (isInPeriod || (eventDate > auditEnd) || (pendingRemoved && cuAdded)) { let expiryDate = capturedExpiry; capturedExpiry = null; // Check for metadata again to ensure current expiry is captured const rawMeta = p.newmetadata || p.newMetadata; if (rawMeta) { const metaArray = Array.isArray(rawMeta) ? rawMeta : Object.values(rawMeta); const cuMeta = metaArray.find(m => m && (m.group === 'checkuser' || m.group === 'check user')); if (cuMeta && cuMeta.expiry && cuMeta.expiry !== 'infinity') expiryDate = new Date(cuMeta.expiry); } const eventBySelf = (actor === user || !actor); if (cuAdded) { const removalInPeriod = pendingRemoved && (pendingRemoved.date >= auditStart && pendingRemoved.date <= auditEnd); const expiryInPeriod = expiryDate && (expiryDate >= auditStart && expiryDate <= auditEnd); // Pair adding event with its removal or expiry to calculate duration if ((isInPeriod || removalInPeriod || expiryInPeriod) && (pendingRemoved || expiryDate)) { const checkDate = pendingRemoved ? pendingRemoved.date : expiryDate; const diffMs = Math.abs(checkDate - eventDate); const totalSecs = Math.floor(diffMs / 1000); // Intelligent rounding to handle short durations and edge cases let roundedMins = Math.round(totalSecs / 60); if (roundedMins === 0 && totalSecs > 0) roundedMins = 1; // Convert total minutes into days, hours, and remaining minutes let days = Math.floor(roundedMins / 1440); let hours = Math.floor((roundedMins % 1440) / 60); let mins = roundedMins % 60; // Build a human-readable duration string let dPart = days > 0 ? days + 'd ' : ''; let hPart = hours > 0 ? hours + 'h ' : ''; let mPart = (mins > 0 || (days === 0 && hours === 0)) ? mins + 'm' : ''; let durStr = totalSecs < 60 ? totalSecs + "s" : (dPart + hPart + mPart).trim(); // Capture the log comment for the ADDED event let reason = e.comment ? ` <small>''(${e.comment})''</small>` : ""; // Determine if this session was a Steward self-assignment if (pendingRemoved) { if (eventBySelf && pendingRemoved.isSelf) isSelfAssign = true; // Retrieve the removal comment if available let remReason = pendingRemoved.comment ? ` <small>''(${pendingRemoved.comment})''</small>` : ""; // Calculate discrepancy between manual removal and scheduled expiry let note = ""; if (expiryDate) { // Calculate planned duration in seconds and format it const pDiff = Math.abs(expiryDate - eventDate) / 1000; let rP = Math.round(pDiff / 60); let rd = Math.floor(rP / 1440), rh = Math.floor((rP % 1440) / 60), rm = rP % 60; let pD = pDiff < 60 ? Math.round(pDiff) + "s" : `${rd > 0 ? rd + 'd ' : ''}${rh > 0 ? rh + 'h ' : ''}${(rm > 0 || (rd === 0 && rh === 0)) ? rm + 'm' : ''}`.trim(); // Check if rights were removed manually earlier or later than planned let timeDiff = pendingRemoved.date - expiryDate; if (timeDiff < -60000) { note = ` - manual removal before scheduled expiry (set to ${pD})`; } else if (timeDiff > 600000) { note = ` - automatic removal not found (set to ${pD})`; } } // Finalize the paired log entry for manual removals logEntries.unshift(`* ADDED: ${exactTime} by ${actor}${reason} | REMOVED: ${pendingRemoved.time} by ${pendingRemoved.user}${remReason} (Duration: ${durStr}${note})`); } else if (expiryDate) { // Handle automatic expiration scenarios if (eventBySelf) isSelfAssign = true; logEntries.unshift(`* ADDED: ${exactTime} by ${actor}${reason} | EXPIRED: ${expiryDate.toISOString().replace('T', ' ').substring(0, 19)} <small>''(Automatic)''</small> (Duration: ${durStr})`); } // Reset pending state and update audit metrics pendingRemoved = null; if (totalSecs / 60 > maxDurationMins) { maxDurationMins = totalSecs / 60; longestTimeStr = durStr.trim(); } assignCount++; lastPairedDate = eventDate; } else if (isInPeriod && !pendingRemoved && !expiryDate) { // Handle cases where rights are still active or removal log is missing if (!(lastPairedDate && Math.abs(lastPairedDate - eventDate) < 86400000)) { logEntries.unshift(`* ADDED: ${exactTime} by ${actor} | REMOVED: (Active/Not removed)`); lastPairedDate = eventDate; } pendingRemoved = null; } } else if (cuRemoved) { // Record standalone removal events for future pairing if (pendingRemoved && pendingRemoved.date >= auditStart && pendingRemoved.date <= auditEnd) { logEntries.unshift(`* REMOVED: ${pendingRemoved.time} by ${pendingRemoved.user}`); } // Store removal data to be paired with the next ADDED event pendingRemoved = { time: exactTime, date: eventDate, user: actor, isSelf: eventBySelf, comment: e.comment }; } } } } // Verify if the user held rights at the start of the period by checking prior logs if (!hasLocalRightsInPeriod && events.length > 0) { const firstBefore = events.find(ev => new Date(ev.timestamp) < auditStart); if (firstBefore) { const groupsBefore = extractGroups(firstBefore.params.newgroups || firstBefore.params.add || firstBefore.params[1] || firstBefore.params["1"]); if (groupsBefore.includes('checkuser')) hasLocalRightsInPeriod = true; } // If still not found, check the oldest available log entry for the initial state if (!hasLocalRightsInPeriod) { const chronologicallyFirst = events[events.length - 1]; const cp = chronologicallyFirst.params || {}; const oldGroups = extractGroups(cp.oldgroups || cp.oldGroups || cp.remove || cp[0] || cp["0"]); if (oldGroups.includes('checkuser')) hasLocalRightsInPeriod = true; } } // Finalize the log text assembly if (pendingRemoved && pendingRemoved.date >= auditStart && pendingRemoved.date <= auditEnd) { logEntries.unshift(`* REMOVED: ${pendingRemoved.time} by ${pendingRemoved.user}`); } if (logEntries.length) logText = '\n' + logEntries.join('\n'); // Logic for determining user roles and categories let roles = []; const isStewardInPeriod = isGloballySteward || historyRes.wasSteward; const isTemporaryMission = (longestTimeStr && isSelfAssign && isStewardInPeriod); // Process Global Staff and Ombudsman roles if (isGloballyStaff) roles.push("Current Staff"); else if (historyRes.wasStaff) roles.push("Former Staff"); if (isGloballyOmbuds) roles.push("Current Ombudsman"); else if (historyRes.wasOmbuds) roles.push("Former Ombudsman"); // Steward logic: Distinguish between temporary actions and permanent roles if (isTemporaryMission) { const countLabel = assignCount > 1 ? `${assignCount}x, longest ` : ""; roles.push(`Steward action (Self-assign: ${countLabel}${longestTimeStr})`); } else { if (isGloballySteward) roles.push("Current Steward"); else if (historyRes.wasSteward) roles.push("Former Steward"); } // Process Local CheckUser roles if (isCurrentLocal) roles.push("Current Local CheckUser"); if (hasLocalRightsInPeriod && !isCurrentLocal && !isTemporaryMission) { roles.push("Former Local CheckUser"); } // Consolidate unique roles into a formatted label let uniqueRoles = [...new Set(roles)]; let roleLabel = uniqueRoles.length > 0 ? uniqueRoles.join(' & ') : "Unknown role"; // Return final metadata object for project reporting return { role: roleLabel, log: logText, hasLocalRightsInPeriod: hasLocalRightsInPeriod, isStewardAction: isTemporaryMission, selfAssignCount: assignCount, maxDurationMins: maxDurationMins }; } // Main execution loop with Cross-Tab concurrency protection async function runAudit(yf, mf, yt, mt) { $('#status-msg').text('Waiting for other tabs to finish...').css("color", "orange"); $('#start').prop('disabled', true); // Utilize Web Locks API to prevent concurrent API requests from multiple tabs await navigator.locks.request('global_cu_audit', async () => { isRunning = true; // Clear cache and result containers for a fresh scan userCache = {}; historyCache = {}; results = {}; emptyWikis = []; failedWikis = []; scannedWikis = []; $('#status-msg').text('Lock acquired. Initializing...').css("color", "#0056b3"); $('#stop').prop('disabled', false); // Parse wiki filter input from the UI const filterText = $('#wiki-filter').val().trim().toLowerCase(); const filterList = filterText ? filterText.split(',').map(s => s.trim()).filter(s => s !== "") : []; // Determine the set of wikis to process based on user filters const allAvailableWikis = Object.keys(globalWikiMap); let wikisToScan = allAvailableWikis; // Apply inclusion or exclusion logic based on current UI selection if (currentFilterMode === 'include') { wikisToScan = allAvailableWikis.filter(w => filterList.includes(w)); } else if (currentFilterMode === 'exclude') { wikisToScan = allAvailableWikis.filter(w => !filterList.includes(w)); } // Validate that there are wikis to scan before proceeding if (wikisToScan.length === 0) { alert("No wikis selected for audit!"); isRunning = false; $('#start').prop('disabled', false); return; } // Initialize the progress bar UI $('#bar').attr('max', wikisToScan.length).val(0); // Define the standardized ISO timestamps for the MediaWiki API const START = `${yf}-${String(mf).padStart(2, '0')}-01T00:00:00Z`; const END = `${yt}-${String(mt).padStart(2, '0')}-${new Date(Date.UTC(yt, mt, 0)).getUTCDate().toString().padStart(2, '0')}T23:59:59Z`; // Generate the chronological month columns for the report table const monthCols = []; let currY = parseInt(yf), currM = parseInt(mf), endY = parseInt(yt), endM = parseInt(mt); while (currY < endY || (currY === endY && currM <= endM)) { monthCols.push({ key: `${currY}-${String(currM).padStart(2, '0')}`, label: `${["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][currM - 1]} ${currY}` }); currM++; if (currM > 12) { currM = 1; currY++; } } // Iterate through each wiki project to collect CheckUser activity for (let i = 0; i < wikisToScan.length; i++) { if (!isRunning) break; // Allow for manual stop const db = wikisToScan[i]; scannedWikis.push(db); $('#status-msg').text(`Scanning ${db} (${i + 1}/${wikisToScan.length})...`); let successLocal = false, continueToken = null; // Phase 1: Retrieve CheckUser logs and aggregate monthly stats while (!successLocal && isRunning) { try { const api = new mw.ForeignApi(globalWikiMap[db] + '/w/api.php'); let params = { action: 'query', list: 'checkuserlog', culfrom: START, culto: END, culdir: 'newer', cullimit: 'max', formatversion: 2 }; if (continueToken) Object.assign(params, continueToken); let res = await robustCall(api, params); const entries = res.query?.checkuserlog?.entries || []; if (entries.length) { if (!results[db]) results[db] = {}; entries.forEach(e => { const user = e.checkuser; if (!results[db][user]) results[db][user] = { total: 0, months: {} }; const mKey = e.timestamp.slice(0, 7); results[db][user].total++; results[db][user].months[mKey] = (results[db][user].months[mKey] || 0) + 1; }); } // Handle API pagination if (res.continue && isRunning) { continueToken = res.continue; } else { successLocal = true; } } catch (err) { failedWikis.push(db); successLocal = true; } } // Phase 2: Capture current CheckUsers (to include users with 0 actions) if (isRunning && !failedWikis.includes(db)) { try { const auApi = new mw.ForeignApi(globalWikiMap[db] + '/w/api.php'); const auRes = await robustCall(auApi, { action: 'query', list: 'allusers', augroup: 'checkuser', aulimit: 'max', formatversion: 2 }); const currentCUs = auRes.query.allusers || []; if (currentCUs.length > 0) { if (!results[db]) results[db] = {}; currentCUs.forEach(u => { if (!results[db][u.name]) results[db][u.name] = { total: 0, months: {} }; }); } } catch (e) { /* Fallback for local API failures */ } } // Record wikis with no CheckUser presence found if (!results[db] && !failedWikis.includes(db)) { emptyWikis.push(db); } // Update UI progress $('#bar').val(i + 1); await sleep(DELAY_MS); } // Finalize results and compile the audit report $('#status-msg').text(`Generating report...`); // Calculate global activity totals for each user across all wikis let userGlobalTotals = {}; Object.keys(results).forEach(db => { Object.keys(results[db]).forEach(user => { userGlobalTotals[user] = (userGlobalTotals[user] || 0) + results[db][user].total; }); }); // Setup report timestamps const reportDate = new Date().toISOString().split('T')[0]; const timestamp = new Date().toISOString().replace('T', ' ').slice(0, 19) + ' (UTC)'; const viewMode = $('input[name="cu-view-mode"]:checked').val(); const timeCols = []; if (viewMode === 'months') { monthCols.forEach(m => timeCols.push({ id: m.key, label: m.label })); } else if (viewMode !== 'total') { monthCols.forEach(m => { let label; if (viewMode === 'quarters') { const q = Math.floor((parseInt(m.key.split('-')[1]) - 1) / 3) + 1; label = `${m.key.split('-')[0]}-Q${q}`; } else { label = m.key.split('-')[0]; // Years } let col = timeCols.find(c => c.label === label); if (!col) { col = { label: label, months: [] }; timeCols.push(col); } col.months.push(m.key); }); } // Initialize Wikitext output with header information let wikitext = `== Global CheckUser Stats (${mf}/${yf} - ${mt}/${yt}) ==\n`; wikitext += `''Report generated on: ${timestamp}<br />\nGenerated with [[testwiki:User:MrJaroslavik/GlobalCheckUserStats.js|GlobalCheckUserStats.js]]''\n`; // Initialize CSV output with headers let csvData = "Project,User,BaseRole,SelfAssignCount,MaxDuration_mins,TotalActions\n"; // Document applied filters in the wikitext report let filterSummary = []; // Only add wiki filter if the list is not empty if (filterList.length > 0) { if (currentFilterMode === 'include') { filterSummary.push(`Only these wikis: ${filterList.join(', ')}`); } else if (currentFilterMode === 'exclude') { filterSummary.push(`All except wikis: ${filterList.join(', ')}`); } } if (currentUserFilter === 'local') filterSummary.push(`Only users: Local CheckUsers`); else if (currentUserFilter === 'steward') filterSummary.push(`Only users: Steward actions`); if (filterSummary.length > 0) { wikitext += `<br />\n''Used filters: ${filterSummary.join(' | ')}''\n`; } wikitext += `\n`; // Start building the main results table let rightsLogText = `\n== Rights Log (In Period) ==\n`; const per1kExpl = "Calculated as: (Total Actions in selected period / Current Active Users) * 1,000"; wikitext += `{| class="wikitable sortable" style="font-size:90%; text-align:right;"\n! Wiki / User !! Category !! '''Total''' !! per 1k users<ref>${per1kExpl}</ref> ${timeCols.map(c => `!! ${c.label}`).join(' ')}\n`; // Process each database in alphabetical order const sortedDBs = Object.keys(results).sort(); for (const db of sortedDBs) { const metrics = await fetchWikiMetrics(db); const activeFormatted = metrics.active > 0 ? metrics.active.toLocaleString('en-US') : 'Unknown'; const interwiki = getInterwikiPrefix(db); // Build wiki-specific header row let headerRow = `|-\n! colspan="${4 + timeCols.length}" style="background:#eaecf0; text-align:center;" | [[${interwiki}:|${db}]] <small style="font-weight:normal; color:#54595d;">(Active Users as of ${reportDate}: ${activeFormatted})</small> — [[${interwiki}:Special:CheckUserLog|CheckUserLog]] · [[${interwiki}:Special:ListUsers/checkuser|ListUsers/checkuser]]\n`; let projectRows = [], wikiTotal = 0, wikiMonthlyStats = {}; monthCols.forEach(col => wikiMonthlyStats[col.key] = 0); let projectUsers = Object.keys(results[db] || {}).sort(); for (const user of projectUsers) { const userData = results[db][user]; const meta = await fetchUserData(user, db, START, END); // Filter logic: Only show users active in period or holding rights if (userData.total === 0 && !meta.hasLocalRightsInPeriod) continue; const isStewardAction = meta.isStewardAction; const isLocalCU = meta.role.includes("Local CheckUser"); // Apply UI role filters if (currentUserFilter === 'local' && !isLocalCU) continue; if (currentUserFilter === 'steward' && !isStewardAction) continue; // Update totals wikiTotal += userData.total; monthCols.forEach(col => wikiMonthlyStats[col.key] += (userData.months[col.key] || 0)); // Calculate per 1k active users metric let per1k = metrics.active > 0 ? ((userData.total / metrics.active) * 1000).toFixed(1) : "0.0"; // Construct wikitext row with dynamic timeline let row = `|-\n| style="text-align:left;" | ${user}@${db} || <small>${meta.role}</small> || '''${userData.total}''' || ${per1k}`; timeCols.forEach(col => { let val = 0; if (viewMode === 'months') val = userData.months[col.id] || 0; else col.months.forEach(m => val += (userData.months[m] || 0)); row += ` || ${val}`; }); projectRows.push({ html: row + "\n", log: meta.log ? `'''${user}@${db}''':${meta.log}\n\n` : "" }); // Construct CSV row let baseRole = meta.role.split(' (')[0]; let sAssignCount = meta.isStewardAction ? meta.selfAssignCount : ""; let sMaxMins = meta.isStewardAction ? Math.round(meta.maxDurationMins) : ""; csvData += `${db},${user},"${baseRole}",${sAssignCount},${sMaxMins},${userData.total}\n`; } // Skip project if no users pass the filters if (projectRows.length === 0) { if (!emptyWikis.includes(db)) emptyWikis.push(db); continue; } // Construct project summary row let wikiPer1k = metrics.active > 0 ? ((wikiTotal / metrics.active) * 1000).toFixed(1) : "0.0"; let totalRow = `|- style="background:#f8f9fa; font-weight:bold;"\n| style="text-align:left;" | TOTAL ${db} || — || ${wikiTotal} || ${wikiPer1k}`; timeCols.forEach(col => { let val = 0; if (viewMode === 'months') val = wikiMonthlyStats[col.id] || 0; else col.months.forEach(m => val += (wikiMonthlyStats[m] || 0)); totalRow += ` || ${val}`; }); wikitext += headerRow + totalRow + "\n"; projectRows.forEach(r => { wikitext += r.html; if (r.log) rightsLogText += r.log; }); } // Close table and append metadata sections wikitext += `|}\n\n== Projects with 0 actions ==\n<div style="font-size:85%; color:#54595d;">${emptyWikis.sort().join(', ')}</div>\n`; if (failedWikis.length > 0) { wikitext += `\n== API Errors / Skipped Projects ==\n<div style="font-size:85%; color:#d33;">${failedWikis.sort().join(', ')}</div>\n`; } wikitext += rightsLogText + `\n\n<references />\n`; // Output results to UI and finalize state $('#out').val(wikitext); $('#csv-out').val(csvData); $('#output-containers').show(); $('#status-msg').text(`Done.`).css("color", "green"); $('#start').prop('disabled', false); $('#stop').prop('disabled', true); }); } // Initialize the UI and finish script setup setupUI(); }); })(); n2h38n1aml4xhav4kx4feldovh8yt07 User:MrJaroslavik/GlobalCheckUserList.js 2 174968 739103 2026-04-22T18:19:32Z MrJaroslavik 44012 Creating GlobalCheckUserList.js 739103 javascript text/javascript // GlobalCheckUserList.js // ------------------------------------------------------- // Features: // - Global Audit: Scans current CheckUsers across 800+ projects. // - Full Pagination: Bypasses API limits for user lists and history logs. // - Deep Rights Discovery: Checks Meta (steward) and Local (bureaucrat) logs for the grant date. // - Single Table: Unified wikitext output in one sortable table. // - Navigation: Nicknames link to local logs; headers link to project, list, and CU log. // - Stable: Handles 429 rate limits and uses Cross-Tab locking. // - Compatibility: No optional chaining (?.) for MediaWiki editor support. // - Created with help of Gemini 3. // ------------------------------------------------------- (function () { 'use strict'; // Run only on Special:BlankPage/GlobalCheckUserList const isBlankPage = mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage'; const isOurScript = mw.config.get('wgTitle').includes('GlobalCheckUserList'); if (!isBlankPage || !isOurScript) return; let globalWikiMap = {}; // List of wikis where CheckUser extension is disabled - https://noc.wikimedia.org/conf/highlight.php?file=dblists/checkuser-disabled.dblist const disabledCUWikis = [ 'aawikibooks', 'abwiktionary', 'advisorywiki', 'akwiktionary', 'angwikiquote', 'angwikisource', 'astwikibooks', 'astwikiquote', 'aswikibooks', 'aswiktionary', 'avwiktionary', 'aywikibooks', 'bhwiktionary', 'biwikibooks', 'biwiktionary', 'bmwikibooks', 'bmwikiquote', 'bmwiktionary', 'bowiktionary', 'chwikibooks', 'chwiktionary', 'cnwikimedia', 'crwikiquote', 'crwiktionary', 'dzwiktionary', 'gawikibooks', 'gnwikibooks', 'gotwikibooks', 'guwikibooks', 'htwikisource', 'huwikinews', 'hzwiki', 'iewikibooks', 'iiwiki', 'internalwiki', 'kjwiki', 'kkwikiquote', 'knwikibooks', 'krwiki', 'krwikiquote', 'kswikibooks', 'kswikiquote', 'kwwikiquote', 'lbwikibooks', 'lbwikiquote', 'lnwikibooks', 'lvwikibooks', 'mhwiktionary', 'mnwikibooks', 'muswiki', 'nahwikibooks', 'nawikibooks', 'nawikiquote', 'ndswikibooks', 'ndswikiquote', 'piwiktionary', 'pswikibooks', 'quwikibooks', 'quwikiquote', 'rmwikibooks', 'rmwiktionary', 'rnwiktionary', 'scwiktionary', 'searchcomwiki', 'snwiktionary', 'spcomwiki', 'swwikibooks', 'thwikinews', 'tkwikibooks', 'tkwikiquote', 'towiktionary', 'transitionteamwiki', 'trwikinews', 'ttwikiquote', 'twwiktionary', 'ugwikibooks', 'ugwikiquote', 'vowikibooks', 'vowikiquote', 'wawikibooks', 'wikimania2005wiki', 'wikimania2006wiki', 'wikimania2007wiki', 'wikimania2009wiki', 'wikimania2015wiki', 'wowikiquote', 'xhwikibooks', 'xhwiktionary', 'yowikibooks', 'yowiktionary', 'zawikibooks', 'zawikiquote', 'zawiktionary', 'zh_min_nanwikibooks', 'zuwikibooks' ]; // Targeted list of projects known to have active local CheckUsers - https://meta.wikimedia.org/wiki/CheckUser_policy/Users_with_CheckUser_access const localCUWikis = [ 'arwiki', 'bnwiki', 'cawiki', 'cswiki', 'dawiki', 'nlwiki', 'enwikibooks', 'enwiki', 'enwikivoyage', 'enwiktionary', 'fiwiki', 'frwiki', 'dewiki', 'hewiki', 'huwiki', 'idwiki', 'itwiki', 'jawiki', 'kowiki', 'fawiki', 'plwiki', 'ptwiki', 'ruwiki', 'srwiki', 'simplewiki', 'slwiki', 'eswiki', 'svwiki', 'thwiki', 'trwiki', 'ukwiki', 'viwiki', 'commonswiki', 'specieswiki', 'metawiki', 'wikidatawiki' ]; // Fetch all wikis and filter out the ones we cannot or should not scan function loadGlobalWikiMap() { const api = new mw.Api(); return api.get({ action: 'sitematrix', format: 'json', smtype: 'language|special', smlangprop: 'site', smsiteprop: 'dbname|url', formatversion: 2, origin: '*' }).then(function(data) { const matrix = data.sitematrix; const wikiMap = {}; Object.keys(matrix).forEach(key => { const entry = matrix[key]; if (entry.site && Array.isArray(entry.site)) { entry.site.forEach(site => { if (site.private || site.fishbowl || disabledCUWikis.indexOf(site.dbname) !== -1) return; wikiMap[site.dbname] = site.url; }); } }); if (matrix.specials && Array.isArray(matrix.specials)) { matrix.specials.forEach(special => { if (special.private || special.fishbowl || disabledCUWikis.indexOf(special.dbname) !== -1) return; wikiMap[special.dbname] = special.url; }); } return wikiMap; }); } const DELAY_MS = 500; const sleep = ms => new Promise(r => setTimeout(r, ms)); // Convert database names to short codes for linking function getInterwikiPrefix(db) { // Map special projects and specific language codes const specialMap = { 'commonswiki': 'c', 'metawiki': 'm', 'wikidatawiki': 'd', 'wikifunctionswiki': 'f', 'mediawikiwiki': 'mw', 'specieswiki': 'species', 'sourceswiki': 'oldwikisource', 'foundationwiki': 'foundation', 'incubatorwiki': 'incubator', 'outreachwiki': 'outreach', 'betawikiversity': 'betawikiversity', 'be_x_oldwiki': 'be-tarask', 'zh_classicalwiki': 'lzh', 'zh_min_nanwiki': 'nan', 'zh_yuewiki': 'yue' }; if (specialMap[db]) return specialMap[db]; const name = db.replace(/_/g, '-'); // Map project types like Wikibooks or Wiktionary to short prefixes if (name.endsWith('wikisource')) return 's:' + name.slice(0, -10); if (name.endsWith('wikiversity')) return 'v:' + name.slice(0, -11); if (name.endsWith('wiktionary')) return 'wikt:' + name.slice(0, -10); if (name.endsWith('wikivoyage')) return 'voy:' + name.slice(0, -10); if (name.endsWith('wikibooks')) return 'b:' + name.slice(0, -9); if (name.endsWith('wikiquote')) return 'q:' + name.slice(0, -9); if (name.endsWith('wikinews')) return 'n:' + name.slice(0, -8); // Format links for local Wikimedia chapters if (name.endsWith('wikimedia')) { return 'wm' + name.slice(0, -9); } // Create a Wikipedia link for standard project names if (name.endsWith('wiki')) { return 'w:' + name.slice(0, -4); } return 'w:' + name; } // Turn different API formats into a clean list of groups const extractGroups = (data) => { if (!data) return []; var res = []; // Handle data whether it is already a list, an object, or just text if (Array.isArray(data)) { res = data; } else if (typeof data === 'object') { res = Object.values(data); } else if (typeof data === 'string') { res = data.split(',').map(function(s) { return s.trim(); }); } // Normalize names so "Check User" becomes "checkuser" for easy comparison return res.map(function(g) { if (typeof g !== 'string') return g; return g.replace(/\s+/g, '').toLowerCase(); }); }; async function robustCall(api, params) { let retries = 0; const maxRetries = 3; while (retries < maxRetries) { try { // Try to get data from the server return await api.get(params); } catch (err) { // If we get a "too many requests" error if (err?.status === 429) { retries++; // See how long the server wants us to wait const waitTime = parseInt(err.xhr?.getResponseHeader('Retry-After')) || (30 * retries); // Update the UI so the user knows we are waiting $('#status-msg').html( `<span style="color:orange; font-weight:bold;">Server is busy! Waiting ${waitTime}s...</span>` ); await sleep(waitTime * 1000); } else { // Stop if it is a different kind of error throw err; } } } // Give up after 3 tries throw new Error("Failed to reach API after multiple attempts"); } // Ensure all required MediaWiki modules are ready before starting mw.loader.using(['mediawiki.api', 'mediawiki.ForeignApi']).then(async function () { // Let the user know the script is preparing the wiki database $('#mw-content-text').html('<strong>GlobalCheckUserList.js: Loading wiki map...</strong>'); // Build the database map (dbname -> URL) for all projects globalWikiMap = await loadGlobalWikiMap(); // Establish a connection to Meta-Wiki for global rights lookups const metaApi = new mw.ForeignApi('https://meta.wikimedia.org/w/api.php'); // State variables to control the script execution and filtering let isRunning = false; let currentFilterMode = 'all'; // Build and display the script interface function setupUI() { $('#firstHeading').text('GlobalCheckUserList'); // Main container for the tool interface $('#mw-content-text').empty().append(` <div style="border:1px solid #a2a9b1; padding:15px; background:#f8f9fa;"> <p>Audits current CheckUsers across Wikimedia projects. Reports are grouped into one single table.</p> <div style="margin-bottom:10px; display:flex; align-items:center; gap:20px; font-size:13px;"> <strong>Wiki Filter:</strong> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-all" checked> All</label> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-localcu"> Local CU Wikis</label> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-only"> Only these</label> <span id="wiki-help-trigger" style="cursor:help; background:#36c; color:#fff; border-radius:50%; width:18px; height:18px; display:inline-block; text-align:center; font-weight:bold;" title="Show available DB names">?</span> </div> <div id="filter-input-container" style="display:none; margin-bottom:15px;"> <input id="wiki-filter" type="text" style="width:100%;" placeholder="dbname1, dbname2..."> </div> <div id="wiki-list-help" style="display:none; margin-bottom:10px; padding:10px; background:#fff; border:1px solid #a2a9b1; font-size:11px; max-height:120px; overflow-y:auto; font-family:monospace;"> <strong>Available database names:</strong><br>${Object.keys(globalWikiMap).sort().join(', ')} </div> <div style="margin-top:20px;"> <button id="start" class="mw-ui-button mw-ui-progressive">Run Audit</button> <button id="stop" class="mw-ui-button mw-ui-destructive" disabled>Stop</button> </div> <div id="status-msg" style="margin-top:10px; font-weight:bold; color:#0056b3;">Ready.</div> <div style="margin-top:5px;"> <progress id="bar" value="0" max="${Object.keys(globalWikiMap).length}" style="width:100%"></progress> </div> <div id="output-container" style="display:none; margin-top:15px;"> <strong>Wikitext Report:</strong> <textarea id="out" style="width:100%; height:450px; font-family:monospace; font-size:11px; padding:5px; border:1px solid #c8ccd1;"></textarea> </div> </div> `); // Manage filter visibility based on user selection $('#btn-all').click(function() { currentFilterMode = 'all'; $('#filter-input-container').hide(); }); $('#btn-localcu').click(function() { currentFilterMode = 'localcu'; $('#filter-input-container').hide(); }); $('#btn-only').click(function() { currentFilterMode = 'include'; $('#filter-input-container').show().focus(); }); // Interaction logic for help and script control $('#wiki-help-trigger').click(function() { $('#wiki-list-help').toggle(); }); $('#start').click(function() { runAudit(); }); $('#stop').click(function() { isRunning = false; }); } // Recursive helper to find all previous names of a user via Meta's global rename log async function getPreviousNames(currentName) { let names = []; try { const res = await robustCall(metaApi, { action: 'query', list: 'logevents', letype: 'gblrename', letitle: 'User:' + currentName, // On Meta, 'title' in rename log is the NEW name formatversion: 2 }); const logs = (res.query && res.query.logevents) || []; for (let ev of logs) { if (ev.params && ev.params.oldname) { names.push(ev.params.oldname); // Deep search: find if the old name was also a result of a previous rename const olderNames = await getPreviousNames(ev.params.oldname); names = names.concat(olderNames); } } } catch (e) { console.error("Rename lookup failed for " + currentName, e); } return [...new Set(names)]; // Return unique names only } async function findGrantDate(user, db, localApi) { // Helper for the actual log searching logic async function searchLog(targetUser) { // Phase 1: Meta (steward) let mPars = { action: 'query', list: 'logevents', letype: 'rights', letitle: 'User:' + targetUser + '@' + db, ledir: 'newer', lelimit: 'max', formatversion: 2 }; let resM = await robustCall(metaApi, mPars); let logsM = (resM.query && resM.query.logevents) || []; for (let ev of logsM) { let p = ev.params || {}; let nG = extractGroups(p.newgroups || p.add || p[1] || p["1"]); let oG = extractGroups(p.oldgroups || p.remove || p[0] || p["0"]); if (nG.indexOf('checkuser') !== -1 && oG.indexOf('checkuser') === -1) return ev.timestamp.substring(0, 10); } // Phase 2: Local (bureaucrat) let lPars = { action: 'query', list: 'logevents', letype: 'rights', letitle: 'User:' + targetUser, ledir: 'newer', lelimit: 'max', formatversion: 2 }; let resL = await robustCall(localApi, lPars); let logsL = (resL.query && resL.query.logevents) || []; for (let ev of logsL) { let p = ev.params || {}; let nG = extractGroups(p.newgroups || p.add || p[1] || p["1"]); let oG = extractGroups(p.oldgroups || p.remove || p[0] || p["0"]); if (nG.indexOf('checkuser') !== -1 && oG.indexOf('checkuser') === -1) return ev.timestamp.substring(0, 10); } return null; } // 1. Try current name let date = await searchLog(user); if (date) return date; // 2. If not found, look for previous names (Global Rename Progress) const oldNames = await getPreviousNames(user); for (let oldName of oldNames) { if (!isRunning) break; date = await searchLog(oldName); if (date) return date + " (as " + oldName + ")"; } return "Unknown"; } // Main execution function that iterates through wikis and collects CU data async function runAudit() { isRunning = true; // 1. MUST BE DEFINED HERE to be available for the table header reference below const adminTypes = [ 'block', 'delete', 'protect', 'rights', 'merge', 'abusefilter', 'contentmodel', 'import', 'managetags', 'massmessage', 'checkuser-temporary-account', 'ipinfo', 'pagelang', 'renameuser', 'stable', 'gblblock', 'abusefilter-protected-vars' ]; const cuInPublicTypes = ['abusefilterprivatedetails']; $('#start').prop('disabled', true); $('#stop').prop('disabled', false); $('#out').hide(); $('#status-msg').text('Waiting for queue lock...').css("color", "orange"); // Use a browser lock to prevent multiple instances from running at once await navigator.locks.request('global_cu_list_lock', async () => { const ts = new Date().toISOString().replace('T', ' ').substring(0, 16) + ' (UTC)'; // Initialize the wikitext report with header information let wt = "== Global CheckUser List ==\n"; wt += "''Report generated on: " + ts + "<br />\n"; wt += "Generated with [[testwiki:User:MrJaroslavik/GlobalCheckUserList.js|GlobalCheckUserList.js]]''\n"; // Parse user filters before starting the loop const filterText = $('#wiki-filter').val().trim().toLowerCase(); const filterList = filterText ? filterText.split(',').map(function(s) { return s.trim(); }).filter(function(s) { return s !== ""; }) : []; // Add filter metadata to the report header if (currentFilterMode === 'localcu') { wt += "<br />''Filter applied: Wikis with local CheckUser communities''\n"; } else if (currentFilterMode === 'include' && filterList.length > 0) { wt += "<br />''Filter applied: Only these wikis (" + filterList.join(', ') + ")''\n"; } wt += "\n"; // Build the table header with sortable columns and clean technical references wt += '{| class="wikitable sortable" style="font-size:90%; width:100%;"\n' + '! User !! CU Since !! Duration !! Last CU Action<ref>Logs: checkuserlog, checkuser-temporary-account, abusefilterprivatedetails</ref> !! ' + 'Last Admin Action<ref>Logs: ' + adminTypes.join(', ') + '</ref> !! ' + 'Last OS Action<ref>Logs: suppress</ref> !! ' + 'Last Logged Action<ref>Logs: all public logged actions</ref> !! Last Edit\n'; const allWikis = Object.keys(globalWikiMap); let wikisToScan; // Determine which wikis to audit based on the chosen filter mode if (currentFilterMode === 'include' && filterList.length > 0) { wikisToScan = allWikis.filter(function(w) { return filterList.indexOf(w) !== -1; }); } else if (currentFilterMode === 'localcu') { wikisToScan = allWikis.filter(function(w) { return localCUWikis.indexOf(w) !== -1; }); } else { wikisToScan = allWikis; } $('#bar').attr('max', wikisToScan.length).val(0); // Primary loop: audit each selected wiki one by one for (let i = 0; i < wikisToScan.length; i++) { if (!isRunning) break; const db = wikisToScan[i]; $('#status-msg').text('Auditing ' + db + ' (' + (i + 1) + '/' + wikisToScan.length + ')...').css("color", "#0056b3"); try { const wikiUrl = globalWikiMap[db]; const localApi = new mw.ForeignApi(wikiUrl + '/w/api.php'); // Fetch all users with 'checkuser' rights on this specific wiki let users = [], auDone = false, auCont = null; while (!auDone && isRunning) { let auPars = { action: 'query', list: 'allusers', augroup: 'checkuser', auprop: 'groups', aulimit: 'max', formatversion: 2 }; if (auCont) Object.assign(auPars, auCont); let res = await robustCall(localApi, auPars); users = users.concat(res.query.allusers || []); if (res.continue) auCont = res.continue; else auDone = true; } // Only add the wiki section to the report if checkusers were found if (users.length > 0) { const iw = getInterwikiPrefix(db); wt += '|-\n! colspan="8" style="background:#eaecf0; text-align:center;" | ' + '[[' + iw + ':|' + db + ']] — [[' + iw + ':Special:ListUsers/checkuser|(list)]] — [[' + iw + ':Special:CheckUserLog|(log)]]\n'; // Loop through each found CheckUser on the current wiki for (const u of users) { const username = u.name; // Determine when the user first received their CU rights const sinceDate = await findGrantDate(username, db, localApi); let days = "???"; if (sinceDate !== "Unknown") { // Calculate how many days they have held the rights days = Math.floor((new Date() - new Date(sinceDate)) / 86400000) + "d"; } // Fetch internal CU log (private) const cuLog = await robustCall(localApi, { action: 'query', list: 'checkuserlog', culuser: username, cullimit: 1, formatversion: 2 }); let lastCU = (cuLog.query && cuLog.query.checkuserlog && cuLog.query.checkuserlog.entries && cuLog.query.checkuserlog.entries[0]) ? cuLog.query.checkuserlog.entries[0].timestamp.substring(0, 10) : "Never"; // Fetch all public logs for this user const allUserLogsReq = await robustCall(localApi, { action: 'query', list: 'logevents', leuser: username, lelimit: 'max', formatversion: 2 }); const allUserLogs = (allUserLogsReq.query && allUserLogsReq.query.logevents) || []; // CROSS-CHECK: Look for CU actions that leak into public logs (like abusefilterprivatedetails) const pubCUEvt = allUserLogs.find(function(ev) { return cuInPublicTypes.indexOf(ev.type) !== -1; }); if (pubCUEvt) { const pubCUTs = pubCUEvt.timestamp.substring(0, 10); if (lastCU === "Never" || pubCUTs > lastCU) lastCU = pubCUTs; } // Identify the last administrative action from our comprehensive list const admEvent = allUserLogs.find(function(ev) { return adminTypes.indexOf(ev.type) !== -1; }); const lastAdm = admEvent ? admEvent.timestamp.substring(0, 10) : "Never"; // Get the timestamp of the very last logged action of any kind const lastGen = allUserLogs.length > 0 ? allUserLogs[0].timestamp.substring(0, 10) : "Never"; // Specifically look for Oversight/Suppression actions const osLog = await robustCall(localApi, { action: 'query', list: 'logevents', leuser: username, letype: 'suppress', lelimit: 1, formatversion: 2 }); let lastOS = "-"; if (osLog.query && osLog.query.logevents && osLog.query.logevents.length > 0) { lastOS = osLog.query.logevents[0].timestamp.substring(0, 10); } else { // Check if the user even has Oversight rights to begin with var uGroups = extractGroups(u.groups); if (uGroups.indexOf('suppress') !== -1 || uGroups.indexOf('oversight') !== -1) { lastOS = "Never"; } } // Check the date of the user's last actual edit const edLog = await robustCall(localApi, { action: 'query', list: 'usercontribs', ucuser: username, uclimit: 1, formatversion: 2 }); const lastEdit = (edLog.query && edLog.query.usercontribs && edLog.query.usercontribs[0]) ? edLog.query.usercontribs[0].timestamp.substring(0, 10) : "Never"; // Append the gathered data as a new row in the wikitext table wt += '|-\n| style="text-align:left; white-space:nowrap;" | [[' + iw + ':Special:Log/' + username + '|' + username + '@' + db + ']] || ' + sinceDate + ' || ' + days + ' || ' + lastCU + ' || ' + lastAdm + ' || ' + lastOS + ' || ' + lastGen + ' || ' + lastEdit + '\n'; } } } catch (err) { console.error('Failed to audit ' + db, err); } // Update progress bar $('#bar').val(i + 1); await sleep(DELAY_MS); } // Finalize the table and display the result wt += '}\n\n=== References ===\n<references />\n'; $('#out').val(wt); $('#output-container').show(); $('#status-msg').text('Audit complete!').css("color", "green"); $('#start').prop('disabled', false); $('#stop').prop('disabled', true); }); } setupUI(); }); })(); nhjmjzs6v6qug4j5jpeo5d9f0x63g6h 739105 739103 2026-04-22T18:31:20Z MrJaroslavik 44012 e 739105 javascript text/javascript // GlobalCheckUserList.js // ------------------------------------------------------- // Features: // - Global Audit: Scans current CheckUsers across 800+ projects. // - Full Pagination: Bypasses API limits for user lists and history logs. // - Deep Rights Discovery: Checks Meta (steward) and Local (bureaucrat) logs for the grant date. // - Single Table: Unified wikitext output in one sortable table. // - Navigation: Nicknames link to local logs; headers link to project, list, and CU log. // - Stable: Handles 429 rate limits and uses Cross-Tab locking. // - Compatibility: No optional chaining (?.) for MediaWiki editor support. // - Created with help of Gemini 3. // ------------------------------------------------------- (function() { 'use strict'; // Run only on Special:BlankPage/GlobalCheckUserList const isBlankPage = mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage'; const isOurScript = mw.config.get('wgTitle').includes('GlobalCheckUserList'); if (!isBlankPage || !isOurScript) return; let globalWikiMap = {}; // List of wikis where CheckUser extension is disabled - https://noc.wikimedia.org/conf/highlight.php?file=dblists/checkuser-disabled.dblist const disabledCUWikis = [ 'aawikibooks', 'abwiktionary', 'advisorywiki', 'akwiktionary', 'angwikiquote', 'angwikisource', 'astwikibooks', 'astwikiquote', 'aswikibooks', 'aswiktionary', 'avwiktionary', 'aywikibooks', 'bhwiktionary', 'biwikibooks', 'biwiktionary', 'bmwikibooks', 'bmwikiquote', 'bmwiktionary', 'bowiktionary', 'chwikibooks', 'chwiktionary', 'cnwikimedia', 'crwikiquote', 'crwiktionary', 'dzwiktionary', 'gawikibooks', 'gnwikibooks', 'gotwikibooks', 'guwikibooks', 'htwikisource', 'huwikinews', 'hzwiki', 'iewikibooks', 'iiwiki', 'internalwiki', 'kjwiki', 'kkwikiquote', 'knwikibooks', 'krwiki', 'krwikiquote', 'kswikibooks', 'kswikiquote', 'kwwikiquote', 'lbwikibooks', 'lbwikiquote', 'lnwikibooks', 'lvwikibooks', 'mhwiktionary', 'mnwikibooks', 'muswiki', 'nahwikibooks', 'nawikibooks', 'nawikiquote', 'ndswikibooks', 'ndswikiquote', 'piwiktionary', 'pswikibooks', 'quwikibooks', 'quwikiquote', 'rmwikibooks', 'rmwiktionary', 'rnwiktionary', 'scwiktionary', 'searchcomwiki', 'snwiktionary', 'spcomwiki', 'swwikibooks', 'thwikinews', 'tkwikibooks', 'tkwikiquote', 'towiktionary', 'transitionteamwiki', 'trwikinews', 'ttwikiquote', 'twwiktionary', 'ugwikibooks', 'ugwikiquote', 'vowikibooks', 'vowikiquote', 'wawikibooks', 'wikimania2005wiki', 'wikimania2006wiki', 'wikimania2007wiki', 'wikimania2009wiki', 'wikimania2015wiki', 'wowikiquote', 'xhwikibooks', 'xhwiktionary', 'yowikibooks', 'yowiktionary', 'zawikibooks', 'zawikiquote', 'zawiktionary', 'zh_min_nanwikibooks', 'zuwikibooks' ]; // Targeted list of projects known to have active local CheckUsers - https://meta.wikimedia.org/wiki/CheckUser_policy/Users_with_CheckUser_access const localCUWikis = [ 'arwiki', 'bnwiki', 'cawiki', 'cswiki', 'dawiki', 'nlwiki', 'enwikibooks', 'enwiki', 'enwikivoyage', 'enwiktionary', 'fiwiki', 'frwiki', 'dewiki', 'hewiki', 'huwiki', 'idwiki', 'itwiki', 'jawiki', 'kowiki', 'fawiki', 'plwiki', 'ptwiki', 'ruwiki', 'srwiki', 'simplewiki', 'slwiki', 'eswiki', 'svwiki', 'thwiki', 'trwiki', 'ukwiki', 'viwiki', 'commonswiki', 'specieswiki', 'metawiki', 'wikidatawiki' ]; // Fetch all wikis and filter out the ones we cannot or should not scan function loadGlobalWikiMap() { const api = new mw.Api(); return api.get({ action: 'sitematrix', format: 'json', smtype: 'language|special', smlangprop: 'site', smsiteprop: 'dbname|url', formatversion: 2, origin: '*' }).then(function(data) { const matrix = data.sitematrix; const wikiMap = {}; Object.keys(matrix).forEach(key => { const entry = matrix[key]; if (entry.site && Array.isArray(entry.site)) { entry.site.forEach(site => { if (site.private || site.fishbowl || disabledCUWikis.indexOf(site.dbname) !== -1) return; wikiMap[site.dbname] = site.url; }); } }); if (matrix.specials && Array.isArray(matrix.specials)) { matrix.specials.forEach(special => { if (special.private || special.fishbowl || disabledCUWikis.indexOf(special.dbname) !== -1) return; wikiMap[special.dbname] = special.url; }); } return wikiMap; }); } const DELAY_MS = 500; const sleep = ms => new Promise(r => setTimeout(r, ms)); // Convert database names to short codes for linking function getInterwikiPrefix(db) { // Map special projects and specific language codes const specialMap = { 'commonswiki': 'c', 'metawiki': 'm', 'wikidatawiki': 'd', 'wikifunctionswiki': 'f', 'mediawikiwiki': 'mw', 'specieswiki': 'species', 'sourceswiki': 'oldwikisource', 'foundationwiki': 'foundation', 'incubatorwiki': 'incubator', 'outreachwiki': 'outreach', 'betawikiversity': 'betawikiversity', 'be_x_oldwiki': 'be-tarask', 'zh_classicalwiki': 'lzh', 'zh_min_nanwiki': 'nan', 'zh_yuewiki': 'yue' }; if (specialMap[db]) return specialMap[db]; const name = db.replace(/_/g, '-'); // Map project types like Wikibooks or Wiktionary to short prefixes if (name.endsWith('wikisource')) return 's:' + name.slice(0, -10); if (name.endsWith('wikiversity')) return 'v:' + name.slice(0, -11); if (name.endsWith('wiktionary')) return 'wikt:' + name.slice(0, -10); if (name.endsWith('wikivoyage')) return 'voy:' + name.slice(0, -10); if (name.endsWith('wikibooks')) return 'b:' + name.slice(0, -9); if (name.endsWith('wikiquote')) return 'q:' + name.slice(0, -9); if (name.endsWith('wikinews')) return 'n:' + name.slice(0, -8); // Format links for local Wikimedia chapters if (name.endsWith('wikimedia')) { return 'wm' + name.slice(0, -9); } // Create a Wikipedia link for standard project names if (name.endsWith('wiki')) { return 'w:' + name.slice(0, -4); } return 'w:' + name; } // Turn different API formats into a clean list of groups const extractGroups = (data) => { if (!data) return []; var res = []; // Handle data whether it is already a list, an object, or just text if (Array.isArray(data)) { res = data; } else if (typeof data === 'object') { res = Object.values(data); } else if (typeof data === 'string') { res = data.split(',').map(function(s) { return s.trim(); }); } // Normalize names so "Check User" becomes "checkuser" for easy comparison return res.map(function(g) { if (typeof g !== 'string') return g; return g.replace(/\s+/g, '').toLowerCase(); }); }; async function robustCall(api, params) { let retries = 0; const maxRetries = 3; while (retries < maxRetries) { try { // Try to get data from the server return await api.get(params); } catch (err) { // If we get a "too many requests" error if (err?.status === 429) { retries++; // See how long the server wants us to wait const waitTime = parseInt(err.xhr?.getResponseHeader('Retry-After')) || (30 * retries); // Update the UI so the user knows we are waiting $('#status-msg').html( `<span style="color:orange; font-weight:bold;">Server is busy! Waiting ${waitTime}s...</span>` ); await sleep(waitTime * 1000); } else { // Stop if it is a different kind of error throw err; } } } // Give up after 3 tries throw new Error("Failed to reach API after multiple attempts"); } // Ensure all required MediaWiki modules are ready before starting mw.loader.using(['mediawiki.api', 'mediawiki.ForeignApi']).then(async function() { // Let the user know the script is preparing the wiki database $('#mw-content-text').html('<strong>GlobalCheckUserList.js: Loading wiki map...</strong>'); // Build the database map (dbname -> URL) for all projects globalWikiMap = await loadGlobalWikiMap(); // Establish a connection to Meta-Wiki for global rights lookups const metaApi = new mw.ForeignApi('https://meta.wikimedia.org/w/api.php'); // State variables to control the script execution and filtering let isRunning = false; let currentFilterMode = 'all'; // Build and display the script interface function setupUI() { $('#firstHeading').text('GlobalCheckUserList'); // Main container for the tool interface $('#mw-content-text').empty().append(` <div style="border:1px solid #a2a9b1; padding:15px; background:#f8f9fa;"> <p>Audits current CheckUsers across Wikimedia projects. Reports are grouped into one single table.</p> <div style="margin-bottom:10px; display:flex; align-items:center; gap:20px; font-size:13px;"> <strong>Wiki Filter:</strong> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-all" checked> All</label> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-localcu"> Local CU Wikis</label> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-only"> Only these</label> <span id="wiki-help-trigger" style="cursor:help; background:#36c; color:#fff; border-radius:50%; width:18px; height:18px; display:inline-block; text-align:center; font-weight:bold;" title="Show available DB names">?</span> </div> <div id="filter-input-container" style="display:none; margin-bottom:15px;"> <input id="wiki-filter" type="text" style="width:100%;" placeholder="dbname1, dbname2..."> </div> <div id="wiki-list-help" style="display:none; margin-bottom:10px; padding:10px; background:#fff; border:1px solid #a2a9b1; font-size:11px; max-height:120px; overflow-y:auto; font-family:monospace;"> <strong>Available database names:</strong><br>${Object.keys(globalWikiMap).sort().join(', ')} </div> <div style="margin-top:20px;"> <button id="start" class="mw-ui-button mw-ui-progressive">Run Audit</button> <button id="stop" class="mw-ui-button mw-ui-destructive" disabled>Stop</button> </div> <div id="status-msg" style="margin-top:10px; font-weight:bold; color:#0056b3;">Ready.</div> <div style="margin-top:5px;"> <progress id="bar" value="0" max="${Object.keys(globalWikiMap).length}" style="width:100%"></progress> </div> <div id="output-container" style="display:none; margin-top:15px;"> <strong>Wikitext Report:</strong> <textarea id="out" style="width:100%; height:450px; font-family:monospace; font-size:11px; padding:5px; border:1px solid #c8ccd1;"></textarea> </div> </div> `); // Manage filter visibility based on user selection $('#btn-all').click(function() { currentFilterMode = 'all'; $('#filter-input-container').hide(); }); $('#btn-localcu').click(function() { currentFilterMode = 'localcu'; $('#filter-input-container').hide(); }); $('#btn-only').click(function() { currentFilterMode = 'include'; $('#filter-input-container').show().focus(); }); // Interaction logic for help and script control $('#wiki-help-trigger').click(function() { $('#wiki-list-help').toggle(); }); $('#start').click(function() { runAudit(); }); $('#stop').click(function() { isRunning = false; }); } // Recursive helper to find all previous names of a user via Meta's global rename log async function getPreviousNames(currentName) { let names = []; try { const res = await robustCall(metaApi, { action: 'query', list: 'logevents', letype: 'gblrename', letitle: 'User:' + currentName, // On Meta, 'title' in rename log is the NEW name formatversion: 2 }); const logs = (res.query && res.query.logevents) || []; for (let ev of logs) { if (ev.params && ev.params.oldname) { names.push(ev.params.oldname); // Deep search: find if the old name was also a result of a previous rename const olderNames = await getPreviousNames(ev.params.oldname); names = names.concat(olderNames); } } } catch (e) { console.error("Rename lookup failed for " + currentName, e); } return [...new Set(names)]; // Return unique names only } async function findGrantDate(user, db, localApi) { // Helper for the actual log searching logic async function searchLog(targetUser) { // Phase 1: Meta (steward) let mPars = { action: 'query', list: 'logevents', letype: 'rights', letitle: 'User:' + targetUser + '@' + db, ledir: 'newer', lelimit: 'max', formatversion: 2 }; let resM = await robustCall(metaApi, mPars); let logsM = (resM.query && resM.query.logevents) || []; for (let ev of logsM) { let p = ev.params || {}; let nG = extractGroups(p.newgroups || p.add || p[1] || p["1"]); let oG = extractGroups(p.oldgroups || p.remove || p[0] || p["0"]); if (nG.indexOf('checkuser') !== -1 && oG.indexOf('checkuser') === -1) return ev.timestamp.substring(0, 10); } // Phase 2: Local (bureaucrat) let lPars = { action: 'query', list: 'logevents', letype: 'rights', letitle: 'User:' + targetUser, ledir: 'newer', lelimit: 'max', formatversion: 2 }; let resL = await robustCall(localApi, lPars); let logsL = (resL.query && resL.query.logevents) || []; for (let ev of logsL) { let p = ev.params || {}; let nG = extractGroups(p.newgroups || p.add || p[1] || p["1"]); let oG = extractGroups(p.oldgroups || p.remove || p[0] || p["0"]); if (nG.indexOf('checkuser') !== -1 && oG.indexOf('checkuser') === -1) return ev.timestamp.substring(0, 10); } return null; } // 1. Try current name let date = await searchLog(user); if (date) return date; // 2. If not found, look for previous names (Global Rename Progress) const oldNames = await getPreviousNames(user); for (let oldName of oldNames) { if (!isRunning) break; date = await searchLog(oldName); if (date) return date + " (as " + oldName + ")"; } return "Unknown"; } // Main execution function that iterates through wikis and collects CU data async function runAudit() { isRunning = true; let wt = ""; // 1. MUST BE DEFINED HERE to be available for the table header reference below const adminTypes = [ 'block', 'delete', 'protect', 'rights', 'merge', 'abusefilter', 'contentmodel', 'import', 'managetags', 'massmessage', 'checkuser-temporary-account', 'ipinfo', 'pagelang', 'renameuser', 'stable', 'gblblock', 'abusefilter-protected-vars' ]; const cuInPublicTypes = ['abusefilterprivatedetails']; $('#start').prop('disabled', true); $('#stop').prop('disabled', false); $('#out').val(wt).show(); $('#output-container').show(); $('#status-msg').text('Waiting for queue lock...').css("color", "orange"); // Use a browser lock to prevent multiple instances from running at once await navigator.locks.request('global_cu_list_lock', async () => { const ts = new Date().toISOString().replace('T', ' ').substring(0, 16) + ' (UTC)'; // Initialize the wikitext report with header information let wt = "== Global CheckUser List ==\n"; wt += "''Report generated on: " + ts + "<br />\n"; wt += "Generated with [[testwiki:User:MrJaroslavik/GlobalCheckUserList.js|GlobalCheckUserList.js]]''\n"; // Parse user filters before starting the loop const filterText = $('#wiki-filter').val().trim().toLowerCase(); const filterList = filterText ? filterText.split(',').map(function(s) { return s.trim(); }).filter(function(s) { return s !== ""; }) : []; // Add filter metadata to the report header if (currentFilterMode === 'localcu') { wt += "<br />''Filter applied: Wikis with local CheckUser communities''\n"; } else if (currentFilterMode === 'include' && filterList.length > 0) { wt += "<br />''Filter applied: Only these wikis (" + filterList.join(', ') + ")''\n"; } wt += "\n"; // Build the table header with sortable columns and clean technical references wt += '{| class="wikitable sortable" style="font-size:90%; width:100%;"\n' + '! User !! CU Since !! Duration !! Last CU Action<ref>Logs: checkuserlog, checkuser-temporary-account, abusefilterprivatedetails</ref> !! ' + 'Last Admin Action<ref>Logs: ' + adminTypes.join(', ') + '</ref> !! ' + 'Last OS Action<ref>Logs: suppress</ref> !! ' + 'Last Logged Action<ref>Logs: all public logged actions</ref> !! Last Edit\n'; const allWikis = Object.keys(globalWikiMap); let wikisToScan; // Determine which wikis to audit based on the chosen filter mode if (currentFilterMode === 'include' && filterList.length > 0) { wikisToScan = allWikis.filter(function(w) { return filterList.indexOf(w) !== -1; }); } else if (currentFilterMode === 'localcu') { wikisToScan = allWikis.filter(function(w) { return localCUWikis.indexOf(w) !== -1; }); } else { wikisToScan = allWikis; } $('#bar').attr('max', wikisToScan.length).val(0); // Primary loop: audit each selected wiki one by one for (let i = 0; i < wikisToScan.length; i++) { if (!isRunning) break; const db = wikisToScan[i]; $('#status-msg').text('Auditing ' + db + ' (' + (i + 1) + '/' + wikisToScan.length + ')...').css("color", "#0056b3"); try { const wikiUrl = globalWikiMap[db]; const localApi = new mw.ForeignApi(wikiUrl + '/w/api.php'); // Fetch all users with 'checkuser' rights on this specific wiki let users = [], auDone = false, auCont = null; while (!auDone && isRunning) { let auPars = { action: 'query', list: 'allusers', augroup: 'checkuser', auprop: 'groups', aulimit: 'max', formatversion: 2 }; if (auCont) Object.assign(auPars, auCont); let res = await robustCall(localApi, auPars); users = users.concat(res.query.allusers || []); if (res.continue) auCont = res.continue; else auDone = true; } // Only add the wiki section to the report if checkusers were found if (users.length > 0) { const iw = getInterwikiPrefix(db); wt += '|-\n! colspan="8" style="background:#eaecf0; text-align:center;" | ' + '[[' + iw + ':|' + db + ']] — [[' + iw + ':Special:ListUsers/checkuser|(list)]] — [[' + iw + ':Special:CheckUserLog|(log)]]\n'; // Loop through each found CheckUser on the current wiki for (const u of users) { const username = u.name; // Determine when the user first received their CU rights const sinceDate = await findGrantDate(username, db, localApi); let days = "???"; if (sinceDate !== "Unknown") { // Calculate how many days they have held the rights days = Math.floor((new Date() - new Date(sinceDate)) / 86400000) + "d"; } // Fetch internal CU log (private) const cuLog = await robustCall(localApi, { action: 'query', list: 'checkuserlog', culuser: username, cullimit: 1, formatversion: 2 }); let lastCU = (cuLog.query && cuLog.query.checkuserlog && cuLog.query.checkuserlog.entries && cuLog.query.checkuserlog.entries[0]) ? cuLog.query.checkuserlog.entries[0].timestamp.substring(0, 10) : "Never"; // Fetch all public logs for this user const allUserLogsReq = await robustCall(localApi, { action: 'query', list: 'logevents', leuser: username, lelimit: 'max', formatversion: 2 }); const allUserLogs = (allUserLogsReq.query && allUserLogsReq.query.logevents) || []; // CROSS-CHECK: Look for CU actions that leak into public logs (like abusefilterprivatedetails) const pubCUEvt = allUserLogs.find(function(ev) { return cuInPublicTypes.indexOf(ev.type) !== -1; }); if (pubCUEvt) { const pubCUTs = pubCUEvt.timestamp.substring(0, 10); if (lastCU === "Never" || pubCUTs > lastCU) lastCU = pubCUTs; } // Identify the last administrative action from our comprehensive list const admEvent = allUserLogs.find(function(ev) { return adminTypes.indexOf(ev.type) !== -1; }); const lastAdm = admEvent ? admEvent.timestamp.substring(0, 10) : "Never"; // Get the timestamp of the very last logged action of any kind const lastGen = allUserLogs.length > 0 ? allUserLogs[0].timestamp.substring(0, 10) : "Never"; // Specifically look for Oversight/Suppression actions const osLog = await robustCall(localApi, { action: 'query', list: 'logevents', leuser: username, letype: 'suppress', lelimit: 1, formatversion: 2 }); let lastOS = "-"; if (osLog.query && osLog.query.logevents && osLog.query.logevents.length > 0) { lastOS = osLog.query.logevents[0].timestamp.substring(0, 10); } else { // Check if the user even has Oversight rights to begin with var uGroups = extractGroups(u.groups); if (uGroups.indexOf('suppress') !== -1 || uGroups.indexOf('oversight') !== -1) { lastOS = "Never"; } } // Check the date of the user's last actual edit const edLog = await robustCall(localApi, { action: 'query', list: 'usercontribs', ucuser: username, uclimit: 1, formatversion: 2 }); const lastEdit = (edLog.query && edLog.query.usercontribs && edLog.query.usercontribs[0]) ? edLog.query.usercontribs[0].timestamp.substring(0, 10) : "Never"; // Append the gathered data as a new row in the wikitext table wt += '|-\n| style="text-align:left; white-space:nowrap;" | [[' + iw + ':Special:Log/' + username + '|' + username + '@' + db + ']] || ' + sinceDate + ' || ' + days + ' || ' + lastCU + ' || ' + lastAdm + ' || ' + lastOS + ' || ' + lastGen + ' || ' + lastEdit + '\n'; } } } catch (err) { console.error('Failed to audit ' + db, err); } // Update progress bar $('#bar').val(i + 1); await sleep(DELAY_MS); } // Finalize the table and display the result wt += '}\n\n=== References ===\n<references />\n'; $('#out').val(wt); $('#output-container').show(); $('#status-msg').text('Audit complete!').css("color", "green"); $('#start').prop('disabled', false); $('#stop').prop('disabled', true); }); } setupUI(); }); })(); cttnexaq0idpdhmci6e3tjcep3nwxjn 739112 739105 2026-04-22T19:14:38Z MrJaroslavik 44012 e 739112 javascript text/javascript // GlobalCheckUserList.js // ------------------------------------------------------- // Features: // - Global Audit: Scans current CheckUsers across 800+ projects. // - Full Pagination: Bypasses API limits for user lists and history logs. // - Deep Rights Discovery: Checks Meta (steward) and Local (bureaucrat) logs for the grant date. // - Single Table: Unified wikitext output in one sortable table. // - Navigation: Nicknames link to local logs; headers link to project, list, and CU log. // - Stable: Handles 429 rate limits and uses Cross-Tab locking. // - Compatibility: No optional chaining (?.) for MediaWiki editor support. // - Created with help of Gemini 3. // ------------------------------------------------------- (function() { 'use strict'; // Run only on Special:BlankPage/GlobalCheckUserList const isBlankPage = mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage'; const isOurScript = mw.config.get('wgTitle').includes('GlobalCheckUserList'); if (!isBlankPage || !isOurScript) return; let globalWikiMap = {}; // List of wikis where CheckUser extension is disabled - https://noc.wikimedia.org/conf/highlight.php?file=dblists/checkuser-disabled.dblist const disabledCUWikis = [ 'aawikibooks', 'abwiktionary', 'advisorywiki', 'akwiktionary', 'angwikiquote', 'angwikisource', 'astwikibooks', 'astwikiquote', 'aswikibooks', 'aswiktionary', 'avwiktionary', 'aywikibooks', 'bhwiktionary', 'biwikibooks', 'biwiktionary', 'bmwikibooks', 'bmwikiquote', 'bmwiktionary', 'bowiktionary', 'chwikibooks', 'chwiktionary', 'cnwikimedia', 'crwikiquote', 'crwiktionary', 'dzwiktionary', 'gawikibooks', 'gnwikibooks', 'gotwikibooks', 'guwikibooks', 'htwikisource', 'huwikinews', 'hzwiki', 'iewikibooks', 'iiwiki', 'internalwiki', 'kjwiki', 'kkwikiquote', 'knwikibooks', 'krwiki', 'krwikiquote', 'kswikibooks', 'kswikiquote', 'kwwikiquote', 'lbwikibooks', 'lbwikiquote', 'lnwikibooks', 'lvwikibooks', 'mhwiktionary', 'mnwikibooks', 'muswiki', 'nahwikibooks', 'nawikibooks', 'nawikiquote', 'ndswikibooks', 'ndswikiquote', 'piwiktionary', 'pswikibooks', 'quwikibooks', 'quwikiquote', 'rmwikibooks', 'rmwiktionary', 'rnwiktionary', 'scwiktionary', 'searchcomwiki', 'snwiktionary', 'spcomwiki', 'swwikibooks', 'thwikinews', 'tkwikibooks', 'tkwikiquote', 'towiktionary', 'transitionteamwiki', 'trwikinews', 'ttwikiquote', 'twwiktionary', 'ugwikibooks', 'ugwikiquote', 'vowikibooks', 'vowikiquote', 'wawikibooks', 'wikimania2005wiki', 'wikimania2006wiki', 'wikimania2007wiki', 'wikimania2009wiki', 'wikimania2015wiki', 'wowikiquote', 'xhwikibooks', 'xhwiktionary', 'yowikibooks', 'yowiktionary', 'zawikibooks', 'zawikiquote', 'zawiktionary', 'zh_min_nanwikibooks', 'zuwikibooks' ]; // Targeted list of projects known to have active local CheckUsers - https://meta.wikimedia.org/wiki/CheckUser_policy/Users_with_CheckUser_access const localCUWikis = [ 'arwiki', 'bnwiki', 'cawiki', 'cswiki', 'dawiki', 'nlwiki', 'enwikibooks', 'enwiki', 'enwikivoyage', 'enwiktionary', 'fiwiki', 'frwiki', 'dewiki', 'hewiki', 'huwiki', 'idwiki', 'itwiki', 'jawiki', 'kowiki', 'fawiki', 'plwiki', 'ptwiki', 'ruwiki', 'srwiki', 'simplewiki', 'slwiki', 'eswiki', 'svwiki', 'thwiki', 'trwiki', 'ukwiki', 'viwiki', 'commonswiki', 'specieswiki', 'metawiki', 'wikidatawiki' ]; // Manual overrides for Unknown dates // Format: "Username@dbname": "YYYY-MM-DD" const customGrantDates = { "RiazACU@bnwiki": "2022-05-13", "Example@cswiki": "2010-01-01" }; // Fetch all wikis and filter out the ones we cannot or should not scan function loadGlobalWikiMap() { const api = new mw.Api(); return api.get({ action: 'sitematrix', format: 'json', smtype: 'language|special', smlangprop: 'site', smsiteprop: 'dbname|url', formatversion: 2, origin: '*' }).then(function(data) { const matrix = data.sitematrix; const wikiMap = {}; Object.keys(matrix).forEach(key => { const entry = matrix[key]; if (entry.site && Array.isArray(entry.site)) { entry.site.forEach(site => { if (site.private || site.fishbowl || disabledCUWikis.indexOf(site.dbname) !== -1) return; wikiMap[site.dbname] = site.url; }); } }); if (matrix.specials && Array.isArray(matrix.specials)) { matrix.specials.forEach(special => { if (special.private || special.fishbowl || disabledCUWikis.indexOf(special.dbname) !== -1) return; wikiMap[special.dbname] = special.url; }); } return wikiMap; }); } const DELAY_MS = 500; const sleep = ms => new Promise(r => setTimeout(r, ms)); // Convert database names to short codes for linking function getInterwikiPrefix(db) { // Map special projects and specific language codes const specialMap = { 'commonswiki': 'c', 'metawiki': 'm', 'wikidatawiki': 'd', 'wikifunctionswiki': 'f', 'mediawikiwiki': 'mw', 'specieswiki': 'species', 'sourceswiki': 'oldwikisource', 'foundationwiki': 'foundation', 'incubatorwiki': 'incubator', 'outreachwiki': 'outreach', 'betawikiversity': 'betawikiversity', 'be_x_oldwiki': 'be-tarask', 'zh_classicalwiki': 'lzh', 'zh_min_nanwiki': 'nan', 'zh_yuewiki': 'yue' }; if (specialMap[db]) return specialMap[db]; const name = db.replace(/_/g, '-'); // Map project types like Wikibooks or Wiktionary to short prefixes if (name.endsWith('wikisource')) return 's:' + name.slice(0, -10); if (name.endsWith('wikiversity')) return 'v:' + name.slice(0, -11); if (name.endsWith('wiktionary')) return 'wikt:' + name.slice(0, -10); if (name.endsWith('wikivoyage')) return 'voy:' + name.slice(0, -10); if (name.endsWith('wikibooks')) return 'b:' + name.slice(0, -9); if (name.endsWith('wikiquote')) return 'q:' + name.slice(0, -9); if (name.endsWith('wikinews')) return 'n:' + name.slice(0, -8); // Format links for local Wikimedia chapters if (name.endsWith('wikimedia')) { return 'wm' + name.slice(0, -9); } // Create a Wikipedia link for standard project names if (name.endsWith('wiki')) { return 'w:' + name.slice(0, -4); } return 'w:' + name; } // Turn different API formats into a clean list of groups const extractGroups = (data) => { if (!data) return []; var res = []; // Handle data whether it is already a list, an object, or just text if (Array.isArray(data)) { res = data; } else if (typeof data === 'object') { res = Object.values(data); } else if (typeof data === 'string') { res = data.split(',').map(function(s) { return s.trim(); }); } // Normalize names so "Check User" becomes "checkuser" for easy comparison return res.map(function(g) { if (typeof g !== 'string') return g; return g.replace(/\s+/g, '').toLowerCase(); }); }; async function robustCall(api, params) { let retries = 0; const maxRetries = 3; while (retries < maxRetries) { try { // Try to get data from the server return await api.get(params); } catch (err) { // If we get a "too many requests" error if (err?.status === 429) { retries++; // See how long the server wants us to wait const waitTime = parseInt(err.xhr?.getResponseHeader('Retry-After')) || (30 * retries); // Update the UI so the user knows we are waiting $('#status-msg').html( `<span style="color:orange; font-weight:bold;">Server is busy! Waiting ${waitTime}s...</span>` ); await sleep(waitTime * 1000); } else { // Stop if it is a different kind of error throw err; } } } // Give up after 3 tries throw new Error("Failed to reach API after multiple attempts"); } // Ensure all required MediaWiki modules are ready before starting mw.loader.using(['mediawiki.api', 'mediawiki.ForeignApi']).then(async function() { // Let the user know the script is preparing the wiki database $('#mw-content-text').html('<strong>GlobalCheckUserList.js: Loading wiki map...</strong>'); // Build the database map (dbname -> URL) for all projects globalWikiMap = await loadGlobalWikiMap(); // Establish a connection to Meta-Wiki for global rights lookups const metaApi = new mw.ForeignApi('https://meta.wikimedia.org/w/api.php'); // State variables to control the script execution and filtering let isRunning = false; let currentFilterMode = 'all'; // Build and display the script interface function setupUI() { $('#firstHeading').text('GlobalCheckUserList'); // Main container for the tool interface $('#mw-content-text').empty().append(` <div style="border:1px solid #a2a9b1; padding:15px; background:#f8f9fa;"> <p>Audits current CheckUsers across Wikimedia projects. Reports are grouped into one single table.</p> <div style="margin-bottom:10px; display:flex; align-items:center; gap:20px; font-size:13px;"> <strong>Wiki Filter:</strong> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-all" checked> All</label> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-localcu"> Local CU Wikis</label> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-only"> Only these</label> <span id="wiki-help-trigger" style="cursor:help; background:#36c; color:#fff; border-radius:50%; width:18px; height:18px; display:inline-block; text-align:center; font-weight:bold;" title="Show available DB names">?</span> </div> <div id="filter-input-container" style="display:none; margin-bottom:15px;"> <input id="wiki-filter" type="text" style="width:100%;" placeholder="dbname1, dbname2..."> </div> <div id="wiki-list-help" style="display:none; margin-bottom:10px; padding:10px; background:#fff; border:1px solid #a2a9b1; font-size:11px; max-height:120px; overflow-y:auto; font-family:monospace;"> <strong>Available database names:</strong><br>${Object.keys(globalWikiMap).sort().join(', ')} </div> <div style="margin-top:20px;"> <button id="start" class="mw-ui-button mw-ui-progressive">Run Audit</button> <button id="stop" class="mw-ui-button mw-ui-destructive" disabled>Stop</button> </div> <div id="status-msg" style="margin-top:10px; font-weight:bold; color:#0056b3;">Ready.</div> <div style="margin-top:5px;"> <progress id="bar" value="0" max="${Object.keys(globalWikiMap).length}" style="width:100%"></progress> </div> <div id="output-container" style="display:none; margin-top:15px;"> <strong>Wikitext Report:</strong> <textarea id="out" style="width:100%; height:450px; font-family:monospace; font-size:11px; padding:5px; border:1px solid #c8ccd1;"></textarea> </div> </div> `); // Manage filter visibility based on user selection $('#btn-all').click(function() { currentFilterMode = 'all'; $('#filter-input-container').hide(); }); $('#btn-localcu').click(function() { currentFilterMode = 'localcu'; $('#filter-input-container').hide(); }); $('#btn-only').click(function() { currentFilterMode = 'include'; $('#filter-input-container').show().focus(); }); // Interaction logic for help and script control $('#wiki-help-trigger').click(function() { $('#wiki-list-help').toggle(); }); $('#start').click(function() { runAudit(); }); $('#stop').click(function() { isRunning = false; }); } async function findGrantDate(user, db, localApi) { // 0. Check manual override list first const key = user + "@" + db; if (customGrantDates[key]) return customGrantDates[key]; // Helper for the actual log searching logic async function searchLog(targetUser) { // Phase 1: Meta (steward) let mPars = { action: 'query', list: 'logevents', letype: 'rights', letitle: 'User:' + targetUser + '@' + db, ledir: 'newer', lelimit: 'max', formatversion: 2 }; let resM = await robustCall(metaApi, mPars); let logsM = (resM.query && resM.query.logevents) || []; for (let ev of logsM) { let p = ev.params || {}; let nG = extractGroups(p.newgroups || p.add || p[1] || p["1"]); let oG = extractGroups(p.oldgroups || p.remove || p[0] || p["0"]); if (nG.indexOf('checkuser') !== -1 && oG.indexOf('checkuser') === -1) return ev.timestamp.substring(0, 10); } // Phase 2: Local (bureaucrat) let lPars = { action: 'query', list: 'logevents', letype: 'rights', letitle: 'User:' + targetUser, ledir: 'newer', lelimit: 'max', formatversion: 2 }; let resL = await robustCall(localApi, lPars); let logsL = (resL.query && resL.query.logevents) || []; for (let ev of logsL) { let p = ev.params || {}; let nG = extractGroups(p.newgroups || p.add || p[1] || p["1"]); let oG = extractGroups(p.oldgroups || p.remove || p[0] || p["0"]); if (nG.indexOf('checkuser') !== -1 && oG.indexOf('checkuser') === -1) return ev.timestamp.substring(0, 10); } return null; } let date = await searchLog(user); return date || "Unknown"; } // Main execution function that iterates through wikis and collects CU data async function runAudit() { isRunning = true; let wt = ""; // 1. MUST BE DEFINED HERE to be available for the table header reference below const adminTypes = [ 'block', 'delete', 'protect', 'rights', 'merge', 'abusefilter', 'contentmodel', 'import', 'managetags', 'massmessage', 'checkuser-temporary-account', 'ipinfo', 'pagelang', 'renameuser', 'stable', 'gblblock', 'abusefilter-protected-vars' ]; const cuInPublicTypes = ['abusefilterprivatedetails']; $('#start').prop('disabled', true); $('#stop').prop('disabled', false); $('#out').val(wt).show(); $('#output-container').show(); $('#status-msg').text('Waiting for queue lock...').css("color", "orange"); // Use a browser lock to prevent multiple instances from running at once await navigator.locks.request('global_cu_list_lock', async () => { const ts = new Date().toISOString().replace('T', ' ').substring(0, 16) + ' (UTC)'; wt = "== Global CheckUser List ==\n"; wt += "''Report generated on: " + ts + "<br />\n"; wt += "Generated with [[testwiki:User:MrJaroslavik/GlobalCheckUserList.js|GlobalCheckUserList.js]]''\n"; // Parse user filters before starting the loop const filterText = $('#wiki-filter').val().trim().toLowerCase(); const filterList = filterText ? filterText.split(',').map(function(s) { return s.trim(); }).filter(function(s) { return s !== ""; }) : []; // Add filter metadata to the report header if (currentFilterMode === 'localcu') { wt += "<br />''Filter applied: Wikis with local CheckUser communities''\n"; } else if (currentFilterMode === 'include' && filterList.length > 0) { wt += "<br />''Filter applied: Only these wikis (" + filterList.join(', ') + ")''\n"; } wt += "\n"; // Build the table header with sortable columns and clean technical references wt += '{| class="wikitable sortable" style="font-size:90%; width:100%;"\n' + '! User !! CU Since !! Duration !! Last CU Action<ref>Logs: checkuserlog, checkuser-temporary-account, abusefilterprivatedetails</ref> !! ' + 'Last Admin Action<ref>Logs: ' + adminTypes.join(', ') + '</ref> !! ' + 'Last OS Action<ref>Logs: suppress</ref> !! ' + 'Last Logged Action<ref>Logs: all public logged actions</ref> !! Last Edit\n'; const allWikis = Object.keys(globalWikiMap); let wikisToScan; // Determine which wikis to audit based on the chosen filter mode if (currentFilterMode === 'include' && filterList.length > 0) { wikisToScan = allWikis.filter(function(w) { return filterList.indexOf(w) !== -1; }); } else if (currentFilterMode === 'localcu') { wikisToScan = allWikis.filter(function(w) { return localCUWikis.indexOf(w) !== -1; }); } else { wikisToScan = allWikis; } $('#bar').attr('max', wikisToScan.length).val(0); // Primary loop: audit each selected wiki one by one for (let i = 0; i < wikisToScan.length; i++) { if (!isRunning) break; const db = wikisToScan[i]; $('#status-msg').text('Auditing ' + db + ' (' + (i + 1) + '/' + wikisToScan.length + ')...').css("color", "#0056b3"); try { const wikiUrl = globalWikiMap[db]; const localApi = new mw.ForeignApi(wikiUrl + '/w/api.php'); // Fetch all users with 'checkuser' rights on this specific wiki let users = [], auDone = false, auCont = null; while (!auDone && isRunning) { let auPars = { action: 'query', list: 'allusers', augroup: 'checkuser', auprop: 'groups', aulimit: 'max', formatversion: 2 }; if (auCont) Object.assign(auPars, auCont); let res = await robustCall(localApi, auPars); users = users.concat(res.query.allusers || []); if (res.continue) auCont = res.continue; else auDone = true; } // Only add the wiki section to the report if checkusers were found if (users.length > 0) { const iw = getInterwikiPrefix(db); wt += '|-\n! colspan="8" style="background:#eaecf0; text-align:center;" | ' + '[[' + iw + ':|' + db + ']] — [[' + iw + ':Special:ListUsers/checkuser|(list)]] — [[' + iw + ':Special:CheckUserLog|(log)]]\n'; // Loop through each found CheckUser on the current wiki for (const u of users) { const username = u.name; // Determine when the user first received their CU rights const sinceDate = await findGrantDate(username, db, localApi); let days = "???"; if (sinceDate !== "Unknown") { // Calculate how many days they have held the rights days = Math.floor((new Date() - new Date(sinceDate)) / 86400000) + "d"; } // Fetch internal CU log (private) const cuLog = await robustCall(localApi, { action: 'query', list: 'checkuserlog', culuser: username, cullimit: 1, formatversion: 2 }); let lastCU = (cuLog.query && cuLog.query.checkuserlog && cuLog.query.checkuserlog.entries && cuLog.query.checkuserlog.entries[0]) ? cuLog.query.checkuserlog.entries[0].timestamp.substring(0, 10) : "Never"; // Fetch all public logs for this user const allUserLogsReq = await robustCall(localApi, { action: 'query', list: 'logevents', leuser: username, lelimit: 'max', formatversion: 2 }); const allUserLogs = (allUserLogsReq.query && allUserLogsReq.query.logevents) || []; // CROSS-CHECK: Look for CU actions that leak into public logs (like abusefilterprivatedetails) const pubCUEvt = allUserLogs.find(function(ev) { return cuInPublicTypes.indexOf(ev.type) !== -1; }); if (pubCUEvt) { const pubCUTs = pubCUEvt.timestamp.substring(0, 10); if (lastCU === "Never" || pubCUTs > lastCU) lastCU = pubCUTs; } // Identify the last administrative action from our comprehensive list const admEvent = allUserLogs.find(function(ev) { return adminTypes.indexOf(ev.type) !== -1; }); const lastAdm = admEvent ? admEvent.timestamp.substring(0, 10) : "Never"; // Get the timestamp of the very last logged action of any kind const lastGen = allUserLogs.length > 0 ? allUserLogs[0].timestamp.substring(0, 10) : "Never"; // Specifically look for Oversight/Suppression actions const osLog = await robustCall(localApi, { action: 'query', list: 'logevents', leuser: username, letype: 'suppress', lelimit: 1, formatversion: 2 }); let lastOS = "-"; if (osLog.query && osLog.query.logevents && osLog.query.logevents.length > 0) { lastOS = osLog.query.logevents[0].timestamp.substring(0, 10); } else { // Check if the user even has Oversight rights to begin with var uGroups = extractGroups(u.groups); if (uGroups.indexOf('suppress') !== -1 || uGroups.indexOf('oversight') !== -1) { lastOS = "Never"; } } // Check the date of the user's last actual edit const edLog = await robustCall(localApi, { action: 'query', list: 'usercontribs', ucuser: username, uclimit: 1, formatversion: 2 }); const lastEdit = (edLog.query && edLog.query.usercontribs && edLog.query.usercontribs[0]) ? edLog.query.usercontribs[0].timestamp.substring(0, 10) : "Never"; // Append the gathered data as a new row in the wikitext table wt += '|-\n| style="text-align:left; white-space:nowrap;" | [[' + iw + ':Special:Log/' + username + '|' + username + '@' + db + ']] || ' + sinceDate + ' || ' + days + ' || ' + lastCU + ' || ' + lastAdm + ' || ' + lastOS + ' || ' + lastGen + ' || ' + lastEdit + '\n'; } } } catch (err) { console.error('Failed to audit ' + db, err); } // Update progress bar $('#bar').val(i + 1); await sleep(DELAY_MS); } // Finalize the table and display the result wt += '}\n\n=== References ===\n<references />\n'; $('#out').val(wt); $('#output-container').show(); $('#status-msg').text('Audit complete!').css("color", "green"); $('#start').prop('disabled', false); $('#stop').prop('disabled', true); }); } setupUI(); }); })(); r7fv9seylweaepqa2jfvc9a6i2z9dsw 739114 739112 2026-04-22T19:28:06Z MrJaroslavik 44012 e 739114 javascript text/javascript // GlobalCheckUserList.js // ------------------------------------------------------- // Features: // - Global Audit: Scans current CheckUsers across 800+ projects. // - Full Pagination: Bypasses API limits for user lists and history logs. // - Deep Rights Discovery: Checks Meta (steward) and Local (bureaucrat) logs for the grant date. // - Single Table: Unified wikitext output in one sortable table. // - Navigation: Nicknames link to local logs; headers link to project, list, and CU log. // - Stable: Handles 429 rate limits and uses Cross-Tab locking. // - Compatibility: No optional chaining (?.) for MediaWiki editor support. // - Created with help of Gemini 3. // ------------------------------------------------------- (function() { 'use strict'; // Run only on Special:BlankPage/GlobalCheckUserList const isBlankPage = mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage'; const isOurScript = mw.config.get('wgTitle').includes('GlobalCheckUserList'); if (!isBlankPage || !isOurScript) return; let globalWikiMap = {}; // List of wikis where CheckUser extension is disabled - https://noc.wikimedia.org/conf/highlight.php?file=dblists/checkuser-disabled.dblist const disabledCUWikis = [ 'aawikibooks', 'abwiktionary', 'advisorywiki', 'akwiktionary', 'angwikiquote', 'angwikisource', 'astwikibooks', 'astwikiquote', 'aswikibooks', 'aswiktionary', 'avwiktionary', 'aywikibooks', 'bhwiktionary', 'biwikibooks', 'biwiktionary', 'bmwikibooks', 'bmwikiquote', 'bmwiktionary', 'bowiktionary', 'chwikibooks', 'chwiktionary', 'cnwikimedia', 'crwikiquote', 'crwiktionary', 'dzwiktionary', 'gawikibooks', 'gnwikibooks', 'gotwikibooks', 'guwikibooks', 'htwikisource', 'huwikinews', 'hzwiki', 'iewikibooks', 'iiwiki', 'internalwiki', 'kjwiki', 'kkwikiquote', 'knwikibooks', 'krwiki', 'krwikiquote', 'kswikibooks', 'kswikiquote', 'kwwikiquote', 'lbwikibooks', 'lbwikiquote', 'lnwikibooks', 'lvwikibooks', 'mhwiktionary', 'mnwikibooks', 'muswiki', 'nahwikibooks', 'nawikibooks', 'nawikiquote', 'ndswikibooks', 'ndswikiquote', 'piwiktionary', 'pswikibooks', 'quwikibooks', 'quwikiquote', 'rmwikibooks', 'rmwiktionary', 'rnwiktionary', 'scwiktionary', 'searchcomwiki', 'snwiktionary', 'spcomwiki', 'swwikibooks', 'thwikinews', 'tkwikibooks', 'tkwikiquote', 'towiktionary', 'transitionteamwiki', 'trwikinews', 'ttwikiquote', 'twwiktionary', 'ugwikibooks', 'ugwikiquote', 'vowikibooks', 'vowikiquote', 'wawikibooks', 'wikimania2005wiki', 'wikimania2006wiki', 'wikimania2007wiki', 'wikimania2009wiki', 'wikimania2015wiki', 'wowikiquote', 'xhwikibooks', 'xhwiktionary', 'yowikibooks', 'yowiktionary', 'zawikibooks', 'zawikiquote', 'zawiktionary', 'zh_min_nanwikibooks', 'zuwikibooks' ]; // Targeted list of projects known to have active local CheckUsers - https://meta.wikimedia.org/wiki/CheckUser_policy/Users_with_CheckUser_access const localCUWikis = [ 'arwiki', 'bnwiki', 'cawiki', 'cswiki', 'dawiki', 'nlwiki', 'enwikibooks', 'enwiki', 'enwikivoyage', 'enwiktionary', 'fiwiki', 'frwiki', 'dewiki', 'hewiki', 'huwiki', 'idwiki', 'itwiki', 'jawiki', 'kowiki', 'fawiki', 'plwiki', 'ptwiki', 'ruwiki', 'srwiki', 'simplewiki', 'slwiki', 'eswiki', 'svwiki', 'thwiki', 'trwiki', 'ukwiki', 'viwiki', 'commonswiki', 'specieswiki', 'metawiki', 'wikidatawiki' ]; // Manual overrides for Unknown dates // Format: "Username@dbname": "YYYY-MM-DD" const customGrantDates = { "RiazACU@bnwiki": "2022-05-13", "Example@cswiki": "2010-01-01" }; // Fetch all wikis and filter out the ones we cannot or should not scan function loadGlobalWikiMap() { const api = new mw.Api(); return api.get({ action: 'sitematrix', format: 'json', smtype: 'language|special', smlangprop: 'site', smsiteprop: 'dbname|url', formatversion: 2, origin: '*' }).then(function(data) { const matrix = data.sitematrix; const wikiMap = {}; Object.keys(matrix).forEach(key => { const entry = matrix[key]; if (entry.site && Array.isArray(entry.site)) { entry.site.forEach(site => { if (site.private || site.fishbowl || disabledCUWikis.indexOf(site.dbname) !== -1) return; wikiMap[site.dbname] = site.url; }); } }); if (matrix.specials && Array.isArray(matrix.specials)) { matrix.specials.forEach(special => { if (special.private || special.fishbowl || disabledCUWikis.indexOf(special.dbname) !== -1) return; wikiMap[special.dbname] = special.url; }); } return wikiMap; }); } const DELAY_MS = 500; const sleep = ms => new Promise(r => setTimeout(r, ms)); // Convert database names to short codes for linking function getInterwikiPrefix(db) { // Map special projects and specific language codes const specialMap = { 'commonswiki': 'c', 'metawiki': 'm', 'wikidatawiki': 'd', 'wikifunctionswiki': 'f', 'mediawikiwiki': 'mw', 'specieswiki': 'species', 'sourceswiki': 'oldwikisource', 'foundationwiki': 'foundation', 'incubatorwiki': 'incubator', 'outreachwiki': 'outreach', 'betawikiversity': 'betawikiversity', 'be_x_oldwiki': 'be-tarask', 'zh_classicalwiki': 'lzh', 'zh_min_nanwiki': 'nan', 'zh_yuewiki': 'yue' }; if (specialMap[db]) return specialMap[db]; const name = db.replace(/_/g, '-'); // Map project types like Wikibooks or Wiktionary to short prefixes if (name.endsWith('wikisource')) return 's:' + name.slice(0, -10); if (name.endsWith('wikiversity')) return 'v:' + name.slice(0, -11); if (name.endsWith('wiktionary')) return 'wikt:' + name.slice(0, -10); if (name.endsWith('wikivoyage')) return 'voy:' + name.slice(0, -10); if (name.endsWith('wikibooks')) return 'b:' + name.slice(0, -9); if (name.endsWith('wikiquote')) return 'q:' + name.slice(0, -9); if (name.endsWith('wikinews')) return 'n:' + name.slice(0, -8); // Format links for local Wikimedia chapters if (name.endsWith('wikimedia')) { return 'wm' + name.slice(0, -9); } // Create a Wikipedia link for standard project names if (name.endsWith('wiki')) { return 'w:' + name.slice(0, -4); } return 'w:' + name; } // Turn different API formats into a clean list of groups const extractGroups = (data) => { if (!data) return []; var res = []; // Handle data whether it is already a list, an object, or just text if (Array.isArray(data)) { res = data; } else if (typeof data === 'object') { res = Object.values(data); } else if (typeof data === 'string') { res = data.split(',').map(function(s) { return s.trim(); }); } // Normalize names so "Check User" becomes "checkuser" for easy comparison return res.map(function(g) { if (typeof g !== 'string') return g; return g.replace(/\s+/g, '').toLowerCase(); }); }; async function robustCall(api, params) { let retries = 0; const maxRetries = 3; while (retries < maxRetries) { try { // Try to get data from the server return await api.get(params); } catch (err) { // If we get a "too many requests" error if (err?.status === 429) { retries++; // See how long the server wants us to wait const waitTime = parseInt(err.xhr?.getResponseHeader('Retry-After')) || (30 * retries); // Update the UI so the user knows we are waiting $('#status-msg').html( `<span style="color:orange; font-weight:bold;">Server is busy! Waiting ${waitTime}s...</span>` ); await sleep(waitTime * 1000); } else { // Stop if it is a different kind of error throw err; } } } // Give up after 3 tries throw new Error("Failed to reach API after multiple attempts"); } // Ensure all required MediaWiki modules are ready before starting mw.loader.using(['mediawiki.api', 'mediawiki.ForeignApi']).then(async function() { // Let the user know the script is preparing the wiki database $('#mw-content-text').html('<strong>GlobalCheckUserList.js: Loading wiki map...</strong>'); // Build the database map (dbname -> URL) for all projects globalWikiMap = await loadGlobalWikiMap(); // Establish a connection to Meta-Wiki for global rights lookups const metaApi = new mw.ForeignApi('https://meta.wikimedia.org/w/api.php'); // State variables to control the script execution and filtering let isRunning = false; let currentFilterMode = 'all'; // Build and display the script interface function setupUI() { $('#firstHeading').text('GlobalCheckUserList'); // Main container for the tool interface $('#mw-content-text').empty().append(` <div style="border:1px solid #a2a9b1; padding:15px; background:#f8f9fa;"> <p>Audits current CheckUsers across Wikimedia projects. Reports are grouped into one single table.</p> <div style="margin-bottom:10px; display:flex; align-items:center; gap:20px; font-size:13px;"> <strong>Wiki Filter:</strong> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-all" checked> All</label> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-localcu"> Local CU Wikis</label> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-only"> Only these</label> <span id="wiki-help-trigger" style="cursor:help; background:#36c; color:#fff; border-radius:50%; width:18px; height:18px; display:inline-block; text-align:center; font-weight:bold;" title="Show available DB names">?</span> </div> <div id="filter-input-container" style="display:none; margin-bottom:15px;"> <input id="wiki-filter" type="text" style="width:100%;" placeholder="dbname1, dbname2..."> </div> <div id="wiki-list-help" style="display:none; margin-bottom:10px; padding:10px; background:#fff; border:1px solid #a2a9b1; font-size:11px; max-height:120px; overflow-y:auto; font-family:monospace;"> <strong>Available database names:</strong><br>${Object.keys(globalWikiMap).sort().join(', ')} </div> <div style="margin-top:20px;"> <button id="start" class="mw-ui-button mw-ui-progressive">Run Audit</button> <button id="stop" class="mw-ui-button mw-ui-destructive" disabled>Stop</button> </div> <div id="status-msg" style="margin-top:10px; font-weight:bold; color:#0056b3;">Ready.</div> <div style="margin-top:5px;"> <progress id="bar" value="0" max="${Object.keys(globalWikiMap).length}" style="width:100%"></progress> </div> <div id="output-container" style="display:none; margin-top:15px;"> <strong>Wikitext Report:</strong> <textarea id="out" style="width:100%; height:450px; font-family:monospace; font-size:11px; padding:5px; border:1px solid #c8ccd1;"></textarea> </div> </div> `); // Manage filter visibility based on user selection $('#btn-all').click(function() { currentFilterMode = 'all'; $('#filter-input-container').hide(); }); $('#btn-localcu').click(function() { currentFilterMode = 'localcu'; $('#filter-input-container').hide(); }); $('#btn-only').click(function() { currentFilterMode = 'include'; $('#filter-input-container').show().focus(); }); // Interaction logic for help and script control $('#wiki-help-trigger').click(function() { $('#wiki-list-help').toggle(); }); $('#start').click(function() { runAudit(); }); $('#stop').click(function() { isRunning = false; }); } async function findGrantDate(user, db, localApi) { // 0. Check manual override list first const key = user + "@" + db; if (customGrantDates[key]) return customGrantDates[key]; // Helper for the actual log searching logic async function searchLog(targetUser) { // Phase 1: Meta (steward) let mPars = { action: 'query', list: 'logevents', letype: 'rights', letitle: 'User:' + targetUser + '@' + db, ledir: 'newer', lelimit: 'max', formatversion: 2 }; let resM = await robustCall(metaApi, mPars); let logsM = (resM.query && resM.query.logevents) || []; for (let ev of logsM) { let p = ev.params || {}; let nG = extractGroups(p.newgroups || p.add || p[1] || p["1"]); let oG = extractGroups(p.oldgroups || p.remove || p[0] || p["0"]); if (nG.indexOf('checkuser') !== -1 && oG.indexOf('checkuser') === -1) return ev.timestamp.substring(0, 10); } // Phase 2: Local (bureaucrat) let lPars = { action: 'query', list: 'logevents', letype: 'rights', letitle: 'User:' + targetUser, ledir: 'newer', lelimit: 'max', formatversion: 2 }; let resL = await robustCall(localApi, lPars); let logsL = (resL.query && resL.query.logevents) || []; for (let ev of logsL) { let p = ev.params || {}; let nG = extractGroups(p.newgroups || p.add || p[1] || p["1"]); let oG = extractGroups(p.oldgroups || p.remove || p[0] || p["0"]); if (nG.indexOf('checkuser') !== -1 && oG.indexOf('checkuser') === -1) return ev.timestamp.substring(0, 10); } return null; } let date = await searchLog(user); return date || "Unknown"; } // Main execution function that iterates through wikis and collects CU data async function runAudit() { isRunning = true; let wt = ""; // 1. MUST BE DEFINED HERE to be available for the table header reference below const adminTypes = [ 'block', 'delete', 'protect', 'rights', 'merge', 'abusefilter', 'contentmodel', 'import', 'managetags', 'massmessage', 'checkuser-temporary-account', 'ipinfo', 'pagelang', 'renameuser', 'stable', 'gblblock', 'abusefilter-protected-vars' ]; const cuInPublicTypes = ['abusefilterprivatedetails']; $('#start').prop('disabled', true); $('#stop').prop('disabled', false); $('#out').val('').show(); $('#output-container').show(); $('#status-msg').text('Waiting for queue lock...').css("color", "orange"); // Use a browser lock to prevent multiple instances from running at once await navigator.locks.request('global_cu_list_lock', async () => { const ts = new Date().toISOString().replace('T', ' ').substring(0, 16) + ' (UTC)'; wt = "== Global CheckUser List ==\n"; wt += "''Report generated on: " + ts + "<br />\n"; wt += "Generated with [[testwiki:User:MrJaroslavik/GlobalCheckUserList.js|GlobalCheckUserList.js]]''\n"; // Parse user filters before starting the loop const filterText = $('#wiki-filter').val().trim().toLowerCase(); const filterList = filterText ? filterText.split(',').map(function(s) { return s.trim(); }).filter(function(s) { return s !== ""; }) : []; // Add filter metadata to the report header if (currentFilterMode === 'localcu') { wt += "<br />''Filter applied: Wikis with local CheckUser communities''\n"; } else if (currentFilterMode === 'include' && filterList.length > 0) { wt += "<br />''Filter applied: Only these wikis (" + filterList.join(', ') + ")''\n"; } wt += "\n"; // Build the table header with sortable columns and clean technical references wt += '{| class="wikitable sortable" style="font-size:90%; width:100%;"\n' + '! User !! CU Since !! Duration !! Last CU Action<ref>Logs: checkuserlog, checkuser-temporary-account, abusefilterprivatedetails</ref> !! ' + 'Last Admin Action<ref>Logs: ' + adminTypes.join(', ') + '</ref> !! ' + 'Last OS Action<ref>Logs: suppress</ref> !! ' + 'Last Logged Action<ref>Logs: all public logged actions</ref> !! Last Edit\n'; const allWikis = Object.keys(globalWikiMap); let wikisToScan; // Determine which wikis to audit based on the chosen filter mode if (currentFilterMode === 'include' && filterList.length > 0) { wikisToScan = allWikis.filter(function(w) { return filterList.indexOf(w) !== -1; }); } else if (currentFilterMode === 'localcu') { wikisToScan = allWikis.filter(function(w) { return localCUWikis.indexOf(w) !== -1; }); } else { wikisToScan = allWikis; } $('#bar').attr('max', wikisToScan.length).val(0); // Primary loop: audit each selected wiki one by one for (let i = 0; i < wikisToScan.length; i++) { if (!isRunning) break; const db = wikisToScan[i]; $('#status-msg').text('Auditing ' + db + ' (' + (i + 1) + '/' + wikisToScan.length + ')...').css("color", "#0056b3"); try { const wikiUrl = globalWikiMap[db]; const localApi = new mw.ForeignApi(wikiUrl + '/w/api.php'); // Fetch all users with 'checkuser' rights on this specific wiki let users = [], auDone = false, auCont = null; while (!auDone && isRunning) { let auPars = { action: 'query', list: 'allusers', augroup: 'checkuser', auprop: 'groups', aulimit: 'max', formatversion: 2 }; if (auCont) Object.assign(auPars, auCont); let res = await robustCall(localApi, auPars); users = users.concat(res.query.allusers || []); if (res.continue) auCont = res.continue; else auDone = true; } // Only add the wiki section to the report if checkusers were found if (users.length > 0) { const iw = getInterwikiPrefix(db); wt += '|-\n! colspan="8" style="background:#eaecf0; text-align:center;" | ' + '[[' + iw + ':|' + db + ']] — [[' + iw + ':Special:ListUsers/checkuser|(list)]] — [[' + iw + ':Special:CheckUserLog|(log)]]\n'; for (const u of users) { const username = u.name; // ZDE JE OPRAVA: Volání funkce pro získání data const sinceDate = await findGrantDate(username, db, localApi); // Determine when the user first received their CU rights let days = "-"; if (sinceDate && sinceDate !== "Unknown") { // Vezmeme jen prvních 10 znaků (YYYY-MM-DD), aby new Date() fungovalo const cleanDate = sinceDate.substring(0, 10); const diff = new Date() - new Date(cleanDate); days = Math.floor(diff / 86400000) + "d"; } // Fetch internal CU log (private) const cuLog = await robustCall(localApi, { action: 'query', list: 'checkuserlog', culuser: username, cullimit: 1, formatversion: 2 }); let lastCU = (cuLog.query && cuLog.query.checkuserlog && cuLog.query.checkuserlog.entries && cuLog.query.checkuserlog.entries[0]) ? cuLog.query.checkuserlog.entries[0].timestamp.substring(0, 10) : "Never"; // Fetch all public logs for this user const allUserLogsReq = await robustCall(localApi, { action: 'query', list: 'logevents', leuser: username, lelimit: 'max', formatversion: 2 }); const allUserLogs = (allUserLogsReq.query && allUserLogsReq.query.logevents) || []; // CROSS-CHECK: Look for CU actions that leak into public logs (like abusefilterprivatedetails) const pubCUEvt = allUserLogs.find(function(ev) { return cuInPublicTypes.indexOf(ev.type) !== -1; }); if (pubCUEvt) { const pubCUTs = pubCUEvt.timestamp.substring(0, 10); if (lastCU === "Never" || pubCUTs > lastCU) lastCU = pubCUTs; } // Identify the last administrative action from our comprehensive list const admEvent = allUserLogs.find(function(ev) { return adminTypes.indexOf(ev.type) !== -1; }); const lastAdm = admEvent ? admEvent.timestamp.substring(0, 10) : "Never"; // Get the timestamp of the very last logged action of any kind const lastGen = allUserLogs.length > 0 ? allUserLogs[0].timestamp.substring(0, 10) : "Never"; // Specifically look for Oversight/Suppression actions const osLog = await robustCall(localApi, { action: 'query', list: 'logevents', leuser: username, letype: 'suppress', lelimit: 1, formatversion: 2 }); let lastOS = "-"; if (osLog.query && osLog.query.logevents && osLog.query.logevents.length > 0) { lastOS = osLog.query.logevents[0].timestamp.substring(0, 10); } else { // Check if the user even has Oversight rights to begin with var uGroups = extractGroups(u.groups); if (uGroups.indexOf('suppress') !== -1 || uGroups.indexOf('oversight') !== -1) { lastOS = "Never"; } } // Check the date of the user's last actual edit const edLog = await robustCall(localApi, { action: 'query', list: 'usercontribs', ucuser: username, uclimit: 1, formatversion: 2 }); const lastEdit = (edLog.query && edLog.query.usercontribs && edLog.query.usercontribs[0]) ? edLog.query.usercontribs[0].timestamp.substring(0, 10) : "Never"; // Append the gathered data as a new row in the wikitext table wt += '|-\n| style="text-align:left; white-space:nowrap;" | [[' + iw + ':Special:Log/' + username + '|' + username + '@' + db + ']] || ' + sinceDate + ' || ' + days + ' || ' + lastCU + ' || ' + lastAdm + ' || ' + lastOS + ' || ' + lastGen + ' || ' + lastEdit + '\n'; } } } catch (err) { console.error('Failed to audit ' + db, err); } // Update progress bar $('#bar').val(i + 1); await sleep(DELAY_MS); } // Finalize the table and display the result wt += '}\n\n=== References ===\n<references />\n'; $('#out').val(wt); $('#output-container').show(); $('#status-msg').text('Audit complete!').css("color", "green"); $('#start').prop('disabled', false); $('#stop').prop('disabled', true); }); } setupUI(); }); })(); g3mpzq2w1d258d96e91sqwhcu6qfwd5 739117 739114 2026-04-22T19:31:37Z MrJaroslavik 44012 | 739117 javascript text/javascript // GlobalCheckUserList.js // ------------------------------------------------------- // Features: // - Global Audit: Scans current CheckUsers across 800+ projects. // - Full Pagination: Bypasses API limits for user lists and history logs. // - Deep Rights Discovery: Checks Meta (steward) and Local (bureaucrat) logs for the grant date. // - Single Table: Unified wikitext output in one sortable table. // - Navigation: Nicknames link to local logs; headers link to project, list, and CU log. // - Stable: Handles 429 rate limits and uses Cross-Tab locking. // - Compatibility: No optional chaining (?.) for MediaWiki editor support. // - Created with help of Gemini 3. // ------------------------------------------------------- (function() { 'use strict'; // Run only on Special:BlankPage/GlobalCheckUserList const isBlankPage = mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage'; const isOurScript = mw.config.get('wgTitle').includes('GlobalCheckUserList'); if (!isBlankPage || !isOurScript) return; let globalWikiMap = {}; // List of wikis where CheckUser extension is disabled - https://noc.wikimedia.org/conf/highlight.php?file=dblists/checkuser-disabled.dblist const disabledCUWikis = [ 'aawikibooks', 'abwiktionary', 'advisorywiki', 'akwiktionary', 'angwikiquote', 'angwikisource', 'astwikibooks', 'astwikiquote', 'aswikibooks', 'aswiktionary', 'avwiktionary', 'aywikibooks', 'bhwiktionary', 'biwikibooks', 'biwiktionary', 'bmwikibooks', 'bmwikiquote', 'bmwiktionary', 'bowiktionary', 'chwikibooks', 'chwiktionary', 'cnwikimedia', 'crwikiquote', 'crwiktionary', 'dzwiktionary', 'gawikibooks', 'gnwikibooks', 'gotwikibooks', 'guwikibooks', 'htwikisource', 'huwikinews', 'hzwiki', 'iewikibooks', 'iiwiki', 'internalwiki', 'kjwiki', 'kkwikiquote', 'knwikibooks', 'krwiki', 'krwikiquote', 'kswikibooks', 'kswikiquote', 'kwwikiquote', 'lbwikibooks', 'lbwikiquote', 'lnwikibooks', 'lvwikibooks', 'mhwiktionary', 'mnwikibooks', 'muswiki', 'nahwikibooks', 'nawikibooks', 'nawikiquote', 'ndswikibooks', 'ndswikiquote', 'piwiktionary', 'pswikibooks', 'quwikibooks', 'quwikiquote', 'rmwikibooks', 'rmwiktionary', 'rnwiktionary', 'scwiktionary', 'searchcomwiki', 'snwiktionary', 'spcomwiki', 'swwikibooks', 'thwikinews', 'tkwikibooks', 'tkwikiquote', 'towiktionary', 'transitionteamwiki', 'trwikinews', 'ttwikiquote', 'twwiktionary', 'ugwikibooks', 'ugwikiquote', 'vowikibooks', 'vowikiquote', 'wawikibooks', 'wikimania2005wiki', 'wikimania2006wiki', 'wikimania2007wiki', 'wikimania2009wiki', 'wikimania2015wiki', 'wowikiquote', 'xhwikibooks', 'xhwiktionary', 'yowikibooks', 'yowiktionary', 'zawikibooks', 'zawikiquote', 'zawiktionary', 'zh_min_nanwikibooks', 'zuwikibooks' ]; // Targeted list of projects known to have active local CheckUsers - https://meta.wikimedia.org/wiki/CheckUser_policy/Users_with_CheckUser_access const localCUWikis = [ 'arwiki', 'bnwiki', 'cawiki', 'cswiki', 'dawiki', 'nlwiki', 'enwikibooks', 'enwiki', 'enwikivoyage', 'enwiktionary', 'fiwiki', 'frwiki', 'dewiki', 'hewiki', 'huwiki', 'idwiki', 'itwiki', 'jawiki', 'kowiki', 'fawiki', 'plwiki', 'ptwiki', 'ruwiki', 'srwiki', 'simplewiki', 'slwiki', 'eswiki', 'svwiki', 'thwiki', 'trwiki', 'ukwiki', 'viwiki', 'commonswiki', 'specieswiki', 'metawiki', 'wikidatawiki' ]; // Manual overrides for Unknown dates // Format: "Username@dbname": "YYYY-MM-DD" const customGrantDates = { "RiazACU@bnwiki": "2022-05-13", "Example@cswiki": "2010-01-01" }; // Fetch all wikis and filter out the ones we cannot or should not scan function loadGlobalWikiMap() { const api = new mw.Api(); return api.get({ action: 'sitematrix', format: 'json', smtype: 'language|special', smlangprop: 'site', smsiteprop: 'dbname|url', formatversion: 2, origin: '*' }).then(function(data) { const matrix = data.sitematrix; const wikiMap = {}; Object.keys(matrix).forEach(key => { const entry = matrix[key]; if (entry.site && Array.isArray(entry.site)) { entry.site.forEach(site => { if (site.private || site.fishbowl || disabledCUWikis.indexOf(site.dbname) !== -1) return; wikiMap[site.dbname] = site.url; }); } }); if (matrix.specials && Array.isArray(matrix.specials)) { matrix.specials.forEach(special => { if (special.private || special.fishbowl || disabledCUWikis.indexOf(special.dbname) !== -1) return; wikiMap[special.dbname] = special.url; }); } return wikiMap; }); } const DELAY_MS = 500; const sleep = ms => new Promise(r => setTimeout(r, ms)); // Convert database names to short codes for linking function getInterwikiPrefix(db) { // Map special projects and specific language codes const specialMap = { 'commonswiki': 'c', 'metawiki': 'm', 'wikidatawiki': 'd', 'wikifunctionswiki': 'f', 'mediawikiwiki': 'mw', 'specieswiki': 'species', 'sourceswiki': 'oldwikisource', 'foundationwiki': 'foundation', 'incubatorwiki': 'incubator', 'outreachwiki': 'outreach', 'betawikiversity': 'betawikiversity', 'be_x_oldwiki': 'be-tarask', 'zh_classicalwiki': 'lzh', 'zh_min_nanwiki': 'nan', 'zh_yuewiki': 'yue' }; if (specialMap[db]) return specialMap[db]; const name = db.replace(/_/g, '-'); // Map project types like Wikibooks or Wiktionary to short prefixes if (name.endsWith('wikisource')) return 's:' + name.slice(0, -10); if (name.endsWith('wikiversity')) return 'v:' + name.slice(0, -11); if (name.endsWith('wiktionary')) return 'wikt:' + name.slice(0, -10); if (name.endsWith('wikivoyage')) return 'voy:' + name.slice(0, -10); if (name.endsWith('wikibooks')) return 'b:' + name.slice(0, -9); if (name.endsWith('wikiquote')) return 'q:' + name.slice(0, -9); if (name.endsWith('wikinews')) return 'n:' + name.slice(0, -8); // Format links for local Wikimedia chapters if (name.endsWith('wikimedia')) { return 'wm' + name.slice(0, -9); } // Create a Wikipedia link for standard project names if (name.endsWith('wiki')) { return 'w:' + name.slice(0, -4); } return 'w:' + name; } // Turn different API formats into a clean list of groups const extractGroups = (data) => { if (!data) return []; var res = []; // Handle data whether it is already a list, an object, or just text if (Array.isArray(data)) { res = data; } else if (typeof data === 'object') { res = Object.values(data); } else if (typeof data === 'string') { res = data.split(',').map(function(s) { return s.trim(); }); } // Normalize names so "Check User" becomes "checkuser" for easy comparison return res.map(function(g) { if (typeof g !== 'string') return g; return g.replace(/\s+/g, '').toLowerCase(); }); }; async function robustCall(api, params) { let retries = 0; const maxRetries = 3; while (retries < maxRetries) { try { // Try to get data from the server return await api.get(params); } catch (err) { // If we get a "too many requests" error if (err?.status === 429) { retries++; // See how long the server wants us to wait const waitTime = parseInt(err.xhr?.getResponseHeader('Retry-After')) || (30 * retries); // Update the UI so the user knows we are waiting $('#status-msg').html( `<span style="color:orange; font-weight:bold;">Server is busy! Waiting ${waitTime}s...</span>` ); await sleep(waitTime * 1000); } else { // Stop if it is a different kind of error throw err; } } } // Give up after 3 tries throw new Error("Failed to reach API after multiple attempts"); } // Ensure all required MediaWiki modules are ready before starting mw.loader.using(['mediawiki.api', 'mediawiki.ForeignApi']).then(async function() { // Let the user know the script is preparing the wiki database $('#mw-content-text').html('<strong>GlobalCheckUserList.js: Loading wiki map...</strong>'); // Build the database map (dbname -> URL) for all projects globalWikiMap = await loadGlobalWikiMap(); // Establish a connection to Meta-Wiki for global rights lookups const metaApi = new mw.ForeignApi('https://meta.wikimedia.org/w/api.php'); // State variables to control the script execution and filtering let isRunning = false; let currentFilterMode = 'all'; // Build and display the script interface function setupUI() { $('#firstHeading').text('GlobalCheckUserList'); // Main container for the tool interface $('#mw-content-text').empty().append(` <div style="border:1px solid #a2a9b1; padding:15px; background:#f8f9fa;"> <p>Audits current CheckUsers across Wikimedia projects. Reports are grouped into one single table.</p> <div style="margin-bottom:10px; display:flex; align-items:center; gap:20px; font-size:13px;"> <strong>Wiki Filter:</strong> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-all" checked> All</label> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-localcu"> Local CU Wikis</label> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-only"> Only these</label> <span id="wiki-help-trigger" style="cursor:help; background:#36c; color:#fff; border-radius:50%; width:18px; height:18px; display:inline-block; text-align:center; font-weight:bold;" title="Show available DB names">?</span> </div> <div id="filter-input-container" style="display:none; margin-bottom:15px;"> <input id="wiki-filter" type="text" style="width:100%;" placeholder="dbname1, dbname2..."> </div> <div id="wiki-list-help" style="display:none; margin-bottom:10px; padding:10px; background:#fff; border:1px solid #a2a9b1; font-size:11px; max-height:120px; overflow-y:auto; font-family:monospace;"> <strong>Available database names:</strong><br>${Object.keys(globalWikiMap).sort().join(', ')} </div> <div style="margin-top:20px;"> <button id="start" class="mw-ui-button mw-ui-progressive">Run Audit</button> <button id="stop" class="mw-ui-button mw-ui-destructive" disabled>Stop</button> </div> <div id="status-msg" style="margin-top:10px; font-weight:bold; color:#0056b3;">Ready.</div> <div style="margin-top:5px;"> <progress id="bar" value="0" max="${Object.keys(globalWikiMap).length}" style="width:100%"></progress> </div> <div id="output-container" style="display:none; margin-top:15px;"> <strong>Wikitext Report:</strong> <textarea id="out" style="width:100%; height:450px; font-family:monospace; font-size:11px; padding:5px; border:1px solid #c8ccd1;"></textarea> </div> </div> `); // Manage filter visibility based on user selection $('#btn-all').click(function() { currentFilterMode = 'all'; $('#filter-input-container').hide(); }); $('#btn-localcu').click(function() { currentFilterMode = 'localcu'; $('#filter-input-container').hide(); }); $('#btn-only').click(function() { currentFilterMode = 'include'; $('#filter-input-container').show().focus(); }); // Interaction logic for help and script control $('#wiki-help-trigger').click(function() { $('#wiki-list-help').toggle(); }); $('#start').click(function() { runAudit(); }); $('#stop').click(function() { isRunning = false; }); } async function findGrantDate(user, db, localApi) { // 0. Check manual override list first const key = user + "@" + db; if (customGrantDates[key]) return customGrantDates[key]; // Helper for the actual log searching logic async function searchLog(targetUser) { // Phase 1: Meta (steward) let mPars = { action: 'query', list: 'logevents', letype: 'rights', letitle: 'User:' + targetUser + '@' + db, ledir: 'newer', lelimit: 'max', formatversion: 2 }; let resM = await robustCall(metaApi, mPars); let logsM = (resM.query && resM.query.logevents) || []; for (let ev of logsM) { let p = ev.params || {}; let nG = extractGroups(p.newgroups || p.add || p[1] || p["1"]); let oG = extractGroups(p.oldgroups || p.remove || p[0] || p["0"]); if (nG.indexOf('checkuser') !== -1 && oG.indexOf('checkuser') === -1) return ev.timestamp.substring(0, 10); } // Phase 2: Local (bureaucrat) let lPars = { action: 'query', list: 'logevents', letype: 'rights', letitle: 'User:' + targetUser, ledir: 'newer', lelimit: 'max', formatversion: 2 }; let resL = await robustCall(localApi, lPars); let logsL = (resL.query && resL.query.logevents) || []; for (let ev of logsL) { let p = ev.params || {}; let nG = extractGroups(p.newgroups || p.add || p[1] || p["1"]); let oG = extractGroups(p.oldgroups || p.remove || p[0] || p["0"]); if (nG.indexOf('checkuser') !== -1 && oG.indexOf('checkuser') === -1) return ev.timestamp.substring(0, 10); } return null; } let date = await searchLog(user); return date || "Unknown"; } // Main execution function that iterates through wikis and collects CU data async function runAudit() { isRunning = true; let wt = ""; // 1. MUST BE DEFINED HERE to be available for the table header reference below const adminTypes = [ 'block', 'delete', 'protect', 'rights', 'merge', 'abusefilter', 'contentmodel', 'import', 'managetags', 'massmessage', 'checkuser-temporary-account', 'ipinfo', 'pagelang', 'renameuser', 'stable', 'gblblock', 'abusefilter-protected-vars' ]; const cuInPublicTypes = ['abusefilterprivatedetails']; $('#start').prop('disabled', true); $('#stop').prop('disabled', false); $('#out').val('').show(); $('#output-container').show(); $('#status-msg').text('Waiting for queue lock...').css("color", "orange"); // Use a browser lock to prevent multiple instances from running at once await navigator.locks.request('global_cu_list_lock', async () => { const ts = new Date().toISOString().replace('T', ' ').substring(0, 16) + ' (UTC)'; wt = "== Global CheckUser List ==\n"; wt += "''Report generated on: " + ts + "<br />\n"; wt += "Generated with [[testwiki:User:MrJaroslavik/GlobalCheckUserList.js|GlobalCheckUserList.js]]''\n"; // Parse user filters before starting the loop const filterText = $('#wiki-filter').val().trim().toLowerCase(); const filterList = filterText ? filterText.split(',').map(function(s) { return s.trim(); }).filter(function(s) { return s !== ""; }) : []; // Add filter metadata to the report header if (currentFilterMode === 'localcu') { wt += "<br />''Filter applied: Wikis with local CheckUser communities''\n"; } else if (currentFilterMode === 'include' && filterList.length > 0) { wt += "<br />''Filter applied: Only these wikis (" + filterList.join(', ') + ")''\n"; } wt += "\n"; // Build the table header with sortable columns and clean technical references wt += '{| class="wikitable sortable" style="font-size:90%; width:100%;"\n' + '! User !! CU Since !! Duration !! Last CU Action<ref>Logs: checkuserlog, checkuser-temporary-account, abusefilterprivatedetails</ref> !! ' + 'Last Admin Action<ref>Logs: ' + adminTypes.join(', ') + '</ref> !! ' + 'Last OS Action<ref>Logs: suppress</ref> !! ' + 'Last Logged Action<ref>Logs: all public logged actions</ref> !! Last Edit\n'; const allWikis = Object.keys(globalWikiMap); let wikisToScan; // Determine which wikis to audit based on the chosen filter mode if (currentFilterMode === 'include' && filterList.length > 0) { wikisToScan = allWikis.filter(function(w) { return filterList.indexOf(w) !== -1; }); } else if (currentFilterMode === 'localcu') { wikisToScan = allWikis.filter(function(w) { return localCUWikis.indexOf(w) !== -1; }); } else { wikisToScan = allWikis; } $('#bar').attr('max', wikisToScan.length).val(0); // Primary loop: audit each selected wiki one by one for (let i = 0; i < wikisToScan.length; i++) { if (!isRunning) break; const db = wikisToScan[i]; $('#status-msg').text('Auditing ' + db + ' (' + (i + 1) + '/' + wikisToScan.length + ')...').css("color", "#0056b3"); try { const wikiUrl = globalWikiMap[db]; const localApi = new mw.ForeignApi(wikiUrl + '/w/api.php'); // Fetch all users with 'checkuser' rights on this specific wiki let users = [], auDone = false, auCont = null; while (!auDone && isRunning) { let auPars = { action: 'query', list: 'allusers', augroup: 'checkuser', auprop: 'groups', aulimit: 'max', formatversion: 2 }; if (auCont) Object.assign(auPars, auCont); let res = await robustCall(localApi, auPars); users = users.concat(res.query.allusers || []); if (res.continue) auCont = res.continue; else auDone = true; } // Only add the wiki section to the report if checkusers were found if (users.length > 0) { const iw = getInterwikiPrefix(db); wt += '|-\n! colspan="8" style="background:#eaecf0; text-align:center;" | ' + '[[' + iw + ':|' + db + ']] — [[' + iw + ':Special:ListUsers/checkuser|(list)]] — [[' + iw + ':Special:CheckUserLog|(log)]]\n'; for (const u of users) { const username = u.name; // ZDE JE OPRAVA: Volání funkce pro získání data const sinceDate = await findGrantDate(username, db, localApi); // Determine when the user first received their CU rights let days = "-"; if (sinceDate && sinceDate !== "Unknown") { // Vezmeme jen prvních 10 znaků (YYYY-MM-DD), aby new Date() fungovalo const cleanDate = sinceDate.substring(0, 10); const diff = new Date() - new Date(cleanDate); days = Math.floor(diff / 86400000) + "d"; } // Fetch internal CU log (private) const cuLog = await robustCall(localApi, { action: 'query', list: 'checkuserlog', culuser: username, cullimit: 1, formatversion: 2 }); let lastCU = (cuLog.query && cuLog.query.checkuserlog && cuLog.query.checkuserlog.entries && cuLog.query.checkuserlog.entries[0]) ? cuLog.query.checkuserlog.entries[0].timestamp.substring(0, 10) : "Never"; // Fetch all public logs for this user const allUserLogsReq = await robustCall(localApi, { action: 'query', list: 'logevents', leuser: username, lelimit: 'max', formatversion: 2 }); const allUserLogs = (allUserLogsReq.query && allUserLogsReq.query.logevents) || []; // CROSS-CHECK: Look for CU actions that leak into public logs (like abusefilterprivatedetails) const pubCUEvt = allUserLogs.find(function(ev) { return cuInPublicTypes.indexOf(ev.type) !== -1; }); if (pubCUEvt) { const pubCUTs = pubCUEvt.timestamp.substring(0, 10); if (lastCU === "Never" || pubCUTs > lastCU) lastCU = pubCUTs; } // Identify the last administrative action from our comprehensive list const admEvent = allUserLogs.find(function(ev) { return adminTypes.indexOf(ev.type) !== -1; }); const lastAdm = admEvent ? admEvent.timestamp.substring(0, 10) : "Never"; // Get the timestamp of the very last logged action of any kind const lastGen = allUserLogs.length > 0 ? allUserLogs[0].timestamp.substring(0, 10) : "Never"; // Specifically look for Oversight/Suppression actions const osLog = await robustCall(localApi, { action: 'query', list: 'logevents', leuser: username, letype: 'suppress', lelimit: 1, formatversion: 2 }); let lastOS = "-"; if (osLog.query && osLog.query.logevents && osLog.query.logevents.length > 0) { lastOS = osLog.query.logevents[0].timestamp.substring(0, 10); } else { // Check if the user even has Oversight rights to begin with var uGroups = extractGroups(u.groups); if (uGroups.indexOf('suppress') !== -1 || uGroups.indexOf('oversight') !== -1) { lastOS = "Never"; } } // Check the date of the user's last actual edit const edLog = await robustCall(localApi, { action: 'query', list: 'usercontribs', ucuser: username, uclimit: 1, formatversion: 2 }); const lastEdit = (edLog.query && edLog.query.usercontribs && edLog.query.usercontribs[0]) ? edLog.query.usercontribs[0].timestamp.substring(0, 10) : "Never"; // Append the gathered data as a new row in the wikitext table wt += '|-\n| style="text-align:left; white-space:nowrap;" | [[' + iw + ':Special:Log/' + username + '|' + username + '@' + db + ']] || ' + sinceDate + ' || ' + days + ' || ' + lastCU + ' || ' + lastAdm + ' || ' + lastOS + ' || ' + lastGen + ' || ' + lastEdit + '\n'; } } } catch (err) { console.error('Failed to audit ' + db, err); } // Update progress bar $('#bar').val(i + 1); await sleep(DELAY_MS); } // Finalize the table and display the result wt += '|}\n\n=== References ===\n<references />\n'; $('#out').val(wt); $('#output-container').show(); $('#status-msg').text('Audit complete!').css("color", "green"); $('#start').prop('disabled', false); $('#stop').prop('disabled', true); }); } setupUI(); }); })(); rpz3dvqyf1zav9r5k153evp5qh08o0j 739118 739117 2026-04-22T19:36:51Z MrJaroslavik 44012 739118 javascript text/javascript // GlobalCheckUserList.js // ------------------------------------------------------- // Features: // - Scans current CheckUsers across 800+ projects. // - Bypasses API limits for user lists and history logs. // - Checks Meta (steward) and Local (bureaucrat) logs for the grant date. // - Single Table: Unified wikitext output in one sortable table. // - Navigation: Nicknames link to local logs; headers link to project, list, and CU log. // - Compatibility: No optional chaining (?.) for MediaWiki editor support. // - Created with help of Gemini 3. // ------------------------------------------------------- (function() { 'use strict'; // Run only on Special:BlankPage/GlobalCheckUserList const isBlankPage = mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage'; const isOurScript = mw.config.get('wgTitle').includes('GlobalCheckUserList'); if (!isBlankPage || !isOurScript) return; let globalWikiMap = {}; // // List of wikis where CheckUser extension is disabled - https://noc.wikimedia.org/conf/highlight.php?file=dblists/checkuser-disabled.dblist const disabledCUWikis = [ 'aawikibooks', 'abwiktionary', 'advisorywiki', 'akwiktionary', 'angwikiquote', 'angwikisource', 'astwikibooks', 'astwikiquote', 'aswikibooks', 'aswiktionary', 'avwiktionary', 'aywikibooks', 'bhwiktionary', 'biwikibooks', 'biwiktionary', 'bmwikibooks', 'bmwikiquote', 'bmwiktionary', 'bowiktionary', 'chwikibooks', 'chwiktionary', 'cnwikimedia', 'crwikiquote', 'crwiktionary', 'dzwiktionary', 'gawikibooks', 'gnwikibooks', 'gotwikibooks', 'guwikibooks', 'htwikisource', 'huwikinews', 'hzwiki', 'iewikibooks', 'iiwiki', 'internalwiki', 'kjwiki', 'kkwikiquote', 'knwikibooks', 'krwiki', 'krwikiquote', 'kswikibooks', 'kswikiquote', 'kwwikiquote', 'lbwikibooks', 'lbwikiquote', 'lnwikibooks', 'lvwikibooks', 'mhwiktionary', 'mnwikibooks', 'muswiki', 'nahwikibooks', 'nawikibooks', 'nawikiquote', 'ndswikibooks', 'ndswikiquote', 'piwiktionary', 'pswikibooks', 'quwikibooks', 'quwikiquote', 'rmwikibooks', 'rmwiktionary', 'rnwiktionary', 'scwiktionary', 'searchcomwiki', 'snwiktionary', 'spcomwiki', 'swwikibooks', 'thwikinews', 'tkwikibooks', 'tkwikiquote', 'towiktionary', 'transitionteamwiki', 'trwikinews', 'ttwikiquote', 'twwiktionary', 'ugwikibooks', 'ugwikiquote', 'vowikibooks', 'vowikiquote', 'wawikibooks', 'wikimania2005wiki', 'wikimania2006wiki', 'wikimania2007wiki', 'wikimania2009wiki', 'wikimania2015wiki', 'wowikiquote', 'xhwikibooks', 'xhwiktionary', 'yowikibooks', 'yowiktionary', 'zawikibooks', 'zawikiquote', 'zawiktionary', 'zh_min_nanwikibooks', 'zuwikibooks' ]; // Projects known to have local CheckUsers - https://meta.wikimedia.org/wiki/CheckUser_policy/Users_with_CheckUser_access const localCUWikis = [ 'arwiki', 'bnwiki', 'cawiki', 'cswiki', 'dawiki', 'nlwiki', 'enwikibooks', 'enwiki', 'enwikivoyage', 'enwiktionary', 'fiwiki', 'frwiki', 'dewiki', 'hewiki', 'huwiki', 'idwiki', 'itwiki', 'jawiki', 'kowiki', 'fawiki', 'plwiki', 'ptwiki', 'ruwiki', 'srwiki', 'simplewiki', 'slwiki', 'eswiki', 'svwiki', 'thwiki', 'trwiki', 'ukwiki', 'viwiki', 'commonswiki', 'specieswiki', 'metawiki', 'wikidatawiki' ]; // Manual overrides for missing grant dates // Format: "Username@dbname": "YYYY-MM-DD" const customGrantDates = { "RiazACU@bnwiki": "2022-05-13", "Example@cswiki": "2010-01-01" }; // Fetch all available wikis and filter out restricted ones function loadGlobalWikiMap() { const api = new mw.Api(); return api.get({ action: 'sitematrix', format: 'json', smtype: 'language|special', smlangprop: 'site', smsiteprop: 'dbname|url', formatversion: 2, origin: '*' }).then(function(data) { const matrix = data.sitematrix; const wikiMap = {}; Object.keys(matrix).forEach(key => { const entry = matrix[key]; if (entry.site && Array.isArray(entry.site)) { entry.site.forEach(site => { if (site.private || site.fishbowl || disabledCUWikis.indexOf(site.dbname) !== -1) return; wikiMap[site.dbname] = site.url; }); } }); if (matrix.specials && Array.isArray(matrix.specials)) { matrix.specials.forEach(special => { if (special.private || special.fishbowl || disabledCUWikis.indexOf(special.dbname) !== -1) return; wikiMap[special.dbname] = special.url; }); } return wikiMap; }); } const DELAY_MS = 500; const sleep = ms => new Promise(r => setTimeout(r, ms)); // Convert database names to interwiki prefixes for table links function getInterwikiPrefix(db) { const specialMap = { 'commonswiki': 'c', 'metawiki': 'm', 'wikidatawiki': 'd', 'wikifunctionswiki': 'f', 'mediawikiwiki': 'mw', 'specieswiki': 'species', 'sourceswiki': 'oldwikisource', 'foundationwiki': 'foundation', 'incubatorwiki': 'incubator', 'outreachwiki': 'outreach', 'betawikiversity': 'betawikiversity', 'be_x_oldwiki': 'be-tarask', 'zh_classicalwiki': 'lzh', 'zh_min_nanwiki': 'nan', 'zh_yuewiki': 'yue' }; if (specialMap[db]) return specialMap[db]; const name = db.replace(/_/g, '-'); if (name.endsWith('wikisource')) return 's:' + name.slice(0, -10); if (name.endsWith('wikiversity')) return 'v:' + name.slice(0, -11); if (name.endsWith('wiktionary')) return 'wikt:' + name.slice(0, -10); if (name.endsWith('wikivoyage')) return 'voy:' + name.slice(0, -10); if (name.endsWith('wikibooks')) return 'b:' + name.slice(0, -9); if (name.endsWith('wikiquote')) return 'q:' + name.slice(0, -9); if (name.endsWith('wikinews')) return 'n:' + name.slice(0, -8); if (name.endsWith('wikimedia')) return 'wm' + name.slice(0, -9); if (name.endsWith('wiki')) return 'w:' + name.slice(0, -4); return 'w:' + name; } // Process various API response formats into a clean array of group names const extractGroups = (data) => { if (!data) return []; var res = []; if (Array.isArray(data)) { res = data; } else if (typeof data === 'object') { res = Object.values(data); } else if (typeof data === 'string') { res = data.split(',').map(function(s) { return s.trim(); }); } return res.map(function(g) { if (typeof g !== 'string') return g; return g.replace(/\s+/g, '').toLowerCase(); }); }; // Make an API call with automatic retries for 429 Busy errors async function robustCall(api, params) { let retries = 0; const maxRetries = 3; while (retries < maxRetries) { try { return await api.get(params); } catch (err) { if (err?.status === 429) { retries++; const waitTime = parseInt(err.xhr?.getResponseHeader('Retry-After')) || (30 * retries); $('#status-msg').html( `<span style="color:orange; font-weight:bold;">Server busy! Waiting ${waitTime}s...</span>` ); await sleep(waitTime * 1000); } else { throw err; } } } throw new Error("API unreachable after multiple retries"); } mw.loader.using(['mediawiki.api', 'mediawiki.ForeignApi']).then(async function() { $('#mw-content-text').html('<strong>GlobalCheckUserList.js: Mapping wikis...</strong>'); globalWikiMap = await loadGlobalWikiMap(); const metaApi = new mw.ForeignApi('https://meta.wikimedia.org/w/api.php'); let isRunning = false; let currentFilterMode = 'all'; function setupUI() { $('#firstHeading').text('GlobalCheckUserList'); $('#mw-content-text').empty().append(` <div style="border:1px solid #a2a9b1; padding:15px; background:#f8f9fa;"> <p>Audits current CheckUsers across Wikimedia projects. Reports are grouped into one single table.</p> <div style="margin-bottom:10px; display:flex; align-items:center; gap:20px; font-size:13px;"> <strong>Wiki Filter:</strong> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-all" checked> All</label> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-localcu"> Local CU Wikis</label> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-only"> Only these</label> <span id="wiki-help-trigger" style="cursor:help; background:#36c; color:#fff; border-radius:50%; width:18px; height:18px; display:inline-block; text-align:center; font-weight:bold;" title="Show available DB names">?</span> </div> <div id="filter-input-container" style="display:none; margin-bottom:15px;"> <input id="wiki-filter" type="text" style="width:100%;" placeholder="dbname1, dbname2..."> </div> <div id="wiki-list-help" style="display:none; margin-bottom:10px; padding:10px; background:#fff; border:1px solid #a2a9b1; font-size:11px; max-height:120px; overflow-y:auto; font-family:monospace;"> <strong>Available database names:</strong><br>${Object.keys(globalWikiMap).sort().join(', ')} </div> <div style="margin-top:20px;"> <button id="start" class="mw-ui-button mw-ui-progressive">Run Audit</button> <button id="stop" class="mw-ui-button mw-ui-destructive" disabled>Stop</button> </div> <div id="status-msg" style="margin-top:10px; font-weight:bold; color:#0056b3;">Ready.</div> <div style="margin-top:5px;"> <progress id="bar" value="0" max="${Object.keys(globalWikiMap).length}" style="width:100%"></progress> </div> <div id="output-container" style="display:none; margin-top:15px;"> <strong>Wikitext Report:</strong> <textarea id="out" style="width:100%; height:450px; font-family:monospace; font-size:11px; padding:5px; border:1px solid #c8ccd1;"></textarea> </div> </div> `); $('#btn-all').click(function() { currentFilterMode = 'all'; $('#filter-input-container').hide(); }); $('#btn-localcu').click(function() { currentFilterMode = 'localcu'; $('#filter-input-container').hide(); }); $('#btn-only').click(function() { currentFilterMode = 'include'; $('#filter-input-container').show().focus(); }); $('#wiki-help-trigger').click(function() { $('#wiki-list-help').toggle(); }); $('#start').click(function() { runAudit(); }); $('#stop').click(function() { isRunning = false; }); } async function findGrantDate(user, db, localApi) { // Check manual list first const key = user + "@" + db; if (customGrantDates[key]) return customGrantDates[key]; // Search logs for the checkuser right assignment async function searchLog(targetUser) { // Phase 1: Meta-Wiki (Steward actions) let mPars = { action: 'query', list: 'logevents', letype: 'rights', letitle: 'User:' + targetUser + '@' + db, ledir: 'newer', lelimit: 'max', formatversion: 2 }; let resM = await robustCall(metaApi, mPars); let logsM = (resM.query && resM.query.logevents) || []; for (let ev of logsM) { let p = ev.params || {}; let nG = extractGroups(p.newgroups || p.add || p[1] || p["1"]); let oG = extractGroups(p.oldgroups || p.remove || p[0] || p["0"]); if (nG.indexOf('checkuser') !== -1 && oG.indexOf('checkuser') === -1) return ev.timestamp.substring(0, 10); } // Phase 2: Local Wiki (Bureaucrat actions) let lPars = { action: 'query', list: 'logevents', letype: 'rights', letitle: 'User:' + targetUser, ledir: 'newer', lelimit: 'max', formatversion: 2 }; let resL = await robustCall(localApi, lPars); let logsL = (resL.query && resL.query.logevents) || []; for (let ev of logsL) { let p = ev.params || {}; let nG = extractGroups(p.newgroups || p.add || p[1] || p["1"]); let oG = extractGroups(p.oldgroups || p.remove || p[0] || p["0"]); if (nG.indexOf('checkuser') !== -1 && oG.indexOf('checkuser') === -1) return ev.timestamp.substring(0, 10); } return null; } let date = await searchLog(user); return date || "Unknown"; } async function runAudit() { isRunning = true; let wt = ""; const adminTypes = [ 'block', 'delete', 'protect', 'rights', 'merge', 'abusefilter', 'contentmodel', 'import', 'managetags', 'massmessage', 'checkuser-temporary-account', 'ipinfo', 'pagelang', 'renameuser', 'stable', 'gblblock', 'abusefilter-protected-vars' ]; const cuInPublicTypes = ['abusefilterprivatedetails']; $('#start').prop('disabled', true); $('#stop').prop('disabled', false); $('#out').val('').show(); $('#output-container').show(); $('#status-msg').text('Waiting for queue lock...').css("color", "orange"); // Request browser lock to prevent concurrent runs await navigator.locks.request('global_cu_list_lock', async () => { const ts = new Date().toISOString().replace('T', ' ').substring(0, 16) + ' (UTC)'; wt = "== Global CheckUser List ==\n"; wt += "''Report generated on: " + ts + "<br />\n"; wt += "Generated with [[testwiki:User:MrJaroslavik/GlobalCheckUserList.js|GlobalCheckUserList.js]]''\n"; const filterText = $('#wiki-filter').val().trim().toLowerCase(); const filterList = filterText ? filterText.split(',').map(function(s) { return s.trim(); }).filter(function(s) { return s !== ""; }) : []; if (currentFilterMode === 'localcu') { wt += "<br />''Filter applied: Wikis with local CheckUser communities''\n"; } else if (currentFilterMode === 'include' && filterList.length > 0) { wt += "<br />''Filter applied: Only these wikis (" + filterList.join(', ') + ")''\n"; } wt += "\n"; wt += '{| class="wikitable sortable" style="font-size:90%; width:100%;"\n' + '! User !! CU Since !! Duration !! Last CU Action<ref>Logs: checkuserlog, checkuser-temporary-account, abusefilterprivatedetails</ref> !! ' + 'Last Admin Action<ref>Logs: ' + adminTypes.join(', ') + '</ref> !! ' + 'Last OS Action<ref>Logs: suppress</ref> !! ' + 'Last Logged Action<ref>Logs: all public logged actions</ref> !! Last Edit\n'; const allWikis = Object.keys(globalWikiMap); let wikisToScan; if (currentFilterMode === 'include' && filterList.length > 0) { wikisToScan = allWikis.filter(function(w) { return filterList.indexOf(w) !== -1; }); } else if (currentFilterMode === 'localcu') { wikisToScan = allWikis.filter(function(w) { return localCUWikis.indexOf(w) !== -1; }); } else { wikisToScan = allWikis; } $('#bar').attr('max', wikisToScan.length).val(0); for (let i = 0; i < wikisToScan.length; i++) { if (!isRunning) break; const db = wikisToScan[i]; $('#status-msg').text('Auditing ' + db + ' (' + (i + 1) + '/' + wikisToScan.length + ')...').css("color", "#0056b3"); try { const wikiUrl = globalWikiMap[db]; const localApi = new mw.ForeignApi(wikiUrl + '/w/api.php'); // Find all users currently in the checkuser group let users = [], auDone = false, auCont = null; while (!auDone && isRunning) { let auPars = { action: 'query', list: 'allusers', augroup: 'checkuser', auprop: 'groups', aulimit: 'max', formatversion: 2 }; if (auCont) Object.assign(auPars, auCont); let res = await robustCall(localApi, auPars); users = users.concat(res.query.allusers || []); if (res.continue) auCont = res.continue; else auDone = true; } if (users.length > 0) { const iw = getInterwikiPrefix(db); wt += '|-\n! colspan="8" style="background:#eaecf0; text-align:center;" | ' + '[[' + iw + ':|' + db + ']] — [[' + iw + ':Special:ListUsers/checkuser|(list)]] — [[' + iw + ':Special:CheckUserLog|(log)]]\n'; for (const u of users) { const username = u.name; const sinceDate = await findGrantDate(username, db, localApi); // Calculate how many days user has held rights let days = "-"; if (sinceDate && sinceDate !== "Unknown") { const cleanDate = sinceDate.substring(0, 10); const diff = new Date() - new Date(cleanDate); days = Math.floor(diff / 86400000) + "d"; } // Check private CheckUser log const cuLog = await robustCall(localApi, { action: 'query', list: 'checkuserlog', culuser: username, cullimit: 1, formatversion: 2 }); let lastCU = (cuLog.query && cuLog.query.checkuserlog && cuLog.query.checkuserlog.entries && cuLog.query.checkuserlog.entries[0]) ? cuLog.query.checkuserlog.entries[0].timestamp.substring(0, 10) : "Never"; // Fetch public log history const allUserLogsReq = await robustCall(localApi, { action: 'query', list: 'logevents', leuser: username, lelimit: 'max', formatversion: 2 }); const allUserLogs = (allUserLogsReq.query && allUserLogsReq.query.logevents) || []; // Cross-check for public logs that indicate CU activity const pubCUEvt = allUserLogs.find(function(ev) { return cuInPublicTypes.indexOf(ev.type) !== -1; }); if (pubCUEvt) { const pubCUTs = pubCUEvt.timestamp.substring(0, 10); if (lastCU === "Never" || pubCUTs > lastCU) lastCU = pubCUTs; } // Identify latest admin action const admEvent = allUserLogs.find(function(ev) { return adminTypes.indexOf(ev.type) !== -1; }); const lastAdm = admEvent ? admEvent.timestamp.substring(0, 10) : "Never"; // Get most recent log entry of any type const lastGen = allUserLogs.length > 0 ? allUserLogs[0].timestamp.substring(0, 10) : "Never"; // Look for Suppression actions const osLog = await robustCall(localApi, { action: 'query', list: 'logevents', leuser: username, letype: 'suppress', lelimit: 1, formatversion: 2 }); let lastOS = "-"; if (osLog.query && osLog.query.logevents && osLog.query.logevents.length > 0) { lastOS = osLog.query.logevents[0].timestamp.substring(0, 10); } else { var uGroups = extractGroups(u.groups); if (uGroups.indexOf('suppress') !== -1 || uGroups.indexOf('oversight') !== -1) { lastOS = "Never"; } } // Check last manual edit date const edLog = await robustCall(localApi, { action: 'query', list: 'usercontribs', ucuser: username, uclimit: 1, formatversion: 2 }); const lastEdit = (edLog.query && edLog.query.usercontribs && edLog.query.usercontribs[0]) ? edLog.query.usercontribs[0].timestamp.substring(0, 10) : "Never"; wt += '|-\n| style="text-align:left; white-space:nowrap;" | [[' + iw + ':Special:Log/' + username + '|' + username + '@' + db + ']] || ' + sinceDate + ' || ' + days + ' || ' + lastCU + ' || ' + lastAdm + ' || ' + lastOS + ' || ' + lastGen + ' || ' + lastEdit + '\n'; } } } catch (err) { console.error('Audit failed for ' + db, err); } $('#bar').val(i + 1); await sleep(DELAY_MS); } wt += '|}\n\n=== References ===\n<references />\n'; $('#out').val(wt); $('#output-container').show(); $('#status-msg').text('Audit complete!').css("color", "green"); $('#start').prop('disabled', false); $('#stop').prop('disabled', true); }); } setupUI(); }); })(); pudsh8pyj5e3yca19d5y6w3eyeb51el 739132 739118 2026-04-22T20:11:32Z MrJaroslavik 44012 e 739132 javascript text/javascript // GlobalCheckUserList.js // ------------------------------------------------------- // Features: // - Scans current CheckUsers across 800+ projects. // - Bypasses API limits for user lists and history logs. // - Checks Meta (steward) and Local (bureaucrat) logs for the grant date. // - Single Table: Unified wikitext output in one sortable table. // - Navigation: Nicknames link to local logs; headers link to project, list, and CU log. // - Compatibility: No optional chaining (?.) for MediaWiki editor support. // - Created with help of Gemini 3. // ------------------------------------------------------- (function() { 'use strict'; // Run only on Special:BlankPage/GlobalCheckUserList const isBlankPage = mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage'; const isOurScript = mw.config.get('wgTitle').includes('GlobalCheckUserList'); if (!isBlankPage || !isOurScript) return; let globalWikiMap = {}; // // List of wikis where CheckUser extension is disabled - https://noc.wikimedia.org/conf/highlight.php?file=dblists/checkuser-disabled.dblist const disabledCUWikis = [ 'aawikibooks', 'abwiktionary', 'advisorywiki', 'akwiktionary', 'angwikiquote', 'angwikisource', 'astwikibooks', 'astwikiquote', 'aswikibooks', 'aswiktionary', 'avwiktionary', 'aywikibooks', 'bhwiktionary', 'biwikibooks', 'biwiktionary', 'bmwikibooks', 'bmwikiquote', 'bmwiktionary', 'bowiktionary', 'chwikibooks', 'chwiktionary', 'cnwikimedia', 'crwikiquote', 'crwiktionary', 'dzwiktionary', 'gawikibooks', 'gnwikibooks', 'gotwikibooks', 'guwikibooks', 'htwikisource', 'huwikinews', 'hzwiki', 'iewikibooks', 'iiwiki', 'internalwiki', 'kjwiki', 'kkwikiquote', 'knwikibooks', 'krwiki', 'krwikiquote', 'kswikibooks', 'kswikiquote', 'kwwikiquote', 'lbwikibooks', 'lbwikiquote', 'lnwikibooks', 'lvwikibooks', 'mhwiktionary', 'mnwikibooks', 'muswiki', 'nahwikibooks', 'nawikibooks', 'nawikiquote', 'ndswikibooks', 'ndswikiquote', 'piwiktionary', 'pswikibooks', 'quwikibooks', 'quwikiquote', 'rmwikibooks', 'rmwiktionary', 'rnwiktionary', 'scwiktionary', 'searchcomwiki', 'snwiktionary', 'spcomwiki', 'swwikibooks', 'thwikinews', 'tkwikibooks', 'tkwikiquote', 'towiktionary', 'transitionteamwiki', 'trwikinews', 'ttwikiquote', 'twwiktionary', 'ugwikibooks', 'ugwikiquote', 'vowikibooks', 'vowikiquote', 'wawikibooks', 'wikimania2005wiki', 'wikimania2006wiki', 'wikimania2007wiki', 'wikimania2009wiki', 'wikimania2015wiki', 'wowikiquote', 'xhwikibooks', 'xhwiktionary', 'yowikibooks', 'yowiktionary', 'zawikibooks', 'zawikiquote', 'zawiktionary', 'zh_min_nanwikibooks', 'zuwikibooks' ]; // Projects known to have local CheckUsers - https://meta.wikimedia.org/wiki/CheckUser_policy/Users_with_CheckUser_access const localCUWikis = [ 'arwiki', 'bnwiki', 'cawiki', 'cswiki', 'dawiki', 'nlwiki', 'enwikibooks', 'enwiki', 'enwikivoyage', 'enwiktionary', 'fiwiki', 'frwiki', 'dewiki', 'hewiki', 'huwiki', 'idwiki', 'itwiki', 'jawiki', 'kowiki', 'fawiki', 'plwiki', 'ptwiki', 'ruwiki', 'srwiki', 'simplewiki', 'slwiki', 'eswiki', 'svwiki', 'thwiki', 'trwiki', 'ukwiki', 'viwiki', 'commonswiki', 'specieswiki', 'metawiki', 'wikidatawiki' ]; // Manual overrides for missing grant dates // Format: "Username@dbname": "YYYY-MM-DD" const customGrantDates = { "RiazACU@bnwiki": "2022-05-13", "KnudW@dawiki": "2017-03-23", "Dbeef@enwiki": "2025-03-07", "MarcGarver@enwikibooks": "2012-03-26", "Jake Park@eswiki": "2021-07-03", "Nohirara@idwiki": "2016-06-03", "Superspritz@itwiki": "2012-12-06", "Uncitoyen@trwiki": "2020-03-31" }; // Fetch all available wikis and filter out restricted ones function loadGlobalWikiMap() { const api = new mw.Api(); return api.get({ action: 'sitematrix', format: 'json', smtype: 'language|special', smlangprop: 'site', smsiteprop: 'dbname|url', formatversion: 2, origin: '*' }).then(function(data) { const matrix = data.sitematrix; const wikiMap = {}; Object.keys(matrix).forEach(key => { const entry = matrix[key]; if (entry.site && Array.isArray(entry.site)) { entry.site.forEach(site => { if (site.private || site.fishbowl || disabledCUWikis.indexOf(site.dbname) !== -1) return; wikiMap[site.dbname] = site.url; }); } }); if (matrix.specials && Array.isArray(matrix.specials)) { matrix.specials.forEach(special => { if (special.private || special.fishbowl || disabledCUWikis.indexOf(special.dbname) !== -1) return; wikiMap[special.dbname] = special.url; }); } return wikiMap; }); } const DELAY_MS = 500; const sleep = ms => new Promise(r => setTimeout(r, ms)); // Convert database names to interwiki prefixes for table links function getInterwikiPrefix(db) { const specialMap = { 'commonswiki': 'c', 'metawiki': 'm', 'wikidatawiki': 'd', 'wikifunctionswiki': 'f', 'mediawikiwiki': 'mw', 'specieswiki': 'species', 'sourceswiki': 'oldwikisource', 'foundationwiki': 'foundation', 'incubatorwiki': 'incubator', 'outreachwiki': 'outreach', 'betawikiversity': 'betawikiversity', 'be_x_oldwiki': 'be-tarask', 'zh_classicalwiki': 'lzh', 'zh_min_nanwiki': 'nan', 'zh_yuewiki': 'yue' }; if (specialMap[db]) return specialMap[db]; const name = db.replace(/_/g, '-'); if (name.endsWith('wikisource')) return 's:' + name.slice(0, -10); if (name.endsWith('wikiversity')) return 'v:' + name.slice(0, -11); if (name.endsWith('wiktionary')) return 'wikt:' + name.slice(0, -10); if (name.endsWith('wikivoyage')) return 'voy:' + name.slice(0, -10); if (name.endsWith('wikibooks')) return 'b:' + name.slice(0, -9); if (name.endsWith('wikiquote')) return 'q:' + name.slice(0, -9); if (name.endsWith('wikinews')) return 'n:' + name.slice(0, -8); if (name.endsWith('wikimedia')) return 'wm' + name.slice(0, -9); if (name.endsWith('wiki')) return 'w:' + name.slice(0, -4); return 'w:' + name; } // Process various API response formats into a clean array of group names const extractGroups = (data) => { if (!data) return []; var res = []; if (Array.isArray(data)) { res = data; } else if (typeof data === 'object') { res = Object.values(data); } else if (typeof data === 'string') { res = data.split(',').map(function(s) { return s.trim(); }); } return res.map(function(g) { if (typeof g !== 'string') return g; return g.replace(/\s+/g, '').toLowerCase(); }); }; // Make an API call with automatic retries for 429 Busy errors async function robustCall(api, params) { let retries = 0; const maxRetries = 3; while (retries < maxRetries) { try { return await api.get(params); } catch (err) { if (err?.status === 429) { retries++; const waitTime = parseInt(err.xhr?.getResponseHeader('Retry-After')) || (30 * retries); $('#status-msg').html( `<span style="color:orange; font-weight:bold;">Server busy! Waiting ${waitTime}s...</span>` ); await sleep(waitTime * 1000); } else { throw err; } } } throw new Error("API unreachable after multiple retries"); } mw.loader.using(['mediawiki.api', 'mediawiki.ForeignApi']).then(async function() { $('#mw-content-text').html('<strong>GlobalCheckUserList.js: Mapping wikis...</strong>'); globalWikiMap = await loadGlobalWikiMap(); const metaApi = new mw.ForeignApi('https://meta.wikimedia.org/w/api.php'); let isRunning = false; let currentFilterMode = 'all'; function setupUI() { $('#firstHeading').text('GlobalCheckUserList'); $('#mw-content-text').empty().append(` <div style="border:1px solid #a2a9b1; padding:15px; background:#f8f9fa;"> <p>Audits current CheckUsers across Wikimedia projects. Reports are grouped into one single table.</p> <div style="margin-bottom:10px; display:flex; align-items:center; gap:20px; font-size:13px;"> <strong>Wiki Filter:</strong> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-all" checked> All</label> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-localcu"> Local CU Wikis</label> <label style="cursor:pointer;"><input type="radio" name="w-mode" id="btn-only"> Only these</label> <span id="wiki-help-trigger" style="cursor:help; background:#36c; color:#fff; border-radius:50%; width:18px; height:18px; display:inline-block; text-align:center; font-weight:bold;" title="Show available DB names">?</span> </div> <div id="filter-input-container" style="display:none; margin-bottom:15px;"> <input id="wiki-filter" type="text" style="width:100%;" placeholder="dbname1, dbname2..."> </div> <div id="wiki-list-help" style="display:none; margin-bottom:10px; padding:10px; background:#fff; border:1px solid #a2a9b1; font-size:11px; max-height:120px; overflow-y:auto; font-family:monospace;"> <strong>Available database names:</strong><br>${Object.keys(globalWikiMap).sort().join(', ')} </div> <div style="margin-top:20px;"> <button id="start" class="mw-ui-button mw-ui-progressive">Run Audit</button> <button id="stop" class="mw-ui-button mw-ui-destructive" disabled>Stop</button> </div> <div id="status-msg" style="margin-top:10px; font-weight:bold; color:#0056b3;">Ready.</div> <div style="margin-top:5px;"> <progress id="bar" value="0" max="${Object.keys(globalWikiMap).length}" style="width:100%"></progress> </div> <div id="output-container" style="display:none; margin-top:15px;"> <strong>Wikitext Report:</strong> <textarea id="out" style="width:100%; height:450px; font-family:monospace; font-size:11px; padding:5px; border:1px solid #c8ccd1;"></textarea> </div> </div> `); $('#btn-all').click(function() { currentFilterMode = 'all'; $('#filter-input-container').hide(); }); $('#btn-localcu').click(function() { currentFilterMode = 'localcu'; $('#filter-input-container').hide(); }); $('#btn-only').click(function() { currentFilterMode = 'include'; $('#filter-input-container').show().focus(); }); $('#wiki-help-trigger').click(function() { $('#wiki-list-help').toggle(); }); $('#start').click(function() { runAudit(); }); $('#stop').click(function() { isRunning = false; }); } async function findGrantDate(user, db) { // Check manual list first const key = user + "@" + db; if (customGrantDates[key]) return customGrantDates[key]; // Search Meta-Wiki for steward actions (User:Name@dbname) // We use User:Name for Meta itself, and User:Name@dbname for other wikis const title = (db === 'metawiki') ? 'User:' + user : 'User:' + user + '@' + db; let mPars = { action: 'query', list: 'logevents', letype: 'rights', letitle: title, ledir: 'newer', lelimit: 'max', formatversion: 2 }; let resM = await robustCall(metaApi, mPars); let logsM = (resM.query && resM.query.logevents) || []; for (let ev of logsM) { let p = ev.params || {}; let nG = extractGroups(p.newgroups || p.add || p[1] || p["1"]); let oG = extractGroups(p.oldgroups || p.remove || p[0] || p["0"]); if (nG.indexOf('checkuser') !== -1 && oG.indexOf('checkuser') === -1) { return ev.timestamp.substring(0, 10); } } return "Unknown"; } async function runAudit() { isRunning = true; let wt = ""; const adminTypes = [ 'block', 'delete', 'protect', 'rights', 'merge', 'abusefilter', 'contentmodel', 'import', 'managetags', 'massmessage', 'checkuser-temporary-account', 'ipinfo', 'pagelang', 'renameuser', 'stable', 'gblblock', 'abusefilter-protected-vars' ]; const cuInPublicTypes = ['abusefilterprivatedetails']; $('#start').prop('disabled', true); $('#stop').prop('disabled', false); $('#out').val('').show(); $('#output-container').show(); $('#status-msg').text('Waiting for queue lock...').css("color", "orange"); // Request browser lock to prevent concurrent runs await navigator.locks.request('global_cu_list_lock', async () => { const ts = new Date().toISOString().replace('T', ' ').substring(0, 16) + ' (UTC)'; wt = "== Global CheckUser List ==\n"; wt += "''Report generated on: " + ts + "<br />\n"; wt += "Generated with [[testwiki:User:MrJaroslavik/GlobalCheckUserList.js|GlobalCheckUserList.js]]''\n"; const filterText = $('#wiki-filter').val().trim().toLowerCase(); const filterList = filterText ? filterText.split(',').map(function(s) { return s.trim(); }).filter(function(s) { return s !== ""; }) : []; if (currentFilterMode === 'localcu') { wt += "<br />''Filter applied: Wikis with local CheckUser communities''\n"; } else if (currentFilterMode === 'include' && filterList.length > 0) { wt += "<br />''Filter applied: Only these wikis (" + filterList.join(', ') + ")''\n"; } wt += "\n"; wt += '{| class="wikitable sortable" style="font-size:90%; width:100%;"\n' + '! User !! CU Since !! Duration !! Last CU Action<ref>Logs: checkuserlog, checkuser-temporary-account, abusefilterprivatedetails</ref> !! ' + 'Last Admin Action<ref>Logs: ' + adminTypes.join(', ') + '</ref> !! ' + 'Last OS Action<ref>Logs: suppress</ref> !! ' + 'Last Logged Action<ref>Logs: all public logged actions</ref> !! Last Edit\n'; const allWikis = Object.keys(globalWikiMap); let wikisToScan; if (currentFilterMode === 'include' && filterList.length > 0) { wikisToScan = allWikis.filter(function(w) { return filterList.indexOf(w) !== -1; }); } else if (currentFilterMode === 'localcu') { wikisToScan = allWikis.filter(function(w) { return localCUWikis.indexOf(w) !== -1; }); } else { wikisToScan = allWikis; } $('#bar').attr('max', wikisToScan.length).val(0); for (let i = 0; i < wikisToScan.length; i++) { if (!isRunning) break; const db = wikisToScan[i]; $('#status-msg').text('Auditing ' + db + ' (' + (i + 1) + '/' + wikisToScan.length + ')...').css("color", "#0056b3"); try { const wikiUrl = globalWikiMap[db]; const localApi = new mw.ForeignApi(wikiUrl + '/w/api.php'); // Find all users currently in the checkuser group let users = [], auDone = false, auCont = null; while (!auDone && isRunning) { let auPars = { action: 'query', list: 'allusers', augroup: 'checkuser', auprop: 'groups', aulimit: 'max', formatversion: 2 }; if (auCont) Object.assign(auPars, auCont); let res = await robustCall(localApi, auPars); users = users.concat(res.query.allusers || []); if (res.continue) auCont = res.continue; else auDone = true; } if (users.length > 0) { const iw = getInterwikiPrefix(db); wt += '|-\n! colspan="8" style="background:#eaecf0; text-align:center;" | ' + '[[' + iw + ':|' + db + ']] — [[' + iw + ':Special:ListUsers/checkuser|(list)]] — [[' + iw + ':Special:CheckUserLog|(log)]]\n'; for (const u of users) { const username = u.name; const sinceDate = await findGrantDate(username, db, localApi); // Calculate how many days user has held rights let days = "-"; if (sinceDate && sinceDate !== "Unknown") { const cleanDate = sinceDate.substring(0, 10); const diff = new Date() - new Date(cleanDate); days = Math.floor(diff / 86400000) + "d"; } // Check private CheckUser log const cuLog = await robustCall(localApi, { action: 'query', list: 'checkuserlog', culuser: username, cullimit: 1, formatversion: 2 }); let lastCU = (cuLog.query && cuLog.query.checkuserlog && cuLog.query.checkuserlog.entries && cuLog.query.checkuserlog.entries[0]) ? cuLog.query.checkuserlog.entries[0].timestamp.substring(0, 10) : "Never"; // Fetch public log history const allUserLogsReq = await robustCall(localApi, { action: 'query', list: 'logevents', leuser: username, lelimit: 'max', formatversion: 2 }); const allUserLogs = (allUserLogsReq.query && allUserLogsReq.query.logevents) || []; // Cross-check for public logs that indicate CU activity const pubCUEvt = allUserLogs.find(function(ev) { return cuInPublicTypes.indexOf(ev.type) !== -1; }); if (pubCUEvt) { const pubCUTs = pubCUEvt.timestamp.substring(0, 10); if (lastCU === "Never" || pubCUTs > lastCU) lastCU = pubCUTs; } // Identify latest admin action const admEvent = allUserLogs.find(function(ev) { return adminTypes.indexOf(ev.type) !== -1; }); const lastAdm = admEvent ? admEvent.timestamp.substring(0, 10) : "Never"; // Get most recent log entry of any type const lastGen = allUserLogs.length > 0 ? allUserLogs[0].timestamp.substring(0, 10) : "Never"; // Look for Suppression actions const osLog = await robustCall(localApi, { action: 'query', list: 'logevents', leuser: username, letype: 'suppress', lelimit: 1, formatversion: 2 }); let lastOS = "-"; if (osLog.query && osLog.query.logevents && osLog.query.logevents.length > 0) { lastOS = osLog.query.logevents[0].timestamp.substring(0, 10); } else { var uGroups = extractGroups(u.groups); if (uGroups.indexOf('suppress') !== -1 || uGroups.indexOf('oversight') !== -1) { lastOS = "Never"; } } // Check last manual edit date const edLog = await robustCall(localApi, { action: 'query', list: 'usercontribs', ucuser: username, uclimit: 1, formatversion: 2 }); const lastEdit = (edLog.query && edLog.query.usercontribs && edLog.query.usercontribs[0]) ? edLog.query.usercontribs[0].timestamp.substring(0, 10) : "Never"; wt += '|-\n| style="text-align:left; white-space:nowrap;" | [[' + iw + ':Special:Log/' + username + '|' + username + '@' + db + ']] || ' + sinceDate + ' || ' + days + ' || ' + lastCU + ' || ' + lastAdm + ' || ' + lastOS + ' || ' + lastGen + ' || ' + lastEdit + '\n'; } } } catch (err) { console.error('Audit failed for ' + db, err); } $('#bar').val(i + 1); await sleep(DELAY_MS); } wt += '|}\n\n=== References ===\n<references />\n'; $('#out').val(wt); $('#output-container').show(); $('#status-msg').text('Audit complete!').css("color", "green"); $('#start').prop('disabled', false); $('#stop').prop('disabled', true); }); } setupUI(); }); })(); fgin5dtudwj2jkdns0icorkfukzrxvn MediaWiki:Guidedtour-tour-aelecttranslate.js 8 174969 739106 2026-04-22T18:44:27Z Chaotic Enby 58843 starting the second part 739106 javascript text/javascript ( function ( window, document, $, mw, gt ) { var tour; var pollID = 1034; // for testing purposes var pollPage = 'Special:SecurePoll/translate/' + pollID tour = new gt.TourBuilder( { name: 'aelect-translate' } ); // Information defining each tour step tour.firstStep( { name: 'create', title: 'Welcome', description: 'Start by opening your poll\'s Translate menu to add localization', attachTo: '#mw-content-subtitle a[href="/wiki/' + pollPage + '"]', position: 'left', buttons: [ { name: 'Start', action: 'wikiLink', page: 'Special:SecurePoll/create', type: 'progressive' } ], allowAutomaticOkay: false, closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage) ) { return 'title'; } else if ( !gt.isPage('Special:SecurePoll') ) { return gt.TransitionAction.END; } } ) tour.step( { name: 'title', title: 'Language', description: 'Make sure that English is selected, then click Translate', attachTo: '#sp-translation-selection span', position: 'bottom', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) // The following should be the last line of your tour. } ( window, document, jQuery, mediaWiki, mediaWiki.guidedTour ) ); gc8m9fg7g14q4m1n2ewclgq60s7bmfa 739107 739106 2026-04-22T18:45:45Z Chaotic Enby 58843 fix selector & link 739107 javascript text/javascript ( function ( window, document, $, mw, gt ) { var tour; var pollID = 1034; // for testing purposes var pollPage = 'Special:SecurePoll/translate/' + pollID tour = new gt.TourBuilder( { name: 'aelect-translate' } ); // Information defining each tour step tour.firstStep( { name: 'create', title: 'Welcome', description: 'Start by opening your poll\'s Translate menu to add localization', attachTo: 'a[href="/wiki/' + pollPage + '"]', position: 'left', buttons: [ { name: 'Start', action: 'wikiLink', page: pollPage, type: 'progressive' } ], allowAutomaticOkay: false, closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage) ) { return 'title'; } else if ( !gt.isPage('Special:SecurePoll') ) { return gt.TransitionAction.END; } } ) tour.step( { name: 'title', title: 'Language', description: 'Make sure that English is selected, then click Translate', attachTo: '#sp-translation-selection span', position: 'bottom', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) // The following should be the last line of your tour. } ( window, document, jQuery, mediaWiki, mediaWiki.guidedTour ) ); fi50jrkzfo4pvw3eh02pbin47vbjai8 739108 739107 2026-04-22T18:51:50Z Chaotic Enby 58843 so apparently I can't have hyphens in the tour 739108 javascript text/javascript ( function ( window, document, $, mw, gt ) { var tour; var pollID = 1034; // for testing purposes var pollPage = 'Special:SecurePoll/translate/' + pollID tour = new gt.TourBuilder( { name: 'aelecttranslate' } ); // Information defining each tour step tour.firstStep( { name: 'create', title: 'Welcome', description: 'Start by opening your poll\'s Translate menu to add localization', attachTo: 'a[href="/wiki/' + pollPage + '"]', position: 'left', buttons: [ { name: 'Start', action: 'wikiLink', page: pollPage, type: 'progressive' } ], allowAutomaticOkay: false, closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage) ) { return 'title'; } else if ( !gt.isPage('Special:SecurePoll') ) { return gt.TransitionAction.END; } } ) tour.step( { name: 'title', title: 'Language', description: 'Make sure that English is selected, then click Translate', attachTo: '#sp-translation-selection span', position: 'bottom', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) // The following should be the last line of your tour. } ( window, document, jQuery, mediaWiki, mediaWiki.guidedTour ) ); 190a38qmw4jllka0ic2r0m0hoybk3ch 739109 739108 2026-04-22T18:52:17Z Chaotic Enby 58843 Chaotic Enby moved page [[MediaWiki:Guidedtour-tour-aelect-translate.js]] to [[MediaWiki:Guidedtour-tour-aelecttranslate.js]] without leaving a redirect: Make shorter ([[WP:CONCISE]], [[WP:PRECISE]]) 739108 javascript text/javascript ( function ( window, document, $, mw, gt ) { var tour; var pollID = 1034; // for testing purposes var pollPage = 'Special:SecurePoll/translate/' + pollID tour = new gt.TourBuilder( { name: 'aelecttranslate' } ); // Information defining each tour step tour.firstStep( { name: 'create', title: 'Welcome', description: 'Start by opening your poll\'s Translate menu to add localization', attachTo: 'a[href="/wiki/' + pollPage + '"]', position: 'left', buttons: [ { name: 'Start', action: 'wikiLink', page: pollPage, type: 'progressive' } ], allowAutomaticOkay: false, closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage) ) { return 'title'; } else if ( !gt.isPage('Special:SecurePoll') ) { return gt.TransitionAction.END; } } ) tour.step( { name: 'title', title: 'Language', description: 'Make sure that English is selected, then click Translate', attachTo: '#sp-translation-selection span', position: 'bottom', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) // The following should be the last line of your tour. } ( window, document, jQuery, mediaWiki, mediaWiki.guidedTour ) ); 190a38qmw4jllka0ic2r0m0hoybk3ch 739110 739109 2026-04-22T18:53:24Z Chaotic Enby 58843 direct child 739110 javascript text/javascript ( function ( window, document, $, mw, gt ) { var tour; var pollID = 1034; // for testing purposes var pollPage = 'Special:SecurePoll/translate/' + pollID tour = new gt.TourBuilder( { name: 'aelecttranslate' } ); // Information defining each tour step tour.firstStep( { name: 'create', title: 'Welcome', description: 'Start by opening your poll\'s Translate menu to add localization', attachTo: 'a[href="/wiki/' + pollPage + '"]', position: 'left', buttons: [ { name: 'Start', action: 'wikiLink', page: pollPage, type: 'progressive' } ], allowAutomaticOkay: false, closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage) ) { return 'title'; } else if ( !gt.isPage('Special:SecurePoll') ) { return gt.TransitionAction.END; } } ) tour.step( { name: 'title', title: 'Language', description: 'Make sure that English is selected, then click Translate', attachTo: '#sp-translation-selection > span', position: 'bottom', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) // The following should be the last line of your tour. } ( window, document, jQuery, mediaWiki, mediaWiki.guidedTour ) ); lmoes1ckc8rgzcher0p4d5twufsismo 739111 739110 2026-04-22T19:12:53Z Chaotic Enby 58843 we're straight up just finding the highest poll available for translation, which in 99.999 739111 javascript text/javascript ( function ( window, document, $, mw, gt ) { var tour; const links = document.querySelectorAll('a[href*="/wiki/Special:SecurePoll/translate/"]'); const pollID = Array.from(links).reduce((max, link) => { const match = link.href.match(/\/wiki\/Special:SecurePoll\/translate\/(\d+)/); return match ? Math.max(max, parseInt(match[1], 10)) : max; }, -Infinity); const pollPage = 'Special:SecurePoll/translate/' + pollID tour = new gt.TourBuilder( { name: 'aelecttranslate' } ); // Information defining each tour step tour.firstStep( { name: 'create', title: 'Welcome', description: 'Start by opening your poll\'s Translate menu to add localization', attachTo: 'a[href="/wiki/' + pollPage + '"]', position: 'left', buttons: [ { name: 'Start', action: 'wikiLink', page: pollPage, type: 'progressive' } ], allowAutomaticOkay: false, closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage) ) { return 'title'; } else if ( !gt.isPage('Special:SecurePoll') ) { return gt.TransitionAction.END; } } ) tour.step( { name: 'title', title: 'Language', description: 'Make sure that English is selected, then click Translate', attachTo: '#sp-translation-selection > span', position: 'bottom', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage('Special:SecurePoll/create') || $( '#mw-input-wpelection_title' ).length == 0 ) { return gt.TransitionAction.END; } } ) // The following should be the last line of your tour. } ( window, document, jQuery, mediaWiki, mediaWiki.guidedTour ) ); alwet9nu1n3pllmoiabc3wbg6j99w8r 739113 739111 2026-04-22T19:28:03Z Chaotic Enby 58843 most of the stuff is here 739113 javascript text/javascript ( function ( window, document, $, mw, gt ) { var tour; const links = document.querySelectorAll('a[href*="/wiki/Special:SecurePoll/translate/"]'); const pollID = Array.from(links).reduce((max, link) => { const match = link.href.match(/\/wiki\/Special:SecurePoll\/translate\/(\d+)/); return match ? Math.max(max, parseInt(match[1], 10)) : max; }, -Infinity); const pollPage = 'Special:SecurePoll/translate/' + pollID tour = new gt.TourBuilder( { name: 'aelecttranslate' } ); // Information defining each tour step tour.firstStep( { name: 'create', title: 'Welcome', description: 'Start by opening your poll\'s Translate menu to add localization', attachTo: 'a[href="/wiki/' + pollPage + '"]', position: 'left', buttons: [ { name: 'Start', action: 'wikiLink', page: pollPage, type: 'progressive' } ], allowAutomaticOkay: false, closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage) ) { return 'title'; } else if ( !gt.isPage('Special:SecurePoll') ) { return gt.TransitionAction.END; } } ) tour.step( { name: 'title', title: 'Language', description: 'Make sure that English is selected, then click Translate', attachTo: '#sp-translation-selection > span', position: 'bottom', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage) || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'intro' ) tour.step( { name: 'intro', title: 'Introduction', description: 'Add the following text', attachTo: 'tr:nth-child(2) .ext-codemirror-wrapper', position: 'left', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage) || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'unqualifiedError' ) tour.step( { name: 'unqualifiedError', title: 'Unqualified error', description: 'Add the following text', attachTo: 'tr:nth-child(2) .ext-codemirror-wrapper', position: 'left', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage) || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'editSummary' ) tour.step( { name: 'editSummary', title: 'Edit summary', description: 'Add a short edit summary, e.g. "Add messages"', attachTo: 'div.oo-ui-fieldLayout-field', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage) || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'createPoll' ) tour.step( { name: 'createPoll', title: 'Create poll', description: 'Click here to create the poll', attachTo: 'span.oo-ui-fieldLayout-field > span', position: 'right', autoFocus: true, buttons: [ { action: 'end' } ], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage) || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) // The following should be the last line of your tour. } ( window, document, jQuery, mediaWiki, mediaWiki.guidedTour ) ); 20r4n906tcm0c87cibxxdiyxh3kgzof 739115 739113 2026-04-22T19:28:59Z Chaotic Enby 58843 correct page 739115 javascript text/javascript ( function ( window, document, $, mw, gt ) { var tour; const links = document.querySelectorAll('a[href*="/wiki/Special:SecurePoll/translate/"]'); const pollID = Array.from(links).reduce((max, link) => { const match = link.href.match(/\/wiki\/Special:SecurePoll\/translate\/(\d+)/); return match ? Math.max(max, parseInt(match[1], 10)) : max; }, -Infinity); const pollPage = 'Special:SecurePoll/translate/' + pollID tour = new gt.TourBuilder( { name: 'aelecttranslate' } ); // Information defining each tour step tour.firstStep( { name: 'create', title: 'Welcome', description: 'Start by opening your poll\'s Translate menu to add localization', attachTo: 'a[href="/wiki/' + pollPage + '"]', position: 'left', buttons: [ { name: 'Start', action: 'wikiLink', page: pollPage, type: 'progressive' } ], allowAutomaticOkay: false, closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage) ) { return 'title'; } else if ( !gt.isPage('Special:SecurePoll') ) { return gt.TransitionAction.END; } } ) tour.step( { name: 'title', title: 'Language', description: 'Make sure that English is selected, then click Translate', attachTo: '#sp-translation-selection > span', position: 'bottom', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'intro' ) tour.step( { name: 'intro', title: 'Introduction', description: 'Add the following text', attachTo: 'tr:nth-child(2) .ext-codemirror-wrapper', position: 'left', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'unqualifiedError' ) tour.step( { name: 'unqualifiedError', title: 'Unqualified error', description: 'Add the following text', attachTo: 'tr:nth-child(2) .ext-codemirror-wrapper', position: 'left', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'editSummary' ) tour.step( { name: 'editSummary', title: 'Edit summary', description: 'Add a short edit summary, e.g. "Add messages"', attachTo: 'div.oo-ui-fieldLayout-field', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'createPoll' ) tour.step( { name: 'createPoll', title: 'Create poll', description: 'Click here to create the poll', attachTo: 'span.oo-ui-fieldLayout-field > span', position: 'right', autoFocus: true, buttons: [ { action: 'end' } ], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) // The following should be the last line of your tour. } ( window, document, jQuery, mediaWiki, mediaWiki.guidedTour ) ); d1sgzp8ic6nc1ny5r1i998g97k3h0js 739116 739115 2026-04-22T19:31:30Z Chaotic Enby 58843 fixes 739116 javascript text/javascript ( function ( window, document, $, mw, gt ) { var tour; const links = document.querySelectorAll('a[href*="/wiki/Special:SecurePoll/translate/"]'); const pollID = Array.from(links).reduce((max, link) => { const match = link.href.match(/\/wiki\/Special:SecurePoll\/translate\/(\d+)/); return match ? Math.max(max, parseInt(match[1], 10)) : max; }, -Infinity); const pollPage = 'Special:SecurePoll/translate/' + pollID tour = new gt.TourBuilder( { name: 'aelecttranslate' } ); // Information defining each tour step tour.firstStep( { name: 'create', title: 'Welcome', description: 'Start by opening your poll\'s Translate menu to add localization', attachTo: 'a[href="/wiki/' + pollPage + '"]', position: 'left', buttons: [ { name: 'Start', action: 'wikiLink', page: pollPage, type: 'progressive' } ], allowAutomaticOkay: false, closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage) ) { return 'language'; } else if ( !gt.isPage('Special:SecurePoll') ) { return gt.TransitionAction.END; } } ) tour.step( { name: 'language', title: 'Language', description: 'Make sure that English is selected, then click Translate', attachTo: '#sp-translation-selection > span', position: 'bottom', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage + '/en') ) { return 'intro' } else if ( gt.isPage(pollPage) ) { return 'language' } else { return gt.TransitionAction.END; } } ) .next( 'intro' ) tour.step( { name: 'intro', title: 'Introduction', description: 'Add the following text', attachTo: 'tr:nth-child(2) .ext-codemirror-wrapper', position: 'left', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'unqualifiedError' ) tour.step( { name: 'unqualifiedError', title: 'Unqualified error', description: 'Add the following text', attachTo: 'tr:nth-child(5) .ext-codemirror-wrapper', position: 'left', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'editSummary' ) tour.step( { name: 'editSummary', title: 'Edit summary', description: 'Add a short edit summary, e.g. "Add messages"', attachTo: 'div.oo-ui-fieldLayout-field > div', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'createPoll' ) tour.step( { name: 'createPoll', title: 'Create poll', description: 'Click here to create the poll', attachTo: 'span.oo-ui-fieldLayout-field > span', position: 'right', autoFocus: true, buttons: [ { action: 'end' } ], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) // The following should be the last line of your tour. } ( window, document, jQuery, mediaWiki, mediaWiki.guidedTour ) ); gkz48jfmev6dz9xgdo4r0ujzm4sbyxo 739123 739116 2026-04-22T19:44:34Z Chaotic Enby 58843 +text 739123 javascript text/javascript ( function ( window, document, $, mw, gt ) { var tour; const links = document.querySelectorAll('a[href*="/wiki/Special:SecurePoll/translate/"]'); const pollID = Array.from(links).reduce((max, link) => { const match = link.href.match(/\/wiki\/Special:SecurePoll\/translate\/(\d+)/); return match ? Math.max(max, parseInt(match[1], 10)) : max; }, -Infinity); const pollPage = 'Special:SecurePoll/translate/' + pollID tour = new gt.TourBuilder( { name: 'aelecttranslate' } ); // Information defining each tour step tour.firstStep( { name: 'create', title: 'Welcome', description: 'Start by opening your poll\'s Translate menu to add localization', attachTo: 'a[href="/wiki/' + pollPage + '"]', position: 'left', buttons: [ { name: 'Start', action: 'wikiLink', page: pollPage, type: 'progressive' } ], allowAutomaticOkay: false, closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage) ) { return 'language'; } else if ( !gt.isPage('Special:SecurePoll') ) { return gt.TransitionAction.END; } } ) tour.step( { name: 'language', title: 'Language', description: 'Make sure that English is selected, then click Translate', attachTo: '#sp-translation-selection > span', position: 'bottom', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage + '/en') ) { return 'intro' } else if ( gt.isPage(pollPage) ) { return 'language' } else { return gt.TransitionAction.END; } } ) .next( 'intro' ) tour.step( { name: 'intro', title: 'Introduction', description: new mw.guidedTour.WikitextDescription(`Add the following text: <syntaxhighlight lang="wikitext">[[Wikipedia:Administrator elections/May 2026|Election main page]] • [[Wikipedia talk:Administrator elections|Report problems or issues]] • [[Wikipedia:Administrator elections/May 2026#What data does SecurePoll collect?|What data does SecurePoll collect?]]\n\n '''''Instructions'''''\n * '''Use the radio buttons.''' Please use the radio buttons below to indicate your preference for each candidate with "Oppose", "Abstain", or "Support". An "Abstain" vote does not affect the outcome in any way.\n * '''Vote in a single sitting.''' Voting must be done in a single sitting.\n * '''You may change your vote by starting over.''' After your vote has been accepted, you may change your vote any time before the close of voting. To do so, reopen the voting interface and a fresh ballot page will be displayed. You will need to complete the voting process again from scratch. For this reason, consider keeping a private record of your vote. Your new ballot will override the old one. </syntaxhighlight>`), attachTo: 'tr:nth-child(2) .ext-codemirror-wrapper', position: 'left', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'unqualifiedError' ) tour.step( { name: 'unqualifiedError', title: 'Unqualified error', description: new mw.guidedTour.WikitextDescription(`Add the following text: <syntaxhighlight lang="wikitext">For the reason(s) above, your account does not meet the requirements to vote in this election. If you believe you are receiving this message in error, please post on the [[Wikipedia talk:Administrator elections|election talk page]]. </syntaxhighlight>`), attachTo: 'tr:nth-child(5) .ext-codemirror-wrapper', position: 'left', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'editSummary' ) tour.step( { name: 'editSummary', title: 'Edit summary', description: 'Add a short edit summary, e.g. "Add messages"', attachTo: 'div.oo-ui-fieldLayout-field > div', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'createPoll' ) tour.step( { name: 'createPoll', title: 'Create poll', description: 'Click here to create the poll', attachTo: 'span.oo-ui-fieldLayout-field > span', position: 'right', autoFocus: true, buttons: [ { action: 'end' } ], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) // The following should be the last line of your tour. } ( window, document, jQuery, mediaWiki, mediaWiki.guidedTour ) ); 2120ifa5auerouq64wwj8fj2xgvjva7 739125 739123 2026-04-22T19:45:54Z Chaotic Enby 58843 virtually any transition should end this 739125 javascript text/javascript ( function ( window, document, $, mw, gt ) { var tour; const links = document.querySelectorAll('a[href*="/wiki/Special:SecurePoll/translate/"]'); const pollID = Array.from(links).reduce((max, link) => { const match = link.href.match(/\/wiki\/Special:SecurePoll\/translate\/(\d+)/); return match ? Math.max(max, parseInt(match[1], 10)) : max; }, -Infinity); const pollPage = 'Special:SecurePoll/translate/' + pollID tour = new gt.TourBuilder( { name: 'aelecttranslate' } ); // Information defining each tour step tour.firstStep( { name: 'create', title: 'Welcome', description: 'Start by opening your poll\'s Translate menu to add localization', attachTo: 'a[href="/wiki/' + pollPage + '"]', position: 'left', buttons: [ { name: 'Start', action: 'wikiLink', page: pollPage, type: 'progressive' } ], allowAutomaticOkay: false, closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage) ) { return 'language'; } else if ( !gt.isPage('Special:SecurePoll') ) { return gt.TransitionAction.END; } } ) tour.step( { name: 'language', title: 'Language', description: 'Make sure that English is selected, then click Translate', attachTo: '#sp-translation-selection > span', position: 'bottom', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage + '/en') ) { return 'intro' } else if ( gt.isPage(pollPage) ) { return 'language' } else { return gt.TransitionAction.END; } } ) .next( 'intro' ) tour.step( { name: 'intro', title: 'Introduction', description: new mw.guidedTour.WikitextDescription(`Add the following text: <syntaxhighlight lang="wikitext">[[Wikipedia:Administrator elections/May 2026|Election main page]] • [[Wikipedia talk:Administrator elections|Report problems or issues]] • [[Wikipedia:Administrator elections/May 2026#What data does SecurePoll collect?|What data does SecurePoll collect?]]\n\n '''''Instructions'''''\n * '''Use the radio buttons.''' Please use the radio buttons below to indicate your preference for each candidate with "Oppose", "Abstain", or "Support". An "Abstain" vote does not affect the outcome in any way.\n * '''Vote in a single sitting.''' Voting must be done in a single sitting.\n * '''You may change your vote by starting over.''' After your vote has been accepted, you may change your vote any time before the close of voting. To do so, reopen the voting interface and a fresh ballot page will be displayed. You will need to complete the voting process again from scratch. For this reason, consider keeping a private record of your vote. Your new ballot will override the old one. </syntaxhighlight>`), attachTo: 'tr:nth-child(2) .ext-codemirror-wrapper', position: 'left', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'unqualifiedError' ) tour.step( { name: 'unqualifiedError', title: 'Unqualified error', description: new mw.guidedTour.WikitextDescription(`Add the following text: <syntaxhighlight lang="wikitext">For the reason(s) above, your account does not meet the requirements to vote in this election. If you believe you are receiving this message in error, please post on the [[Wikipedia talk:Administrator elections|election talk page]]. </syntaxhighlight>`), attachTo: 'tr:nth-child(5) .ext-codemirror-wrapper', position: 'left', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'editSummary' ) tour.step( { name: 'editSummary', title: 'Edit summary', description: 'Add a short edit summary, e.g. "Add messages"', attachTo: 'div.oo-ui-fieldLayout-field > div', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'createPoll' ) tour.step( { name: 'createPoll', title: 'Create poll', description: 'Click here to create the poll', attachTo: 'span.oo-ui-fieldLayout-field > span', position: 'right', autoFocus: true, buttons: [ { action: 'end' } ], closeOnClickOutside: false } ) .transition( function () { return gt.TransitionAction.END; } ) // The following should be the last line of your tour. } ( window, document, jQuery, mediaWiki, mediaWiki.guidedTour ) ); 4jaairez5ogx1985esek4kuay2nfwtc 739131 739125 2026-04-22T20:09:04Z Chaotic Enby 58843 does this work? 739131 javascript text/javascript ( function ( window, document, $, mw, gt ) { var tour; const links = document.querySelectorAll('a[href*="/wiki/Special:SecurePoll/translate/"]'); const pollID = Array.from(links).reduce((max, link) => { const match = link.href.match(/\/wiki\/Special:SecurePoll\/translate\/(\d+)/); return match ? Math.max(max, parseInt(match[1], 10)) : max; }, -Infinity); const pollPage = 'Special:SecurePoll/translate/' + pollID tour = new gt.TourBuilder( { name: 'aelecttranslate' } ); // Information defining each tour step tour.firstStep( { name: 'create', title: 'Welcome', description: 'Start by opening your poll\'s Translate menu to add localization', attachTo: 'a[href="/wiki/' + pollPage + '"]', position: 'left', buttons: [ { name: 'Start', action: 'wikiLink', page: pollPage, type: 'progressive' } ], allowAutomaticOkay: false, closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage) ) { return 'language'; } else if ( !gt.isPage('Special:SecurePoll') ) { return gt.TransitionAction.END; } } ) tour.step( { name: 'language', title: 'Language', description: 'Make sure that English is selected, then click Translate', attachTo: '#sp-translation-selection > span', position: 'bottom', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage + '/en') ) { return 'intro' } else if ( gt.isPage(pollPage) ) { return 'language' } else { return gt.TransitionAction.END; } } ) .next( 'intro' ) tour.step( { name: 'intro', title: 'Introduction', description: new mw.Title('MediaWiki:Guidedtour-tour-aelecttranslate/introduction'), attachTo: 'tr:nth-child(2) .ext-codemirror-wrapper', position: 'left', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'unqualifiedError' ) tour.step( { name: 'unqualifiedError', title: 'Unqualified error', description: new mw.guidedTour.WikitextDescription(`Add the following text: <syntaxhighlight lang="wikitext">For the reason(s) above, your account does not meet the requirements to vote in this election. If you believe you are receiving this message in error, please post on the [[Wikipedia talk:Administrator elections|election talk page]]. </syntaxhighlight>`), attachTo: 'tr:nth-child(5) .ext-codemirror-wrapper', position: 'left', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'editSummary' ) tour.step( { name: 'editSummary', title: 'Edit summary', description: 'Add a short edit summary, e.g. "Add messages"', attachTo: 'div.oo-ui-fieldLayout-field > div', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'createPoll' ) tour.step( { name: 'createPoll', title: 'Create poll', description: 'Click here to create the poll', attachTo: 'span.oo-ui-fieldLayout-field > span', position: 'right', autoFocus: true, buttons: [ { action: 'end' } ], closeOnClickOutside: false } ) .transition( function () { return gt.TransitionAction.END; } ) // The following should be the last line of your tour. } ( window, document, jQuery, mediaWiki, mediaWiki.guidedTour ) ); 5p81vuyxa308umdrq4snlvmrmcdpquv 739147 739131 2026-04-22T21:11:36Z Chaotic Enby 58843 dynamic next 739147 javascript text/javascript ( function ( window, document, $, mw, gt ) { var tour; const links = document.querySelectorAll('a[href*="/wiki/Special:SecurePoll/translate/"]'); const pollID = Array.from(links).reduce((max, link) => { const match = link.href.match(/\/wiki\/Special:SecurePoll\/translate\/(\d+)/); return match ? Math.max(max, parseInt(match[1], 10)) : max; }, -Infinity); const pollPage = 'Special:SecurePoll/translate/' + pollID tour = new gt.TourBuilder( { name: 'aelecttranslate' } ); // Information defining each tour step tour.firstStep( { name: 'create', title: 'Welcome', description: 'Start by opening your poll\'s Translate menu to add localization', attachTo: 'a[href="/wiki/' + pollPage + '"]', position: 'left', buttons: [ { name: 'Start', action: 'wikiLink', page: pollPage, type: 'progressive' } ], allowAutomaticOkay: false, closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage) ) { return 'language'; } else if ( !gt.isPage('Special:SecurePoll') ) { return gt.TransitionAction.END; } } ) tour.step( { name: 'language', title: 'Language', description: 'Make sure that English is selected, then click Translate', attachTo: '#sp-translation-selection > span', position: 'bottom', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage + '/en') ) { return 'intro' } else if ( gt.isPage(pollPage) ) { return 'language' } else { return gt.TransitionAction.END; } } ) .next( function () { if ( gt.isPage(pollPage + '/en') ) { return 'intro' } else if ( gt.isPage(pollPage) ) { return 'language' } else { return gt.TransitionAction.END; } } ) tour.step( { name: 'intro', title: 'Introduction', description: new mw.Title('MediaWiki:Guidedtour-tour-aelecttranslate/introduction'), attachTo: 'tr:nth-child(2) .ext-codemirror-wrapper', position: 'left', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'unqualifiedError' ) tour.step( { name: 'unqualifiedError', title: 'Unqualified error', description: new mw.guidedTour.WikitextDescription(`Add the following text: <syntaxhighlight lang="wikitext">For the reason(s) above, your account does not meet the requirements to vote in this election. If you believe you are receiving this message in error, please post on the [[Wikipedia talk:Administrator elections|election talk page]]. </syntaxhighlight>`), attachTo: 'tr:nth-child(5) .ext-codemirror-wrapper', position: 'left', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'editSummary' ) tour.step( { name: 'editSummary', title: 'Edit summary', description: 'Add a short edit summary, e.g. "Add messages"', attachTo: 'div.oo-ui-fieldLayout-field > div', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage + '/en') || $( '.securepoll-trans-table' ).length == 0 ) { return gt.TransitionAction.END; } } ) .next( 'createPoll' ) tour.step( { name: 'createPoll', title: 'Create poll', description: 'Click here to create the poll', attachTo: 'span.oo-ui-fieldLayout-field > span', position: 'right', autoFocus: true, buttons: [ { action: 'end' } ], closeOnClickOutside: false } ) .transition( function () { return gt.TransitionAction.END; } ) // The following should be the last line of your tour. } ( window, document, jQuery, mediaWiki, mediaWiki.guidedTour ) ); i3wtpxo1z4mq07j5nkdap7bcd5ihnrm User:MrJaroslavik/MarkAdmins.js 2 174970 739119 2026-04-22T19:37:37Z MrJaroslavik 44012 Creating MarkAdmins.js 739119 javascript text/javascript // MarkAdmins.js // Based on: https://meta.wikimedia.org/wiki/MediaWiki:Gadget-markAdmins.js // Features: // - Automatically highlights administrators and special user groups in page text. // - Supports both local site roles and global Wikimedia groups. // - Displays important global roles from Meta-Wiki on all projects. // - Fast performance with a 24-hour smart memory (cache). // - Works reliably even on very large wikis with hundreds of admins. // - Only marks names where it's useful, skipping talk pages and subpages. // - Smartly prioritizes the most important title for users with multiple roles. // - With help of Gemini 3 // <nowiki> (function (mw, $) { 'use strict'; const markAdmins = mw.libs.markAdmins = { config: { // GROUP CONFIGURATION - IF YOU ADD LOCAL OR GLOBAL GROUP, DON´T FORGOT TO ALSO ADD IT BELOW - const lCandidate and const gCandidates // Define labels and set "enabled: true" to display the tag or "enabled: false" to hide groups: { // LOCAL GROUPS (Fetched via list=allusers) 'sysop': { label: 'A', enabled: true }, 'bureaucrat': { label: 'B', enabled: true }, 'checkuser': { label: 'CU', enabled: true }, 'suppress': { label: 'OS', enabled: true }, 'interface-admin': { label: 'IA', enabled: true }, 'centralnoticeadmin': { label: 'CNA', enabled: true }, 'patroller': { label: 'Pat', enabled: true }, 'rollbacker': { label: 'Rol', enabled: true }, 'translationadmin': { label: 'TA', enabled: true }, 'wmf-officeit': { label: 'WMFOIT', enabled: true }, 'wmf-supportsafety': { label: 'WMF T&S', enabled: true }, 'global-renamer': { label: 'GRN', enabled: true }, // GLOBAL GROUPS (Fetched via list=globalallusers / CentralAuth) 'steward': { label: 'S', enabled: true }, 'staff': { label: 'Staff', enabled: true }, 'global-sysop': { label: 'GS', enabled: true }, 'ombuds': { label: 'Omb', enabled: true }, 'u4c-member': { label: 'U4C', enabled: true }, 'sysadmin': { label: 'sysadmin', enabled: true }, 'abusefilter-helper': { label: 'AFH', enabled: true }, 'abusefilter-maintainer': { label: 'AFM', enabled: true }, 'global-rollbacker': { label: 'GR', enabled: true }, 'vrt-permissions': { label: 'VRT', enabled: true } } }, users: {}, // Fetch privileged users from API with pagination support fetchData: async function () { const cacheKey = 'markAdmins_v2026_cache'; // Updated version key const cached = localStorage.getItem(cacheKey); const cacheTime = localStorage.getItem(`${cacheKey}_time`); // Cache check: Ensure cacheTime is treated as a number if (cached && cacheTime && (Date.now() - Number(cacheTime) < 86400000)) { return JSON.parse(cached); } const api = new mw.Api(); const userMap = {}; // Updated helper function with optional filtering to prevent group leakage async function fetchAndMerge(apiInstance, params, listName, allowedGroups) { try { let res = await apiInstance.get(params); const processUsers = (users) => { users?.forEach(({ name, groups }) => { if (!userMap[name]) userMap[name] = []; const groupsToAdd = allowedGroups ? groups.filter(g => allowedGroups.includes(g)) : groups; userMap[name] = [...new Set([...userMap[name], ...groupsToAdd])]; }); }; processUsers(res.query?.[listName]); while (res.continue) { res = await apiInstance.get({ ...params, ...res.continue }); processUsers(res.query?.[listName]); } } catch (e) { console.error("MarkAdmins API error", e); } } // List of candidates const lCandidates = ['sysop', 'bureaucrat', 'checkuser', 'suppress', 'interface-admin', 'centralnoticeadmin', 'patroller', 'rollbacker', 'translationadmin', 'wmf-officeit', 'wmf-supportsafety', 'global-renamer']; const gCandidates = ['steward', 'staff', 'global-sysop', 'ombuds', 'u4c-member', 'sysadmin', 'abusefilter-helper', 'abusefilter-maintainer', 'global-interface-editor', 'global-rollbacker', 'vrt-permissions']; // 1. Fetch Local groups await fetchAndMerge(api, { action: 'query', list: 'allusers', augroup: lCandidates.join('|'), auprop: 'groups', aulimit: 'max', formatversion: 2 }, 'allusers'); // 2. Fetch Global groups await fetchAndMerge(api, { action: 'query', list: 'globalallusers', agugroup: gCandidates.join('|'), aguprop: 'groups', agulimit: 'max', formatversion: 2 }, 'globalallusers'); // 3. Remote call to Meta-Wiki: strictly filtered to avoid showing TA/CNA on other wikis if (mw.config.get('wgDBname') !== 'metawiki') { const metaApi = new mw.ForeignApi('https://meta.wikimedia.org/w/api.php', { anonymous: true }); const mCandidates = ['wmf-officeit', 'wmf-supportsafety', 'global-renamer']; await fetchAndMerge(metaApi, { action: 'query', list: 'allusers', augroup: mCandidates.join('|'), auprop: 'groups', aulimit: 'max', formatversion: 2 }, 'allusers', mCandidates); } localStorage.setItem(cacheKey, JSON.stringify(userMap)); localStorage.setItem(cacheKey + '_time', Date.now()); return userMap; }, /** * Initialize gadget, detect local namespaces and setup hooks */ init: async function () { const self = this; await mw.loader.using(['mediawiki.api', 'mediawiki.ForeignApi', 'user', 'mediawiki.util']); const nsIds = mw.config.get('wgNamespaceIds'); const userNamespaces = Object.keys(nsIds).filter(name => nsIds[name] === 2); const nsPattern = userNamespaces.join('|').replace(/ /g, '_'); self.userRegex = new RegExp('(?:/wiki/|title=)(?:' + nsPattern + '):([^/\\s&?#]+)(?=[#?]|\\s|$)', 'i'); self.users = await self.fetchData(); mw.hook('wikipage.content').add(function ($content) { self.processLinks($content); }); }, // Scan links in the provided content and append labels to matched users processLinks: function ($content) { const self = this; const priorityOrder = [ 'sysop', 'steward', 'bureaucrat', 'checkuser', 'suppress', 'interface-admin', 'translationadmin', 'patroller', 'rollbacker', 'staff', 'sysadmin', 'vrt-permissions' ]; const priorityMap = Object.fromEntries(priorityOrder.map((id, index) => [id, index])); $content.find('a[href]').each(function() { const $a = $(this); const href = $a.attr('href'); // Přidáno: && !$a.hasClass('extiw') && !$a.hasClass('external') if (!href || $a.hasClass('markadmins-done') || $a.hasClass('extiw') || $a.hasClass('external')) return; const match = href.match(self.userRegex); if (match) { const rawName = match[1].split('#')[0]; const user = decodeURIComponent(rawName).replace(/_/g, ' '); if (self.users[user]) { const labels = [...self.users[user]] .sort((a, b) => { const pA = priorityMap[a.replace(/_/g, '-')] ?? 999; const pB = priorityMap[b.replace(/_/g, '-')] ?? 999; return pA !== pB ? pA - pB : a.localeCompare(b); }) .map(g => { const gConfig = self.config.groups[g] || self.config.groups[g.replace(/-/g, '_')]; return (gConfig && gConfig.enabled) ? gConfig.label : null; }) .filter((label, index, arr) => label && arr.indexOf(label) === index); if (labels.length > 0) { $a.append(`<b class="adminMark">&nbsp;(${labels.join('/')})</b>`); } } $a.addClass('markadmins-done'); } }); } }; markAdmins.init(); }(mediaWiki, jQuery)); // </nowiki> oihd1pke955292znb06sik0dp5lg31e User:MrJaroslavik/CustomSidebar.js 2 174971 739121 2026-04-22T19:38:52Z MrJaroslavik 44012 Create CustomSidebar.js 739121 javascript text/javascript // LINKS IN SIDEBAR $(function () { const separator = ' / '; const dbName = mw.config.get('wgDBname'); const pageName = mw.config.get('wgPageName'); const relevantUser = mw.config.get('wgRelevantUserName'); const pEnc = encodeURIComponent(pageName); // Helper function for portal creation const createPortal = (id, label) => { return $('<div>', { 'class': 'portal', 'role': 'navigation', 'id': id }) .append($('<h3>', { 'text': label })) .append($('<div>', { 'class': 'body' }).append($('<ul>'))); }; // Helper function for adding a link const addLink = ($list, href, text, title) => { return $('<a>', { 'href': href, 'title': title, 'text': text }).appendTo($list); }; // --- 1. LIST USERS --- const $pList = createPortal('p-listusers', 'ListUsers'); const $liList = $('<li>', { 'id': 't-listusers' }).appendTo($pList.find('ul')); addLink($liList, '/wiki/Special:ListUsers/sysop', 'A', 'Administrators'); $liList.append(separator); addLink($liList, '/wiki/Special:ListUsers/bureaucrat', 'B', 'Bureaucrats'); $liList.append(separator); addLink($liList, '/wiki/Special:ListUsers/checkuser', 'CU', 'CheckUsers'); $liList.append(separator); addLink($liList, '/wiki/Special:ListUsers/suppress', 'OS', 'Oversighters'); // --- 2. RECENT CHANGES --- const $pPages = createPortal('p-recenttchanges', 'Recent Changes'); const $ulPages = $pPages.find('ul'); $('<li>', { 'id': 't-meta-rc' }).append(addLink($ulPages, 'https://meta.wikimedia.org/wiki/Special:RecentChanges', 'Meta-Wiki', 'Open Meta-Wiki Recent Changes')).appendTo($ulPages); $('<li>', { 'id': 't-cswiki-rc' }).append(addLink($ulPages, 'https://cs.wikipedia.org/wiki/Special:RecentChanges', 'Czech Wikipedia', 'Open Czech Wikipedia Recent Changes')).appendTo($ulPages); $('<li>', { 'id': 't-skwiki-rc' }).append(addLink($ulPages, 'https://sk.wikipedia.org/wiki/Special:RecentChanges', 'Slovak Wikipedia', 'Open Slovak Wikipedia Recent Changes')).appendTo($ulPages); $('<li>', { 'id': 't-ombuds-rc' }).append(addLink($ulPages, 'https://ombuds.wikimedia.org/wiki/Special:RecentChanges', 'Ombuds Wiki', 'Open Ombuds Wiki Recent Changes')).appendTo($ulPages); $('<li>', { 'id': 't-cu-rc' }).append(addLink($ulPages, 'https://checkuser.wikimedia.org/wiki/Special:RecentChanges', 'CheckUser Wiki', 'Open CheckUser Wiki Recent Changes')).appendTo($ulPages); // --- 3. LOGS --- const $pLogs = createPortal('p-logs', 'Logs'); const $liLogs = $('<li>', { 'id': 't-logs-links' }).appendTo($pLogs.find('ul')); addLink($liLogs, '/wiki/Special:AbuseLog', 'A', 'AbuseLog'); $liLogs.append(separator); addLink($liLogs, '/wiki/Special:Logs/block', 'B', 'Blocks'); $liLogs.append(separator); addLink($liLogs, '/wiki/Special:CheckUserLog', 'CU', 'CheckUserLog'); $liLogs.append(separator); addLink($liLogs, '/wiki/Special:Logs/delete', 'D', 'Deletions'); $liLogs.append(separator); addLink($liLogs, '/wiki/Special:Logs/protect', 'P', 'Protections'); $liLogs.append(separator); addLink($liLogs, '/wiki/Special:Logs/rights', 'R', 'Rights Log'); $liLogs.append(separator); addLink($liLogs, '/wiki/Special:Logs/suppress', 'S', 'SuppressionLog'); // --- 4. USER TOOLS --- let $pUserTools = $(); if (relevantUser !== null) { $pUserTools = createPortal('p-user-custom', 'User tools'); const $ulUser = $pUserTools.find('ul'); const uEnc = encodeURIComponent(relevantUser); const server = mw.config.get('wgServerName'); // MOVE IP REVEAL TOOL (Přenese nástroj z Toolboxu do User tools, pokud existuje) const $ipReveal = $('#t-checkuser-ip-auto-reveal'); if ($ipReveal.length) { $ipReveal.detach().appendTo($ulUser); } // Standardní odkazy $('<li>').append(addLink($ulUser, '/wiki/Special:Contributions/' + uEnc, 'User contributions', 'Show user contributions')).appendTo($ulUser); $('<li>').append(addLink($ulUser, 'https://meta.wikimedia.org/wiki/Special:GlobalContributions/' + uEnc, 'Global Contributions', 'Show global contributions')).appendTo($ulUser); $('<li>').append(addLink($ulUser, '/wiki/Special:Log/' + uEnc, 'Logs', 'Show user logs')).appendTo($ulUser); $('<li>').append(addLink($ulUser, '/wiki/Special:EmailUser/' + uEnc, 'Send mail to this user', 'Email user')).appendTo($ulUser); $('<li>').append(addLink($ulUser, '/wiki/Special:UserRights/' + uEnc, 'Show user groups', 'User rights')).appendTo($ulUser); $('<li>').append(addLink($ulUser, 'https://meta.wikimedia.org/wiki/Special:CentralAuth/' + uEnc, 'CentralAuth', 'Global account info')).appendTo($ulUser); $('<li>').append(addLink($ulUser, 'https://xtools.wmcloud.org/ec/' + server + '/' + uEnc, 'XTools', 'XTools Edit Counter')).appendTo($ulUser); $('<li>').append(addLink($ulUser, 'https://xtools.wmcloud.org/ec-rightschanges/' + server + '/' + uEnc, 'Rights Changes', 'XTools Rights Changes')).appendTo($ulUser); $('<li>').append(addLink($ulUser, 'https://meta.toolforge.org/userpages/' + uEnc, 'Global userpages', 'Global userpages')).appendTo($ulUser); } // --- 5. PAGE TOOLS --- const $pPageTools = createPortal('p-page-custom', 'Page tools'); const $ulPage = $pPageTools.find('ul'); $('<li>').append(addLink($ulPage, mw.util.getUrl(null, { action: 'info' }), 'Page info', 'Page information')).appendTo($ulPage); $('<li>').append(addLink($ulPage, '/wiki/Special:WhatLinksHere/' + pEnc, 'What links here', 'Show pages that link here')).appendTo($ulPage); $('<li>').append(addLink($ulPage, mw.util.getUrl('Special:PrefixIndex/' + pageName + '/'), 'Subpages', 'Show subpages')).appendTo($ulPage); $('<li>').append(addLink($ulPage, 'https://swviewer.toolforge.org/', 'SWViewer', 'Global patrol')).appendTo($ulPage); $('<li>').append(addLink($ulPage, 'https://meta.wikimedia.org/wiki/Special:UrlShortener?url=https:' + mw.config.get('wgServer') + '/wiki/' + pageName, 'URL Shortener', 'Short URL')).appendTo($ulPage); $('<li>').append(addLink($ulPage, mw.util.getUrl(null, { action: 'history', feed: 'rss' }), 'RSS history', 'RSS feed for page history')).appendTo($ulPage); if (dbName === 'cswiki') { const cvUrl = 'https://copyvios.toolforge.org/?lang=cs&project=wikipedia&title=' + pEnc; $('<li>').append(addLink($ulPage, cvUrl, 'CVDetector', 'Copyvio Check')).appendTo($ulPage); } // Inject all portals $("#p-navigation").after($pList, $pPages, $pLogs, $pUserTools, $pPageTools); }); t9vw8ezcykss9q7jxaz75lwg8zo6mhl Template:NoteTag 10 174972 739122 2026-04-22T19:44:21Z ~2026-24668-01 73666 Created page with "<includeonly>{{#if:{{{name|}}} |{{#tag:ref|{{{1|{{{note|{{{content|{{{text|}}}}}}}}}}}}|group=note|name={{{name|}}}}} |{{#tag:ref|{{{1|{{{note|{{{content|{{{text|}}}}}}}}}}}}|group=note}} }}</includeonly><noinclude> {{Documentation}} </noinclude>" 739122 wikitext text/x-wiki <includeonly>{{#if:{{{name|}}} |{{#tag:ref|{{{1|{{{note|{{{content|{{{text|}}}}}}}}}}}}|group=note|name={{{name|}}}}} |{{#tag:ref|{{{1|{{{note|{{{content|{{{text|}}}}}}}}}}}}|group=note}} }}</includeonly><noinclude> {{Documentation}} </noinclude> 4m1k8hiwpzmjv3igohm19ro2xlsbh0w Template:Notetag 10 174973 739124 2026-04-22T19:45:11Z ~2026-24668-01 73666 Redirected page to [[Template:NoteTag]] 739124 wikitext text/x-wiki #REDIRECT [[Template:NoteTag]] 9tt1qek8lezg5rm7jq3o6fqpb5rr21s Template:NoteTag/doc 10 174974 739126 2026-04-22T19:45:56Z ~2026-24668-01 73666 Created page with "{{Documentation subpage}} {{High-use}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{#section:Help:footnotes|pregroup}} == TemplateData == <templatedata> { "description": "Inserts an explanatory footnote. Notes can be named and grouped. Will show as for example: [Note 1]", "format": "inline", "params": { "1": { "label": "Text", "description": "Text of the note", "aliase..." 739126 wikitext text/x-wiki {{Documentation subpage}} {{High-use}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{#section:Help:footnotes|pregroup}} == TemplateData == <templatedata> { "description": "Inserts an explanatory footnote. Notes can be named and grouped. Will show as for example: [Note 1]", "format": "inline", "params": { "1": { "label": "Text", "description": "Text of the note", "aliases": [ "note", "content", "text" ], "type": "content", "required": true }, "name": { "label": "Name", "description": "Reference name of the note", "type": "line" } } } </templatedata> <includeonly>{{Sandbox other|| <!-- Categories and interwikis go here: --> [[Category:Explanatory footnote templates]] [[Category:Templates that generate named references]] }}</includeonly> 1r9ki5l8ca0erf45p4sjjs5c90s4tpj Help:Footnotes 12 174975 739128 2026-04-22T19:46:47Z ~2026-24668-01 73666 Created page with "{{short description|Wikipedia help article}} {{For|the official guideline on citing sources|Wikipedia:Citing sources}} {{For|help with citation templates|Help:Citation Style 1}} {{Redirect|WP:FN|the fringe theories noticeboard|Wikipedia:Fringe theories/Noticeboard}} {{Redirect|WP:NOTES|hatnotes|Wikipedia:Hatnote|article layout of footnotes|MOS:NOTES|musical notes|Wikipedia:Manual of Style/Music#Images and notation}} <noinclude>{{pp-semi-indef}}</noinclude> {{Wikipedia ho..." 739128 wikitext text/x-wiki {{short description|Wikipedia help article}} {{For|the official guideline on citing sources|Wikipedia:Citing sources}} {{For|help with citation templates|Help:Citation Style 1}} {{Redirect|WP:FN|the fringe theories noticeboard|Wikipedia:Fringe theories/Noticeboard}} {{Redirect|WP:NOTES|hatnotes|Wikipedia:Hatnote|article layout of footnotes|MOS:NOTES|musical notes|Wikipedia:Manual of Style/Music#Images and notation}} <noinclude>{{pp-semi-indef}}</noinclude> {{Wikipedia how to|H:FOOT|WP:FOOTNOTES|H:FN}} This page explains how to create the '''Footnotes''' section for Wikipedia articles. In this context, the word "Footnotes" refers to the Wikipedia-specific manner of documenting an article's sources and providing tangential information, and should not be confused with the general concept of [[Note (typography)|footnotes]]. This how-to does not cover the formatting of citations within the Footnotes section, which is reviewed in [[Wikipedia:Citing sources|Citing sources]]. Footnotes are used most commonly to provide: * [[Wikipedia:Citing sources|references (bibliographic citations) to reliable sources]], * [[Help:explanatory notes|explanatory information]], or * source information for tables and other elements. Footnotes or [[Help:Shortened footnotes|shortened footnotes]] may be used at the editor's discretion in accordance with the guideline on [[WP:CITEVAR|Variation in citation methods]]. Only certain types of material on the English Wikipedia are required to have an inline citation. There is [[Wikipedia:Inline citation#Citation density|no requirement to provide a citation for every sentence]], because multiple sentences may be supported by the same footnote. For advice on which material should be cited, see the guidelines on [[WP:MINREF|When you must use inline citations]], the [[Wikipedia:Good article criteria|Good article criteria]] and [[Wikipedia:when to cite|When to cite]]. For advice on how to organize and format bibliographic citations, see the guideline on [[Wikipedia:Citing sources|Citing sources]] and examples of [[Wikipedia:Citation templates#Examples|Citation templates]]. Footnotes are created using the {{cite.php}} software extension. This extension adds the HTML-like elements {{xtag|ref|p}}, {{xtag|references|s}} and {{tag|references}}. On many pages, {{tl|reflist}} is used as a wrapper to style the reference list, but it cannot be used with [[Help:List-defined references|list-defined references]] due to incompatibility with Visual Editor. CSS style templates can also be used ''alongside'' {{tag|references|s}}, for example, {{tl|refwidth}} (and this does not create Visual Editor compatibility problems). In general, {{tag|references|s}} is preferred when the capabilities of {{tl|reflist}} are not needed. ==Overview== The Footnotes system shows two elements on the page: * A '''Footnote marker''' is displayed in the article's content as a bracketed, superscripted number, letter, or word. Examples shown respectively are: {{dummy ref}}{{dummy ref|a}}{{dummy ref|Note 1}}. This footnote label is linked to the full footnote. Clicking on the footnote marker jumps the page down to the footnote and highlights the citation. If you are using the desktop site and have Javascript enabled, then hovering your cursor over a footnote marker (or touching it on touch devices) will show a pop-up box containing the footnote. * A '''Footnote''' displays the full citation for the source. Together the footnotes are displayed in an ordered list wherever the reference list markup {{tag|references|s}} or {{tl|reflist}} is placed. Each entry begins with the footnote label in plain text. The entire reference list is formatted in a slightly smaller font. :Each successive footnote label is automatically incremented. Thus the first footnote marker would be {{dummy ref}}, the second would be {{dummy ref|2}} and so on. Custom labels are also incremented: {{dummy ref|a}}{{dummy ref|b}}{{dummy ref|c}}, {{dummy ref|Note 1}} {{dummy ref|Note 2}} {{dummy ref|Note 3}}. :For a single-use footnote, the label is followed by a caret (^) that is a backlink to the matching footnote marker. For example: {{dummy footnote|margin=5em}} :If a named footnote is used in the text multiple times, then the footnote has multiple backlinks shown as letters: {{dummy footnote|2|a b c|margin=5em}} :Clicking on the backlink or pressing {{keypress|Alt|←}} returns to the footnote marker. ===Footnotes in action=== The superscript numeral "1" in square brackets at the end of this sentence is an example of a footnote marker.<ref>This is a footnote that contains a citation or note.</ref> {{reflist}} {{anchor|Footnote markers: the basics}} ==Footnotes: the basics== {{See also|Help:Reftags}} To create the footnote marker, determine the point in the page content where the marker is desired and enter the markup with the citation or note inside the {{tag|ref}} tags. For example: {{markup |<nowiki>This is page content.<ref>''LibreOffice For Starters'', First Edition, Flexible Minds, Manchester, 2002, p. 18</ref> {{reflist}}</nowiki> |This is page content.<ref>''LibreOffice For Starters'', First Edition, Flexible Minds, Manchester, 2002, p. 18</ref> {{reflist}} }} The {{tl|reflist}} template will be explained in the next section; {{tag|references|s}} can also be used. The content inside the {{tag|ref}} will show in the reference list. The ref tags can be added anywhere a citation or note is needed. There must be content inside the tags, else an error will show. ===Where to place ref tags=== Ref tags should follow any punctuation (usually a period), not precede it; see [[WP:REFPUNC]]. There should be no space between the punctuation and the tag: {{markup |<nowiki>...text.<ref>Content of the reference</ref> {{reflist}}</nowiki> |...text.<ref>Content of the reference</ref> &nbsp; &nbsp; {{xt|Correct}} {{reflist}} |<nowiki>...text<ref>Content of the reference</ref>. {{reflist}}</nowiki> |...text<ref>Content of the reference</ref>. &nbsp; &nbsp; {{!xt|Incorrect (tag before punctuation)}} {{reflist}} |<nowiki>...text. <ref>Content of the reference</ref> {{reflist}}</nowiki> |...text. <ref>Content of the reference</ref> &nbsp; &nbsp; {{!xt|Incorrect (space before tag)}} {{reflist}} }} ===Formatting ref tags=== The content of the ref tags can be formatted using most wiki markup or HTML markup, although techniques such as the [[Help:Pipe trick|pipe trick]] and [[Help:Substitution|template substitution]] will not work in footnotes. For example: {{markup |<nowiki>This is page content.<ref>''LibreOffice For Starters'', First Edition, Flexible Minds, Manchester, 2002, p. 18</ref> {{reflist}}</nowiki> |This is page content.<ref>''LibreOffice For Starters'', First Edition, Flexible Minds, Manchester, 2002, p. 18</ref> {{reflist}} }} The ref tag content may also contain an internal or external link: {{markup |<nowiki>This is page content.<ref>''[http://www.example.org LibreOffice For Starters]'', First Edition, Flexible Minds, Manchester, 2002, p. 18</ref> {{reflist}}</nowiki> |This is page content.<ref>''[http://www.example.org LibreOffice For Starters]'', First Edition, Flexible Minds, Manchester, 2002, p. 18</ref> {{reflist}} }} {{MediaWiki URL rules}} ==Reference lists: the basics== Once any number of footnotes have been inserted into the content, the reference list must be generated. For the basic reference list, add {{tag|references|s}} or {{tl|reflist}} wherever the list is desired. Once the page is published and viewed, the footnotes will be automatically generated and numbered and the reference list will be generated. The main reference list is placed in a separate section, usually titled "References", "Notes" or the like. {{markup |<nowiki>This is page content.<ref>''LibreOffice For Starters'', First Edition, Flexible Minds, Manchester, 2002, p. 18</ref> ==References== {{reflist}}</nowiki> |This is page content.<ref>''LibreOffice For Starters'', First Edition, Flexible Minds, Manchester, 2002, p. 18</ref> {{fake heading|sub=2|References}} {{reflist}} }} '''Notes''' {{shortcut|HELP:MULTIREF}} * In some cases, a page has more than one reference list. Until 2014, multiple uses of {{tl|reflist}} on the same page required use of a {{para|close}} parameter; that bug has been fixed and the{{para|close}} parameter may safely be removed. {{anchor|Naming a ref tag so it can be used more than once|Footnote markers: using a source more than once}} ==Footnotes: using a source more than once== {{Shortcut|WP:REFNAME|WP:NAMEDREFS}} {{Anchor|Reference name (naming a ref tag so it can be used more than once)}}{{Anchor|Multiple references to the same footnote}} {{Anchor|WP:NAMEDREF}} <!-- from WP:NAMEDREFS redirect --> {{See also|Wikipedia:Citing sources#Citing multiple pages of the same source}} You can cite the same source more than once on a page by using '''named references''', also called named footnotes. Using the example name of "manchester2002", the syntax to define a named footnote is: :{{tag|ref|params=name="<var>manchester2002</var>"|content=<var>text of full reference</var>}} is the full "named" reference and used only once. To invoke the named reference: :{{tag|ref|s|params=name="<var>manchester2002</var>"}} is the short version that is used other places in the article. {{refname rules}} Note that the colon-followed-by-numeral names, like <code>":0"</code>, are currently [[WP:VENAMEDREFS|generated by default]] in [[WP:VE|VisualEditor]]. They should be improved by replacement, using unique information from the citation, such as author and date of publication. For example, change <code>":0"</code> to <code>"manchester2002"</code>, or even better, an exact date, such as <code>"manchester_12/14/2002"</code>. Scientific publications and the [https://tools.wmflabs.org/yadkard/yadkard.fcgi Yadkard] tool always use unique ref names based on the last name(s) of the author(s) and the full publication date. {{markup |<nowiki>This is page content.<ref name="manchester2002">{{cite book|title=LibreOffice for Starters|edition=First|publisher=Flexible Minds|location=Manchester|year=2002|p=18}}</ref> This is more content.<ref name="manchester2002" /> {{reflist}}</nowiki> |This is page content.<ref name="manchester2002">{{cite book|title=LibreOffice for Starters|edition=First|publisher=Flexible Minds|location=Manchester|year=2002|p=18}}</ref> This is more content.<ref name="manchester2002" /> {{reflist}} }} The actual name used can be almost anything, but it is recommended that it have information derived from the citation or note. A common practice is to use the author-year or publisher-year for the reference name. This helps editors remember the name by associating it with the information that is visible to the reader. Note that the footnote labels are incremented in the order they are used, and that they use the same label when reused, thus the labels can seem out of order: {{markup |<nowiki>This is starter content.<ref name="manchester2002">{{cite book|title=LibreOffice for Starters|edition=First|publisher=Flexible Minds|location=Manchester|year=2002|p=18}}</ref> This is expert content.<ref name="lexington2004">{{cite book|title=OpenOffice for Experts|publisher=Lexington|year=2004|p=18}}</ref> And more starter content.<ref name="manchester2002" /> And more expert content.<ref name="lexington2004" /> {{reflist}}</nowiki> |This is starter content.<ref name="manchester2002">{{cite book|title=LibreOffice for Starters|edition=First|publisher=Flexible Minds|location=Manchester|year=2002|p=18}}</ref> This is expert content.<ref name="lexington2004">{{cite book|title=OpenOffice for Experts|publisher=Lexington|year=2004|p=18}}</ref> And more starter content.<ref name="manchester2002" /> And more expert content.<ref name="lexington2004" /> {{reflist}} }} When using both names and [[#Footnotes:_groups|groups]], the syntax is: :{{tag|ref|params=group="<var>groupname</var>" name="<var>name</var>"|content=Content}} Care should be taken when deleting references to avoid creating a cite error. See [[Wikipedia:Avoiding common mistakes#Deleting...|Avoiding common mistakes]]. ==Reference lists: columns== {{Shortcut|H:REFCOLS}} {{Hatnote|Columns are not supported by Internet Explorer 9 and below; see {{tl|Reflist}} for technical details}} Footnote lists generated by {{tl|Reflist}} or {{tag|references|s}} automatically split into columns if there are 10 or more items. The number of columns adjusts responsively to the width of the display, which can range from mobile phones and tablets to wide-screen "cinema" displays. The CSS "column-width" property is by default set at 25–30 [[em (typography)|em]] depending on the skin. Browsers interpret this as a minimum width suggestion; if there is leftover space that cannot be used by an additional column, columns may render wider. This property can be adjusted with {{tl|reflist}} or {{tl|refwidth}}. {{tl|refwidth}} only allows three settings, "short", "medium", and "long". For example: <syntaxhighlight lang="wikitext"> ==References== {{refwidth|short}} <references /> </syntaxhighlight> {{tl|reflist}} allows this property to be set directly. To accommodate different fonts and zoom settings, this should always be done in em and not pixels. For example, to make narrow columns similar to the "short" setting: <syntaxhighlight lang="wikitext"> ==References== {{reflist|20em}} </syntaxhighlight> The "short" or "20em" setting is commonly used for [[Help:Shortened footnotes|shortened footnotes]], but not for [[Help:Citation Style 1|Citation Style 1]]. For a shortened footnote example, see {{oldid|NBR 224 and 420 Classes|442508215#Notes|NBR 224 and 420 Classes (13:32, 1 August 2011)}}. Setting a [[Template:Reflist#Columns|specific number of columns]] in reflist now no longer actually sets the "column-count" CSS property; instances of {{tlx|reflist|2}} or {{tlx|reflist|3}} can be replaced with the default behavior or variant requesting a specific column width. Given the range of reader screen sizes, fixing the number of columns would result in wasted space for some readers and overly narrow columns for others. ==List-defined references== {{shortcut|WP:LDR}} {{main|Help:List-defined references}} Some or all of the footnotes can also be defined within the reference section/list, and invoked in the page content. This keeps those citations in one central location for easier maintenance and avoids cluttering the text. This is purely a source code change{{snd}}the actual display of the citation in the text to a reader is unaffected. For a more detailed evaluation of this method, see [[WP:LDRHOW]]. The syntax is: <syntaxhighlight lang="xml"> <references> <ref name="name1">Content</ref> <ref name="name2">Content</ref> <ref name="name...n">Content</ref> </references> </syntaxhighlight> The footnote markers are included as usual for a named footnote. For example: {{markup |<nowiki>The quick brown fox jumps over the lazy dog.<ref name="LazyDog"/> Amazingly few discotheques provide jukeboxes.<ref name="Jukeboxes"/> How razorback-jumping frogs can level six piqued gymnasts.<ref name="JumpingFrogs"/> ==References== <references> <ref name="Jukeboxes">This is the jukeboxes reference.</ref> <ref name="LazyDog">This is the lazy dog reference.</ref> <ref name="JumpingFrogs">This is the jumping frogs reference.</ref> </references></nowiki> |The quick brown fox jumps over the lazy dog.<ref name="LazyDog"/> Amazingly few discotheques provide jukeboxes.<ref name="Jukeboxes"/> How razorback-jumping frogs can level six piqued gymnasts.<ref name="JumpingFrogs"/> {{fake heading|sub=3|References}} <references> <ref name="LazyDog">This is the lazy dog reference.</ref> <ref name="Jukeboxes">This is the jukeboxes reference.</ref> <ref name="JumpingFrogs">This is the jumping frogs reference.</ref> </references>}} The references will be numbered, and appear in the output, ''in the order that they are first referred to in the content,'' regardless of their order within the list. All references in the reference list must be referenced in the content, otherwise an error message will be shown. Although the template {{T|Reflist}} with {{para|refs}} parameter also supports list-defined references, its use is deprecated as it is not supported by the [[Wikipedia:VisualEditor|VisualEditor]]. {{anchor|Embedding references within footnotes}} ==Footnotes: embedding references== {{shortcut|WP:REFNEST}} {{See also|WP:Nesting footnotes}} [[Help:Explanatory notes|Explanatory notes]] may need to be referenced. Because of limitations in the {{cite.php}} software, reference tags cannot be nested; that is, a set of {{tag|ref}} tags cannot be placed inside another pair of {{tag|ref}} tags. Attempting to do so will result in a cite error. The templates {{tl|r}} and {{tl|refn}} can be used to nest references. The markup is: :{{tlx|refn|2=group=''group''|3=name=''name''|4=''content''}} or :{{tlx|r|2=group=''group''|3=name=''name''|4=refn=''content''}} or :{{tlx|r|2=g=''group''|3=n=''name''|4=r=''content''}} (shorter) ''name'' and ''group'' being optional parameters. The ''content'' may include {{tag|ref|o}} tags or another {{tl|r}} template. The other templates listed below in [[#Footnotes: predefined groups|Predefined groups]] are variants of {{tl|refn}} that include a styled group and have a matching styled reference list template. Examples: ===Using {{tl|refn}}=== {{markup |<nowiki>The quick brown fox jumps over the lazy dog.{{refn|group=nb|A footnote.<ref>A reference for the footnote.</ref>}} ==Notes== {{reflist|group=nb}} ==References== {{reflist}} </nowiki> |The quick brown fox jumps over the lazy dog.{{refn|group=nb|A footnote.<ref>A reference for the footnote.</ref>}} {{fake heading|sub=3|Notes}} {{reflist|group=nb}} {{fake heading|sub=3|References}} {{reflist}} }} ===Using {{tl|r}}=== {{markup |<nowiki>The quick brown fox jumps over the lazy dog.{{r|g=nb|r=A footnote.{{r|r=A reference for the footnote.}}}} ==Notes== {{reflist|group=nb}} ==References== {{reflist}} </nowiki> |The quick brown fox jumps over the lazy dog.{{r|g=nb|r=A footnote.{{r|r=A reference for the footnote.}}}} {{fake heading|sub=3|Notes}} {{reflist|group=nb}} {{fake heading|sub=3|References}} {{reflist}} }} The use of the magic word <code>#tag:ref</code> is valid, but the sequence of parameters is invariant and nonintuitive. {{tl|r}} as well as {{tl|refn}} and its variants use this markup internally. :<code>&#123;&#123;#tag:ref|<var>refcontent</var>|group=<var>groupname</var>|name=<var>name</var>}}</code> {{anchor|Grouping footnotes}} ==Footnotes: groups== {{shortcut|WP:REFGROUP|WP:CITELABEL}} Sometimes it is useful to group the footnotes into separate lists, for example to separate explanatory notes from references, or to list references for tables, image captions, infoboxes and navboxes. The sequence of footnote labels is independent in each group. The syntax to define a footnote with a group is: :{{tag|ref|params=group=<var>groupname</var>|content=Content}} If the footnote marker group name includes a space, the group name ''must'' be enclosed in quotes, else a cite error will occur. Otherwise, quotes are optional. The syntax for the reference list with a group is: :{{tlx|reflist|2=group=<var>groupname</var>}} or: :<nowiki><references group="</nowiki><var>groupname</var><nowiki>"></nowiki> Example: {{markup |<nowiki>This part of the text requires clarification,<ref group=note>Listed separately from the citation</ref> whereas the entire text is cited.<ref>Citation.</ref> And this needs even more clarification.<ref group=note>Another note</ref> ==Notes== {{reflist|group=note}} ==References== {{reflist}}</nowiki> |This part of the text requires clarification,<ref group=note>Listed separately from the citation</ref> whereas the entire text is cited.<ref>Citation</ref> And this needs even more clarification.<ref group=note>Another note</ref> {{fake heading|sub=3|Notes}} {{reflist|group=note}} {{fake heading|sub=3|References}} {{reflist}} }} Note that the footnote labels in the reference list show only the numbers and not the group name. When using both names and groups, the syntax is: :{{tag|ref|params=group="<var>groupname</var>" name="<var>name</var>"|content=Content}} For the repeated note: :{{tag|ref|s|params=group="<var>groupname</var>" name="<var>name</var>"}} {{anchor|Footnotes:predefinedgroups}} ==Footnotes: predefined groups== {{shortcut|H:PREGROUP|WP:EXPLNOTE}} {{for|technical details|Help:Cite link labels}} {{for|Shortened footnotes with explanatory footnotes|Help:Shortened footnotes#Explanatory notes}} {{See also|Wikipedia:Citing sources#Variation in citation methods|Wikipedia:Manual of Style/Layout#Notes and references}} <section begin=pregroup /><!--this section is used as the documentation for the efn/notelist templates-->{{anchor|footnotes_predefined_groups}} There are several predefined groups that can have a reference list styled so that the label (a superscripted character within square brackets, e.g., {{dummy ref|1}}) of an [[Help:Explanatory notes|explanatory note]] or citation ({{aka}} footnote, reference) matches and links to the note marker label located in the main text and the label in front of the note's text in the appropriate group's list. There can be [[Wikipedia:Citing sources#Separating citations from explanatory footnotes|more than one of these groups' lists]] in the Notes, References and other similarly purposed sections. These predefined note and citation groups have templates that make the [[wikitext]] markup simpler. These templates also allow a standard reference to be inserted, so that an explanatory note can have a reference, or citations can be nested. '''Note:''' If the note's text has a reference name that is used more than once, the labels will still match, but the clickable alpha characters (superscript lowercase letters like <sup>'''''a b c'''''</sup>) will be ''next to'' the note's label, with links to the multiple locations of its marker in the main text. See [[Help:Footnotes#Footnotes: using a source more than once|WP:REFNAME]] and the first point below in [[#Issues|§&nbsp;Issues]]. ===Template use by reference group type=== <section begin=pregrouptable /> {| class="wikitable" |- style="vertical-align:top;" ! Group type !! Footnote marker template<br/>or markup !! Reference list<br/> template !! Sample labels |- |rowspan=3|''none by default,<br>but optionally any'' || {{tag|ref}} |rowspan=3| {{tlx|reflist}} |rowspan=3| 1 2 3 4 5 6 7 8 9 10 |- | {{tlx|r}} (for nested references) |- | {{tlx|refn}} (for nested references) |- | lower-alpha || {{ubl| {{tlx|efn}} | {{tlx|efn-la}} }} || {{ubl| {{tlx|notelist}} | {{tlx|notelist-la}} }} || a b c d e f g h i j |- | upper-alpha || {{tlx|efn-ua}} || {{tlx|notelist-ua}} || A B C D E F G H I J |- | lower-roman || {{tlx|efn-lr}} || {{tlx|notelist-lr}} || i ii iii iv v vi vii viii ix x |- | upper-roman || {{tlx|efn-ur}} || {{tlx|notelist-ur}} || I II III IV V VI VII VIII IX X |- | lower-greek || {{tlx|efn-lg}} || {{tlx|notelist-lg}} || α β γ δ ε ζ η θ ι κ |- |note || {{ubl| {{tlx|NoteTag}} | {{tlx|efn-num}} }} || {{ubl| {{tlx|NoteFoot}} | {{tlx|notelist-num}} }} || note 1 note 2 note 3 |}<section end="pregrouptable" /> * {{tlx|efn}} supports {{para|name}}, which works the same as the parameter in {{tag|ref|o}} (see, for instance, the 4th and 5th examples below). It also supports {{para|group}}, which functions similarly to the parameter of the same name in {{tag|ref|o}} but accepts only 'lower-alpha', 'upper-alpha', 'lower-roman', 'upper-roman', 'lower-greek', or 'note'. Do not enclose values in quotes. * {{tlx|notelist}} supports the {{para|colwidth}} and {{para|refs}} parameters, which work the same as the same parameters in {{tlx|reflist}}, and {{para|group}}, which works similarly to the parameter of the same name in {{tlx|efn}}. Do not enclose values in quotes. In these examples, the footnote labels match between the footnote marker and the reference list: {{markup|title=With lower-alpha labels |<nowiki>Lorem ipsum dolor sit amet.{{efn|Footnote 1}} Consectetur adipisicing elit.{{efn|Footnote 2}} Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.{{efn|Footnote 3}} {{notelist}} </nowiki> |Lorem ipsum dolor sit amet.{{efn|Footnote 1}} Consectetur adipisicing elit.{{efn|Footnote 2}} Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.{{efn|Footnote 3}} {{notelist}} }} {{markup|title=With lower-roman labels |<nowiki>Lorem ipsum dolor sit amet.{{efn-lr|Footnote 1}} Consectetur adipisicing elit.{{efn-lr|Footnote 2}} Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.{{efn-lr|Footnote 3}} {{notelist-lr}} </nowiki> |Lorem ipsum dolor sit amet.{{efn-lr|Footnote 1}} Consectetur adipisicing elit.{{efn-lr|Footnote 2}} Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.{{efn-lr|Footnote 3}} {{notelist-lr}} }} {{markup|title=With {{para|group}} and multiple types |<nowiki>Lorem ipsum dolor sit amet.{{efn|group=lower-roman|Footnote 1}} Consectetur adipisicing elit.{{efn|lower-alpha|Footnote 2}} Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.{{efn|group=lower-roman|Footnote 3}} Notes: {{notelist|group=lower-roman}} Refs: {{notelist|group=lower-alpha}} </nowiki> |Lorem ipsum dolor sit amet.{{efn|group=lower-roman|Footnote 1}} Consectetur adipisicing elit.{{efn|group=lower-alpha|Footnote 2}} Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.{{efn|group=lower-roman|Footnote 3}} Notes: {{notelist|group=lower-roman}} Refs: {{notelist|group=lower-alpha}} }} {{markup|title=With named references |<nowiki>Lorem ipsum dolor sit amet.{{efn|name=fn1|Footnote 1}} Consectetur adipisicing elit.{{efn|Footnote 2}} Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.{{efn|name=fn1}} {{notelist}} </nowiki> |Lorem ipsum dolor sit amet.{{efn|name=fn1|Footnote 1}} Consectetur adipisicing elit.{{efn|Footnote 2}} Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.{{efn|name=fn1}} {{notelist}} }} '''Note''': With named references you only need to add the details once. For each use after the first you just need to re-use the reference name. Doing this will not cause the inline superscript to display a custom name. {{markup|title=Named references can also be defined in the notelist |<nowiki>Lorem ipsum dolor sit amet.{{efn|name=fn1}} Consectetur adipisicing elit.{{efn|name=fn2}} Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.{{efn|name=fn1}} {{notelist|refs= {{efn|name=fn1|Very long footnote 1}} {{efn|name=fn2|Very long footnote 2}} }} </nowiki> |Lorem ipsum dolor sit amet.{{efn|name=fn1}} Consectetur adipisicing elit.{{efn|name=fn2}} Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.{{efn|name=fn1}} {{notelist|refs= {{efn|name=fn1|Very long footnote 1}} {{efn|name=fn2|Very long footnote 2}} }} }} {{collapsed top|title=Currently broken; see {{section link|MediaWiki talk:Common.css|&lt;references /&gt; groups}}.}} [[WP:LDR|List-defined footnotes]] are incompatible with Visual Editor. {{tl|notelist}} is a simply a wrapper for {{tl|reflist}}, which is a wrapper for {{tag|references|s}}. Explanatory footnotes can be used with the raw tag (which ''is'' compatible with Visual Editor) by specifying the correct group name, for example: <pre> <references group="lower-alpha"> <ref name="name1">Content</ref> <ref name="name2">Content</ref> </references> </pre> {{tl|refwidth}} can be used to set column widths. {{collapsed bottom}} ===Issues=== * Multiple backlink labels (see [[WP:REFNAME]]) are always styled as lower-alpha. This can be confusing when {{tlx|efn}} is used. See the note in the introduction of [[#footnotes_predefined_groups|this section]], above. * The entries in the reference list will show the default decimal styling if: ** The value for {{para|group}} in {{tlx|reflist}} or {{tag|references|s}} does not exactly match one of the predefined values; use {{tlx|efn}} or variant as {{para|group}} will not be needed. ** The value for {{para|group}} in {{tlx|reflist}} or {{tag|references|s}} is enclosed by quotes; use {{tlx|efn}} or variant as {{para|group}} will not be needed. ** {{tlx|reflist}} is indented with the {{code|:}} markup. ** {{tag|references|s}} is used instead of {{tlx|reflist}} * The entries in the reference list will have no styling if: ** A reference is included in {{tlx|navbox}} or one of the variants and the style is set to <code>bodyclass=hlist</code>; to resolve this, replace the style with <code>listclass=hlist</code>.<section end=pregroup /> * If the note text contains an "=" sign, precede the note text with {{para|1}}, like this: <code><nowiki>{{efn|name=fn1|1=Very long footnote with an equation, 2+2=4}}</nowiki></code> * If {{tlx|notelist}} is embedded within an infobox, a navbox or a reference section that already uses a small font size, the footnotes will likely render in a font size that breaches the 85% minimum needed to maintain accessibility described at [[MOS:SMALLFONT]]. This can be addressed by wrapping <nowiki>{{notelist}}</nowiki> with <nowiki><div></nowiki> tags that increase the font size of the output produced by the <code>notelist</code> template. For instance, to call <code>notelist</code> within an infobox that calls {{tlx|infobox}}, <code><nowiki><div style="font-size:108%">{{notelist}}</div></nowiki></code> will cause the output of the <code>notelist</code> template to render in the same font size as the remainder of the text in the infobox. ==Reference lists: automatically generated== {{main|Help:Automatically generated reference list}} A page with {{tag|ref|o}} tags but no reference list markup used to display an error, except on talk and user pages. In recent versions of Wikipedia, the error no longer appears; instead an automatically generated reference list (AGRL) is displayed at the bottom of the page. Compared to the reference lists on properly formatted pages, an AGRL can be confusing to both readers and editors. But it is easily corrected by adding reference list markup such as the following: <syntaxhighlight lang="wikitext" style="width: 10.6em;"> ==References== {{reflist}} </syntaxhighlight> Add it at the position [[Wikipedia:Manual of Style/Layout#Order of article elements|where the reference list would normally appear]]: <syntaxhighlight lang="wikitext" style="width: 15.6em;"> ==See also== ==Notes== ==References== {{reflist}} ==External links== </syntaxhighlight> ===Talk pages=== On talk pages, the {{tl|reflist-talk}} template can be used to add a reference list to a specific discussion. {{anchor|Citing one book repeatedly with different page numbers}} ==Footnotes: page numbers== {{main|Help:References and page numbers}} Suppose you would like to cite one book, but different facts appear on different pages. You would like to cite the book again and again, but point each fact to the proper page. Suppose one fact is on page 8, a different fact on page 12, a third fact on page 18, a fourth fact on page 241. You could put a line in the "pages" parameter saying "see pages 8, 12, 18, 241" but a fact-checker might have to check all of them before figuring out the right one. Or, you could duplicate the entire citation for the book in each instance, but that would be redundant. One common approach is to use [[Help:Shortened footnotes|shortened citations]]. The long citation to support the shortened citations can either be placed as a bullet point in a separate ''References section'' after the ''Footnotes section''; or it can be placed in the first footnote to cite the source (with the initial relevant page number[s]). The remaining footnotes will use shortened citations (these usually contain the author's last name, the date of publication, and the relevant page number[s]). A less common approach is to attach a {{tlx|rp|page}} right after the footnote marker replacing the "page" with the appropriate page number or numbers. For example: {{markup |<nowiki>Schudson said the Constitution shaped citizenship in fundamental ways.<ref name="Schudson">{{Cite book |last=Schudson |first=Michael |title=The Good Citizen: A Brief History of American Civic Life |publisher=Simon & Schuster |date=1998 |url=https://books.google.com/books?id=aawMAQAAMAAJ |isbn=0-684-82729-8}}</ref>{{rp|8}} But elections in early American politics did not generate much interest<ref name="Schudson"/>{{rp|12}} while "open discussion of differences" was generally avoided.<ref name="Schudson"/>{{rp|18}} Citizenship later shifted to a polity of essentially "self-absorbed citizens", according to his analysis.<ref name="Schudson"/>{{rp|241-3}}</nowiki> |Schudson said the Constitution shaped citizenship in fundamental ways.<ref name="Schudson">{{Cite book |last=Schudson |first=Michael |title=The Good Citizen: A Brief History of American Civic Life |publisher=Simon & Schuster |date=1998 |url=https://books.google.com/books?id=aawMAQAAMAAJ |isbn=0-684-82729-8}}</ref>{{rp|8}} But elections in early American politics did not generate much interest<ref name="Schudson"/>{{rp|12}} while "open discussion of differences" was generally avoided.<ref name="Schudson"/>{{rp|18}} Citizenship later shifted to a polity of essentially "self-absorbed citizens", according to his analysis.<ref name="Schudson"/>{{rp|241-3}} {{fake heading|sub=3|References}} {{reflist}} }} {{tlx|r}} compactly combines the functions of <code><nowiki><ref></nowiki></code> and {{t|rp}}: <code><nowiki>{{r|Schudson}}</nowiki></code> is equivalent to <code><nowiki><ref name="Schudson"/></nowiki></code> and <code><nowiki>{{r|Schudson|p=241-3}}</nowiki></code> is equivalent to <code><nowiki><ref name="Schudson"/>{{rp|241-3}}</nowiki></code>. ==Previewing edits== When you [[Help:Section#Section editing|edit a single section]] of a page, the footnotes list will be visible when you [[Help:Show preview|preview your edits]] under the heading "Preview of references", although you will still not be able to see named references whose definition is outside the section you are editing. Tools that can be used are the [[user:js/ajaxPreview]] or [[User:Anomie/ajaxpreview.js]] scripts or the [[User:Cacycle/wikEd|wikEd]] gadget. ==RefToolbar== {{main|Wikipedia:RefToolbar/2.0}} [[File:Cite web named ref 01.png|thumb|400px|Using the citation toolbar to name the first reference]] [[File:Citation toolbar named ref.png|thumb|400px|Using the citation toolbar to insert additional references to the first source]] You can use the citation toolbar to name references. When you first create a reference, you can enter a value in the "Ref name" box. When you want to reuse this reference, click the "Named references" button on the citation toolbar and choose which reference you would like to insert. {{clear}} ==Issues and limitations== * {{cite.php|bug}} * [[Help:Substitution#substitution in references|subst:]] does not work within {{tag|ref|o}} tags. {{phab|T4700}} * The [[Help:Pipe trick|pipe trick]] does not work within {{tag|ref|o}} tags. {{phab|T4700}} == Flagging inadequate referencing == {{See also|Template: Unreferenced/doc#Usage|Template:Citation style}} * The template {{Tlx|Refimprove}} should be added to articles where there are '''some, but insufficient, inline citations to support the material''' currently in the article. For [[WP:BLP|biographies of living persons]], use {{tlx|BLP sources}} instead. * The template {{Tlx|Unreferenced}} should be added to articles with '''no references at all'''. For biographies of living persons, use {{tlx|BLP unsourced}} instead. * The template {{Tlx|Unreferenced section}} is for '''individual sections that have no citations''' in articles that have at least one citation somewhere else. For biographies of living persons, use {{tlx|BLP unsourced section}} instead. * The template {{Tlx|Medref}} is specifically for articles '''needing additional ''medical'' references'''. ==See also== {{For|instructions on how to "bundle" citations|Help:Citation merging}} *[[Template:Harvard citation#Using CITEREF directly]] and {{tl|sfnref}} * [[Wikipedia:Citing sources/Further considerations]]—a how-to article with some additional considerations for citing sources * [[Wikipedia:Help desk]]—to ask questions about using footnotes in articles if you were not able to find the information you need on this help page. * [[Template:Editor tools]]—{{tl|Editor tools}} * [[mw:Help:Cite]]—Mediawiki documentation of the {{tag|ref}} and {{tag|references|s}} tags. * For details on what CSS is available to style reference list output, the source code and CSS styles for {{tl|reflist}} and {{tl|refwidth}} may be helpful. {{Wikipedia referencing}} {{Help navigation}} [[Category:Wikipedia editor help]] [[Category:Wikipedia citation administration]] sq1f48yh1kjy5t6nbvajyukefyr46o6 MediaWiki:Guidedtour-tour-aelecteligibility.js 8 174976 739129 2026-04-22T19:56:48Z Chaotic Enby 58843 can I get it to work in one go? 739129 javascript text/javascript ( function ( window, document, $, mw, gt ) { var tour; const links = document.querySelectorAll('a[href*="/wiki/Special:SecurePoll/votereligibility/"]'); const pollID = Array.from(links).reduce((max, link) => { const match = link.href.match(/\/wiki\/Special:SecurePoll\/votereligibility\/(\d+)/); return match ? Math.max(max, parseInt(match[1], 10)) : max; }, -Infinity); const pollPage = 'Special:SecurePoll/votereligibility/' + pollID tour = new gt.TourBuilder( { name: 'aelecteligibility' } ); // Information defining each tour step tour.firstStep( { name: 'create', title: 'Welcome', description: 'Start by opening your poll\'s Voter Eligibility configuration', attachTo: 'a[href="/wiki/' + pollPage + '"]', position: 'left', buttons: [ { name: 'Start', action: 'wikiLink', page: pollPage, type: 'progressive' } ], allowAutomaticOkay: false, closeOnClickOutside: false } ) .transition( function () { if ( gt.isPage(pollPage) ) { return 'sitewide'; } else if ( !gt.isPage('Special:SecurePoll') ) { return gt.TransitionAction.END; } } ) tour.step( { name: 'sitewide', title: 'Eligibility criteria', description: 'Make sure that "Must not be sitewide blocked" is checked', attachTo: 'label.oo-ui-labelElement-label:contains("Must not be sitewide blocked")', position: 'right', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage) ) { return gt.TransitionAction.END; } } ) .next( 'bot' ) tour.step( { name: 'bot', title: 'Eligibility criteria', description: 'Check "Must not be flagged as a bot"', attachTo: 'label.oo-ui-labelElement-label:contains("Must not be flagged as a bot")', position: 'right', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage) ) { return gt.TransitionAction.END; } } ) .next( 'groups' ) tour.step( { name: 'groups', title: 'Eligibility criteria', description: 'Select the following groups: Administrators, Extended confirmed users', attachTo: '.oo-ui-fieldLayout-body:contains("Must be in any one of these groups") .oo-ui-tagMultiselectWidget', position: 'right', buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage) ) { return gt.TransitionAction.END; } } ) .next( 'editSummary' ) tour.step( { name: 'editSummary', title: 'Edit summary', description: 'Add a short edit summary, e.g. "Create"', attachTo: '#mw-input-wpcomment', position: 'right', autoFocus: true, buttons: [], closeOnClickOutside: false } ) .transition( function () { if ( !gt.isPage(pollPage) ) { return gt.TransitionAction.END; } } ) .next( 'createPoll' ) tour.step( { name: 'createPoll', title: 'Create poll', description: 'Click here to create the poll', attachTo: '.mw-htmlform-submit-buttons .oo-ui-widget', position: 'right', autoFocus: true, buttons: [ { action: 'end' } ], closeOnClickOutside: false } ) .transition( function () { return gt.TransitionAction.END; } ) // The following should be the last line of your tour. } ( window, document, jQuery, mediaWiki, mediaWiki.guidedTour ) ); 5h07vqy6pnn85xwjp7vbsqczc87hwlb MediaWiki:Guidedtour-tour-aelecttranslate/introduction 8 174977 739130 2026-04-22T20:07:30Z Chaotic Enby 58843 testing recovering messages 739130 wikitext text/x-wiki Add the following text: <syntaxhighlight lang="wikitext"> [[Wikipedia:Administrator elections/May 2026|Election main page]] • [[Wikipedia talk:Administrator elections|Report problems or issues]] • [[Wikipedia:Administrator elections/May 2026#What data does SecurePoll collect?|What data does SecurePoll collect?]] '''''Instructions''''' * '''Use the radio buttons.''' Please use the radio buttons below to indicate your preference for each candidate with "Oppose", "Abstain", or "Support". An "Abstain" vote does not affect the outcome in any way. * '''Vote in a single sitting.''' Voting must be done in a single sitting. * '''You may change your vote by starting over.''' After your vote has been accepted, you may change your vote any time before the close of voting. To do so, reopen the voting interface and a fresh ballot page will be displayed. You will need to complete the voting process again from scratch. For this reason, consider keeping a private record of your vote. Your new ballot will override the old one. </syntaxhighlight> 1w8a3ox18aq4p568ldlqy23y63ykxr0 739146 739130 2026-04-22T21:05:57Z Chaotic Enby 58843 get the data 739146 wikitext text/x-wiki Add the following text: {{#tag:syntaxhighlight| [[Wikipedia:Administrator elections/May 2026|Election main page]] • [[Wikipedia talk:Administrator elections|Report problems or issues]] • [[Wikipedia:Administrator elections/May 2026#What data does SecurePoll collect?|What data does SecurePoll collect?]] '''''Instructions''''' * '''Use the radio buttons.''' Please use the radio buttons below to indicate your preference for each candidate with "Oppose", "Abstain", or "Support". An "Abstain" vote does not affect the outcome in any way. * '''Vote in a single sitting.''' Voting must be done in a single sitting. * '''You may change your vote by starting over.''' After your vote has been accepted, you may change your vote any time before the close of voting. To do so, reopen the voting interface and a fresh ballot page will be displayed. You will need to complete the voting process again from scratch. For this reason, consider keeping a private record of your vote. Your new ballot will override the old one. |lang=wikitext}} bz07bb0rpee2eo2xxztbtrbu5gu523g 739165 739146 2026-04-22T21:46:36Z Chaotic Enby 58843 safesubst was a mistake 739165 wikitext text/x-wiki Add the following text: {{#tag:syntaxhighlight| [[Wikipedia:Administrator elections/{{Administrator elections status/data/latest month}}|Election main page]] • [[Wikipedia talk:Administrator elections|Report problems or issues]] • [[Wikipedia:Administrator elections/{{Administrator elections status/data/latest month}}#What data does SecurePoll collect?|What data does SecurePoll collect?]] '''''Instructions''''' * '''Use the radio buttons.''' Please use the radio buttons below to indicate your preference for each candidate with "Oppose", "Abstain", or "Support". An "Abstain" vote does not affect the outcome in any way. * '''Vote in a single sitting.''' Voting must be done in a single sitting. * '''You may change your vote by starting over.''' After your vote has been accepted, you may change your vote any time before the close of voting. To do so, reopen the voting interface and a fresh ballot page will be displayed. You will need to complete the voting process again from scratch. For this reason, consider keeping a private record of your vote. Your new ballot will override the old one. |lang=wikitext}} a4clmbw7qa9t6dk3x9twsg667pvzuif Template:Album chart/doc 10 174978 739133 2026-04-22T20:23:03Z ~2026-24668-01 73666 Created page with "{{Documentation subpage}} <!-- EDIT TEMPLATE DOCUMENTATION BELOW THIS LINE --> <!-- Categories go where indicated at the bottom of this page, please; interwikis go to Wikidata (see also: [[Wikipedia:Wikidata]]). --> {{High-use|10,000}} {{Lua|Module:WLink|Module:String|Module:Check for unknown parameters}} This template is used to [[WP:CITE|cite sources]] in Wikipedia. It is specifically for [[album]]s. A similar template for use when citing sources for musical singles c..." 739133 wikitext text/x-wiki {{Documentation subpage}} <!-- EDIT TEMPLATE DOCUMENTATION BELOW THIS LINE --> <!-- Categories go where indicated at the bottom of this page, please; interwikis go to Wikidata (see also: [[Wikipedia:Wikidata]]). --> {{High-use|10,000}} {{Lua|Module:WLink|Module:String|Module:Check for unknown parameters}} This template is used to [[WP:CITE|cite sources]] in Wikipedia. It is specifically for [[album]]s. A similar template for use when citing sources for musical singles can be found at [[Template:Single chart]]; however, for EPs or other releases, it has not yet been developed. In general, the template expands to produce a table row with the information country, [[record chart]], reference, and peak position for the given album on the particular chart. Tables of such information are commonly used in Wikipedia articles on singles, albums, discographies and artists. This template does not verify any positions or chart appearances. It primarily provides a reference URL believed to be associated with a [[WP:RS|reliable source]] for a recognised chart. ''The reference URL itself is also not checked.'' Entering an incorrect or alternative spelling of an album title can produce a bad link, for example. '''Individual editors will need to follow the URLs generated by the template to verify their usefulness''' before walking away from an edited article. ==Usage== Following, the most common parameters used on the template: :{{code|<nowiki>{{Album chart|(Chart identifier)|(Peak position)|artist=|album=|refname=|access-date=30 May 2012|rowheader=true}}</nowiki>}} Following, the parameters for any ''Billboard'' chart: :{{code|<nowiki>{{Album chart|Billboard(Specific identifier)|(Peak position)|artist=|refname=|access-date=30 May 2012|rowheader=true}}</nowiki>}} Following, the parameters for any UK chart (except for the main UK parameter and UKZobbel): :{{code|<nowiki>{{Album chart|UK(Specific identifier)|(Peak position)|artist=|date=YYYY-MM-DD|refname=|access-date=30 May 2012|rowheader=true}}</nowiki>}} Following, the parameters for any US chart (except for the main US parameter and USZobbel): :{{code|<nowiki>{{Album chart|US(Specific identifier)|(Peak position)|artist=|date=YYYY-MM-DD|refname=|access-date=30 May 2012|rowheader=true}}</nowiki>}} ==Manual referencing== If the following situations arise: #The album name contains special characters that the {{code|<nowiki>album=</nowiki>}} parameter doesn't handle correctly and returns an URL error. #When the template will be used for year-end charts instead of weekly charts. #When the chart position is retrieved from a source other than the default by {{tlc|Album chart}} such as ''Billboard'''s Chart Beat or Allmusic (remember that all sources ''must'' be reliable). Then a manual reference might be needed. When manual referencing is activated, the user ''must'' provide the {{code|<nowiki>url=</nowiki>}} and {{code|<nowiki>title=</nowiki>}}, and may additionally provide {{code|<nowiki>work=</nowiki>}}, {{code|<nowiki>page=</nowiki>}}, {{code|<nowiki>date=</nowiki>}}, {{code|<nowiki>location=</nowiki>}} and (if specially relevant) {{code|<nowiki>publisher=</nowiki>}}, just like on the {{tlc|cite news}} template, to add a different source than the commonly used by {{tlc|Album chart}}. '''To activate manual referencing''', write an "M" as the third parameter of the template, after the country name and chart position, as this: *{{code|<nowiki>{{Album chart|Australia|1|M|title=Madonna's "MDNA" Tops ARIA Charts|url=http://www.billboard.com/#/news/madonnas-mdna-tops-aria-charts-1584845.story|work=Billboard|location=United States</nowiki>'''<nowiki>|access-date=9 June 2012|rowheader=true}}</nowiki>}} And it will show in a table as this: {| class="wikitable plainrowheaders" |+Chart positions for ''MDNA'' !scope="col"|Chart !scope="col"|Peak |- {{Album chart|Australia|1|M|title=Madonna's "MDNA" Tops ARIA Charts|url=http://www.madonna.com/|work=Billboard|location=United States|access-date=9 June 2012|rowheader=true}} |} <references /> This mode can be used simultaneously with the normal mode of the template, without the need to change the '''refname''' parameter. *The manual referencing mode '''is not available''' for the Music DVD charts. ==Fields== The parameters ''publish-date'', ''access-date'', and ''refname'' are optional. Whether the other parameters are required or not depend on the chart being referenced. See the tables in the [[#Supports|Support]] section below. * '''(Chart identifier)''' (or first parameter, without name): Chart identifier. Must be one of the options listed under Chart ID in the tables of the [[#Supports|Support]] section below. Often named as a country or nationality (e.g., Spain or Spanish), but sometimes named for a specific chart (e.g., Billboardjapanhot100). Some charts allow more than one identifier; the results produced are identical. * '''(Peak position)''' (or second parameter, without name): The number you found to be the peak position achieved by the single on the specific chart to date. If the song has not appeared on the chart (due to low popularity or lack of release in a country), you can enter a dash (&ndash;, not a hyphen -). Usually, it's better to omit the template completely. * '''album''': Title of the album. Made-up words, slang, "hip" spellings, tricky punctuation, etc., can make this parameter difficult to correctly determine. Make sure to check the resulting reference URL (Preview) before saving the definitive version of the article. * '''dvd''': For Music DVDs, the title of the album. Some Music DVD charts need to be provided with this field instead of the '''album''' field to correctly work. * '''artist''': Name of the album's performer. As for the ''album'' parameter, odd spellings and clever stylings (e.g., Ke$ha) can make this parameter difficult to correctly determine. The German chart, for example, typically requires names in lastname,firstname format. Make sure to check the resulting reference URL (Preview) before saving the definitive version of the article. Also note that this parameter is required for all charts where you are reusing the references using the default naming (see below). If you use the ''refname'' parameter, however, ''artist'' may not be absolutely necessary. * '''id''': Numeric identifier used by some chart listings (see [[Polish Music Charts]]). Determined by performing a search at the chart listings' website for archive chart. The ''chartid'' can be found in the Web address (URL) by inspection. For example, Polish Airplay Chart of 12 November 2011 at www.zpav.pl has the URL http://www.zpav.pl/rankingi/listy/nielsen/top5.php?lang=2&idlisty=532, so the ''chartid'' to use is 532. * '''url''': The URL of the reference where you found the song's peak position for the chart. Used only for particular charts (see Support tables) where there is no indexing system, not necessary (or even used) for others. * '''urltitle''': The title of the page for the reference where you found the song's peak position for the chart. Used in combination with the ''url'' parameter, and only for particular charts (see Support tables) where there is no indexing system, not necessary (or even used) for others. * '''date''': Date of the chart in the format YYYYMMDD, an 8-digit number indicating year (Y), month (M) and day (D). Used only for certain charts, as part of their URL strings (see Frenchdigital below); not necessary (or even used) for others. This date is used solely to create the reference URL to the download chart, and is not displayed textually in the references list. For general citation of any chart's publication date, use the optional ''publish-date'' parameter. * '''year''': Four-digit year indicating the year being reported by the chart. Used in combination with the ''week'' parameter and only for certain charts; not necessary (or even used) for others. Not necessarily the same as the publication date referred to by ''publish-date''. * '''week''': Two-digit week indicating the week being reported by the chart. ''Week'' is a number from 01 to 53, with a leading 0 for weeks 01-09 (some charts do not require the leading zero; consult [[#Supports|Support]] tables below). Used in combination with the ''year'' parameter and only for certain charts; not necessary (or even used) for others. Not necessarily related to the publication date referred to by ''publish-date''. * '''note''': For adding a note about a particular version of an album, e.g., <code>note=2-disc deluxe edition</code>, or <code><nowiki>{{Album chart|Australia|1|album=Making Mirrors|artist=Gotye|note=2-disc deluxe edition}}</nowiki></code>. * '''publish-date''': Date of publication of the reference generated by the template, in the same format as other [[MOS:DATES#Dates|dates]] in citations in the same article. Optional parameter. * '''access-date''': Date that the reference generated by the template was retrieved to determine peak position (i.e., last date an editor verified this citation). Should be in the same format as other dates in citations in the same article. Optional parameter. * '''refname''': Enables you to specify a name for the reference generated by the template. If no value is provided for ''refname'' the default reference name (in the form ac_Chartid_artist) will be used. A reference with a name can be [[WP:NAMEDREFS|reused]] for claims elsewhere in the article. Optional parameter. * '''refgroup''': Enables you to specify a name for the reference group. Optional parameter. * '''rowheader''': An optional statement to identify the cell that contains this template with {{code|1=scope=row}}. This should be present in almost all cases. == Supports == === National charts === {| class="wikitable sortable" border="1" |+Supported international charts ! scope="col"| Chart ID ! scope="col"| Output ! scope="col" class="unsortable" | Website used as archive ! scope="col" class="unsortable" | Req. ! scope="col" class="unsortable" | Notes |- !scope="row"| Argentina | Argentinian Albums ([[CAPIF]]) ||align="center"| adminlic.capif.org.ar ||align="center"| artist<br>album<br>date || date must be in the format: DD/MM/YYYY. Charts available from 7 February 2010 onwards. When manual referencing is activated, write the date always as DD/MM/YYYY, otherwise, the template may return an error. |- !scope="row"| Australia | Australian Albums ([[ARIA Charts|ARIA]]) ||align="center"| www.australian-charts.com ||align="center"| artist<br>album || |- !scope="row"| Austria | Austrian Albums ([[Ö3 Austria Top 40|Ö3 Austria]]) ||align="center"| www.austriancharts.at ||align="center"| artist<br> album || |- !scope="row"| Flanders | Belgian Albums ([[Ultratop]] Flanders) ||align="center"| www.ultratop.be ||align="center"| artist<br> album || |- !scope="row"| Wallonia | Belgian Albums ([[Ultratop]] Wallonia) ||align="center"| www.ultratop.be ||align="center"| artist<br> album || |- !scope="row"| Brazil | Brazilian Albums ([[Pro-Música Brasil|PMB]]) ||align="center"| www.abpd.org.br ||align="center"| id || ''id'' is the number(s) at the end of the URL. For example, the id of http://www.abpd.org.br/noticias_internas.asp?noticia=168 is 168 |- !scope="row"| Canada | Canada Top Albums/CDs (''RPM'') ||align="center"| www.bac-lac.gc.ca/ || align="center" | chartid || ''chartid'' is the number present after nlcxxxxx.<br> For example in [http://www.bac-lac.gc.ca/eng/discover/films-videos-sound-recordings/rpm/Pages/image.aspx?Image=nlc008388.2647&URLjpg=http%3a%2f%2fwww.collectionscanada.gc.ca%2fobj%2f028020%2ff4%2fnlc008388.2647.gif&Ecopy=nlc008388.2647 this example], the chartid is 2647. |- !scope="row"| CroatiaCombined | Croatian Albums ([[Top of the Shops|HDU]]) ||align="center"| www.hdu-toplista.com ||align="center"| id || ''id'' is the number(s) at the end of the URL.<br> For example, the id of http://www.hdu-toplista.com/index.php?what=arhiva&w=details&id=1562 is 1562 |- !scope="row"| Croatia | Croatian International Albums ([[Top of the Shops|HDU]]) ||align="center"| www.hdu-toplista.com ||align="center"| id || ''id'' is the number(s) at the end of the URL.<br> For example, the id of http://www.hdu-toplista.com/index.php?what=arhiva&w=details&id=881 is 881 |- !scope="row"| Czech | Czech Albums ([[IFPI|ČNS IFPI]]) ||align="center"| www.ifpicr.cz ||align="center"| artist<br>album<br>week|| ''week'' is the number at the end of the url. For example, for https://ifpicr.cz/hitparada/14?weekId=2750 use 2570 |- !scope="row"| Denmark | Danish Albums ([[Hitlisten]]) ||align="center"| www.danishcharts.com ||align="center"| artist<br>album || Not recommended for charts prior to Nov. 2007; use instead '''Denmark2'''. |- !scope="row"| Denmark2 | Danish Albums ([[Hitlisten]]) ||align="center"| www.hitlisten.nu ||align="center"| week<br>year || For album charts prior to Nov. 2007, is better to use this Chart ID. |- !scope="row"| Finland | Finnish Albums ([[Official Finnish Charts|Suomen virallinen lista]]) ||align="center"| www.ifpi.fi ||align="center"| artist<br>album || |- !scope="row"| France | French Albums ([[SNEP]]) ||align="center"| www.lescharts.com ||align="center"| artist<br>album || |- !scope="row"| Germany | German Albums ([[GfK Entertainment charts|Offizielle Top 100]]) ||align="center"| www.offiziellecharts.de ||align="center"| id<br>artist<br>album || ''id'' is the number(s) at the end of the URL.<br> For example, the id of https://www.offiziellecharts.de/album-details-233637 is 233637 |- !scope="row"| {{deleted text|Germany3}} | German Albums ([[GfK Entertainment charts|Offizielle Top 100]]) ||align="center"| www.officialcharts.de ||align="center"| artist<br>album |- !scope="row"| GermanyComp | German Compilation Albums ([[GfK Entertainment charts|Offizielle Top 100]]) ||align="center"| www.charts.de ||align="center"| year<br>date || This website, instead of retrieving a complete chart history, it returns a weekly chart. <br/>The ''date'' parameter must be filled as this: YYYYMMDD. It contains chart info from 1992 onwards. |- !scope="row"| Greece | Greek Albums ([[IFPI Greece|IFPI]]) ||align="center"| www.greekcharts.com ||align="center"| artist<br>album || This website only contains chart information from 2010 to week 31/2011. |- !scope="row"| Hungary | Hungarian Albums ([[Association of Hungarian Record Companies|MAHASZ]]) ||align="center"| www.mahasz.hu ||align="center"| year<br>week || |- !scope="row"| HungaryComp | Hungarian Compilation Albums ([[Association of Hungarian Record Companies|MAHASZ]]) ||align="center"| www.mahasz.hu ||align="center"| year<br>week || Since 2000, under the main albums chart. |- !scope="row"| {{deleted text|Ireland}} | Irish Albums ([[Irish Recorded Music Association|IRMA]]) ||align="center"| www.chart-track.co.uk ||align="center"| year<br>week || Obsolete {{deleted text|Only from 2000 to 2016}} |- !scope="row"| Ireland2 | Irish Albums ([[Irish Recorded Music Association|IRMA]]) ||align="center"| www.irish-charts.com ||align="center"| artist || |- !scope="row"| Ireland3 | Irish Albums ([[Official Charts Company|OCC]]) ||align="center"| www.officialcharts.com ||align="center"| artist<br>date || Official Irish Albums Chart Top 50 archive from January 6, 2017 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.officialcharts.com/charts/irish-albums-chart/ the archives of the OCC]. |- !scope="row"| {{deleted text|IrelandClassical}} | Irish Classical Albums ([[Irish Recorded Music Association|IRMA]]) ||align="center"| www.chart-track.co.uk ||align="center"| year<br>week || Obsolete |- !scope="row"| {{deleted text|IrelandComp}} | Irish Compilation Albums ([[Irish Recorded Music Association|IRMA]]) ||align="center"| www.chart-track.co.uk ||align="center"| year<br>week || Obsolete |- !scope="row"| {{deleted text|IrelandIndependent}} | Irish Independent Albums ([[Irish Recorded Music Association|IRMA]]) ||align="center"| www.chart-track.co.uk ||align="center"| year<br>week || Obsolete |- !scope="row"| Italy | Italian Albums ([[Federazione Industria Musicale Italiana|FIMI]]) ||align="center"| www.italiancharts.com ||align="center"| artist<br>album || |- !scope="row"| Korea | South Korean Albums ([[Gaon Music Chart|Gaon]]) ||align="center"| www.gaonchart.co.kr ||align="center"| date || Overall albums (national and foreign). The ''date'' must be in the format: YYYY.MM.DD~YYYY.MM.DD, which can be retrieved from [http://gaonchart.co.kr/main/section/chart/album.gaon?nationGbn=T the Gaon page]. |- !scope="row"| KoreaNat | South Korean National Albums ([[Gaon Music Chart|Gaon]]) ||align="center"| www.gaonchart.co.kr ||align="center"| date || Only albums by '''Korean artists''' included here. The ''date'' must be in the format: YYYY.MM.DD~YYYY.MM.DD, which can be retrieved from [http://gaonchart.co.kr/main/section/chart/album.gaon?nationGbn=K the Gaon page]. |- !scope="row"| KoreaInt | South Korean International Albums ([[Gaon Music Chart|Gaon]]) ||align="center"| www.gaonchart.co.kr ||align="center"| date || Only albums from '''foreign artists''' included here. The ''date'' must be in the format: YYYY.MM.DD~YYYY.MM.DD, which can be retrieved from [http://gaonchart.co.kr/main/section/chart/album.gaon?nationGbn=E the Gaon page]. |- !scope="row"| Mexico | Mexican Albums ([[Top 100 Mexico]]) ||align="center"| www.mexicancharts.com ||align="center"| artist<br>album || The site contains chart information until the week 49, 2011. After that date, no information is available. Information beyond that week must be added with the Mexico2 ChartID. |- !scope="row"| Mexico2 | Mexican Albums ([[Top 100 Mexico]]) ||align="center"| www.amprofon.com.mx ||align="center"| artist<br>album<br>archiveurl<br>archivedate || This ID needs the chart to be archived to secure future verifiability. That means, it must be used archiving the URL [http://www.centrodedesarrollodigital.com/amprofon3/Top100.pdf] with either [[WebCite]] or any other archiving method. Then, providing the parameters needed on the template. This might only be done if the peak position is beyond the week 49, 2011 and uptill week18, 2013. Since May 2013, some positions of the chart are published in the official Twitter account of AMPROFON including the number one position.<br/> All parameters are mandatory. Archiving the PDF file or finding the arhived URL is highly recommended. On ''archiveurl'' the WebCite URL must be written. |- !scope="row"| Netherlands | Dutch Albums ([[MegaCharts]]) ||align="center"| www.dutchcharts.nl ||align="center"| artist<br>album || |- !scope="row"| NetherlandsComp | Dutch Compilation Albums ([[MegaCharts]]) ||align="center"| www.dutchcharts.nl ||align="center"| artist<br>album<br>year<br>date || For this ID, the ''date'' and ''year'' parameters are mandatory. ''date'' must be in this format:YYYYMMDD. |- !scope="row"| New Zealand | New Zealand Albums ([[Recorded Music NZ]]) ||align="center"| www.charts.nz ||align="center"| artist<br>album || |- !scope="row"| Norway | Norwegian Albums ([[VG-lista]]) ||align="center"| www.norwegiancharts.com ||align="center"| artist<br>album || |- !scope="row"| Oricon | Japanese Albums ([[Oricon]]) ||align="center"| www.oricon.co.jp ||align="center"| date || This is the Oricon Top 50 Albums chart. It is in Japanese and the only parameter needed is the ''date''.<br> The ''date'' must follow this format: YYYY-MM-DD. |- !scope="row"| Poland | Polish Albums ([[Polish Society of the Phonographic Industry|ZPAV]]) ||align="center"| olis.onyx.pl ||align="center"| id || ''id'' is the number(s) at the end of the URL.<br> For example, the id of http://olis.onyx.pl/listy/index.asp?idlisty=708 is 708 |- !scope="row"| Poland2 | Polish Albums ([[Polish Society of the Phonographic Industry|ZPAV]]) ||align="center"| www.olis.pl ||align="center"| date || ''date'' in the format dd.mm.yyyy used for specifying the date of the chart for manual searching. |- !scope="row"| Portugal | Portuguese Albums ([[Associação Fonográfica Portuguesa|AFP]]) ||align="center"| www.portuguesecharts.com ||align="center"| artist<br>album || |- !scope="row"| Switzerland | Swiss Albums ([[Swiss Music Charts|Schweizer Hitparade]]) ||align="center"| www.swisscharts.com ||align="center"| artist<br>album || |- !scope="row"| Sweden | Swedish Albums ([[Sverigetopplistan]]) ||align="center"| www.swedishcharts.com ||align="center"| artist<br>album || |- !scope="row"| Spain | Spanish Albums ([[Productores de Música de España|PROMUSICAE]]) ||align="center"| www.spanishcharts.com ||align="center"| artist<br>album || |- |} === UK charts === {| class="wikitable sortable" border="1" |+British charts !scope="col"|Chart ID !scope="col"|Output !scope="col"|Requirements !scope="col"|Notes |- !scope="row"| UK | [[Official Albums Chart|UK Albums]] ([[Official Charts Company|OCC]]) ||align="center"| artist || As with ''Billboard'' charts, this URL returns the complete album chart history for the selected artist. |- !scope="row"| UK2 | [[Official Albums Chart|UK Albums]] ([[Official Charts Company|OCC]]) ||align="center"| date || UK Top 100 Albums archive from 22 July 1956 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.officialcharts.com/charts/albums-chart/ the archives of the OCC]. |- !scope="row"| UKAmericana | [[Official Americana Albums Chart|UK Americana Albums]] ([[Official Charts Company|OCC]]) ||align="center"| artist<br>date || Americana albums archive from 29 January 2016 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.officialcharts.com/charts/americana-albums-chart/ the archives of the OCC]. |- !scope="row"| UKComp | [[UK Compilation Chart|UK Compilation Albums]] ([[Official Charts Company|OCC]]) ||align="center"| artist<br>date || Compilation albums archive from 6 February 1994 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.officialcharts.com/charts/official-compilations-chart/ the archives of the OCC]. |- !scope="row"| UKCountry | UK Country Albums ([[Official Charts Company|OCC]]) ||align="center"| artist<br>date || Country albums archive from 30 January 1994 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.officialcharts.com/charts/country-artists-albums-chart/ the archives of the OCC]. |- !scope="row"| UKDance | [[UK Dance Chart|UK Dance Albums]] ([[Official Charts Company|OCC]]) ||align="center"| artist<br>date || Dance albums archive from 25 September 2005 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.officialcharts.com/charts/dance-albums-chart/ the archives of the OCC]. |- !scope="row"| UKDigital | [[UK Album Downloads Chart|UK Digital Albums]] ([[Official Charts Company|OCC]]) ||align="center"| artist<br>date || Digital albums archive from 9 April 2006 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.officialcharts.com/charts/albums-downloads-chart/ the archives of the OCC]. |- !scope="row"| UKIndependent | [[UK Indie Chart|UK Independent Albums]] ([[Official Charts Company|OCC]]) ||align="center"| artist<br>date || Independent albums archive from 12 October 1997 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.officialcharts.com/charts/independent-albums-chart/ the archives of the OCC]. |- !scope="row"| UKJazz | UK Jazz & Blues Albums ([[Official Charts Company|OCC]]) ||align="center"| date || Jazz & blues albums archive from 30 January 1994 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.officialcharts.com/charts/jazz-and-blues-albums-chart/ the archives of the OCC]. |- !scope="row"| UKProgressive | UK Progressive Albums ([[Official Charts Company|OCC]]) ||align="center"| artist<br>date || Progressive albums archive from 7 October 2015 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.officialcharts.com/charts/progressive-albums-chart/ the archives of the OCC]. |- !scope="row"| UKR&B | [[UK R&B Chart|UK R&B Albums]] ([[Official Charts Company|OCC]]) ||align="center"| artist<br>date || R&B albums archive from 9 October 1994 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.officialcharts.com/charts/r-and-b-albums-chart/ the archives of the OCC]. |- !scope="row"| UKRock | [[UK Rock Chart|UK Rock & Metal Albums]] ([[Official Charts Company|OCC]]) ||align="center"| date || Rock & metal albums archive from 9 October 1994 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.officialcharts.com/charts/rock-and-metal-albums-chart/ the archives of the OCC]. |- !scope="row"| UKSoundtrack | UK Soundtrack Albums ([[Official Charts Company|OCC]]) ||align="center"| date || Soundtrack albums archive from 13 January 2002 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.officialcharts.com/charts/soundtrack-albums-chart/ the archives of the OCC]. |- !scope="row"| Scotland | [[Scottish Singles and Albums Charts|Scottish Albums]] ([[Official Charts Company|OCC]]) ||align="center"| artist<br>date || Scottish albums archive from 27 February 1994 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.officialcharts.com/charts/scottish-albums-chart/ the archives of the OCC]. |- !scope="row"| UKZobbel | UK Albums ([[Official Charts Company|OCC]]) ||align="center"| id || This uses Zobbel.de. ''date'' is in the YYMMDD format (supports charts from 15.01.2005 to 30.01.2016). |- |} === US charts === {| class="wikitable sortable" border="1" |+American charts !scope="col"|Chart ID !scope="col"|Output !scope="col"|Requirements !scope="col"|Notes |- !scope="row"| US | [[RIAA Albums Chart|US Albums]] ([[RIIA Charts|RIAA]]) ||align="center"| artist || As with ''Billboard'' charts, this URL returns the complete album chart history for the selected artist. |- !scope="row"| US2 | [[RIAA Albums Chart|US Albums]] ([[RIAA Charts|RIAA]]) ||align="center"| date || US Top 100 Albums archive from July 22, 1956 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.riaa.com/charts/albums-chart/ the archives of the RIAA]. |- !scope="row"| USAmericana | [[RIAA Americana Albums Chart|US Americana Albums]] ([[RIAA Charts|RIAA]]) ||align="center"| artist<br>date || Americana albums archive from January 29, 2016 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.riaa.com/charts/americana-albums-chart/ the archives of the RIAA]. |- !scope="row"| USComp | [[US Compilation Chart|US Compilation Albums]] ([[RIAA Charts|RIAA]]) ||align="center"| artist<br>date || Compilation albums archive from February 6, 1994 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.riaa.com/charts/riaa-compilations-chart/ the archives of the RIAA]. |- !scope="row"| USCountry | US Country Albums ([[RIAA Charts|RIAA]]) ||align="center"| artist<br>date || Country albums archive from January 30, 1994 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.riaa.com/charts/country-artists-albums-chart/ the archives of the RIAA]. |- !scope="row"| USDance | [[US Dance Chart|US Dance Albums]] ([[RIAA Charts|RIIA]]) ||align="center"| artist<br>date || Dance albums archive from September 25, 2005 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.riaa.com/charts/dance-albums-chart/ the archives of the RIAA]. |- !scope="row"| USDigital | [[US Album Downloads Chart|US Digital Albums]] ([[RIAA Charts|RIAA]]) ||align="center"| artist<br>date || Digital albums archive from April 9, 2006 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.riaa.com/charts/albums-downloads-chart/ the archives of the RIAA]. |- !scope="row"| USIndependent | [[US Indie Chart|US Independent Albums]] ([[RIAA Charts|RIAA]]) ||align="center"| artist<br>date || Independent albums archive from October 12, 1997 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.riaa.com/charts/independent-albums-chart/ the archives of the RIAA]. |- !scope="row"| USJazz | US Jazz & Blues Albums ([[RIAA Charts|RIAA]]) ||align="center"| date || Jazz & blues albums archive from January 30, 1994 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.riaa.com/charts/jazz-and-blues-albums-chart/ the archives of the RIAA]. |- !scope="row"| USProgressive | US Progressive Albums ([[RIAA Charts|RIAA]]) ||align="center"| artist<br>date || Progressive albums archive from October 7, 2015 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.riaa.com/charts/progressive-albums-chart/ the archives of the RIAA]. |- !scope="row"| USR&B | [[US R&B Chart|US R&B Albums]] ([[RIAA Charts|RIAA]]) ||align="center"| artist<br>date || R&B albums archive from October 9, 1994 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.riaa.com/charts/r-and-b-albums-chart/ the archives of the RIAA]. |- !scope="row"| USRock | [[US Rock Chart|US Rock & Metal Albums]] ([[RIAA Charts|RIAA]]) ||align="center"| date || Rock & metal albums archive from October 9, 1994 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.riaa.com/charts/rock-and-metal-albums-chart/ the archives of the RIAA]. |- !scope="row"| USSoundtrack | US Soundtrack Albums ([[RIAA Charts|RIAA]]) ||align="center"| date || Soundtrack albums archive from January 13, 2002 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.riaa.com/charts/soundtrack-albums-chart/ the archives of the RIAA]. |- !scope="row"| Canada2 | [[Canada Singles and Albums Charts|Canada Albums]] ([[RIAA Charts|RIAA]]) ||align="center"| artist<br>date || Canada albums archive from February 27, 1994 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.riaa.com/charts/canada-albums-chart/ the archives of the RIAA]. |- !scope="row"| USZobbel | US Albums ([[RIAA Charts|RIAA]]) ||align="center"| id || This uses Zobbel.de. ''date'' is in the YYMMDD format (supports charts from 01.15.2005 to 01.30.2016). |- |} ===''Billboard'' charts=== ''Billboard'' charts all require the artist name. Special characters should be omitted from the artist's name to be passed correctly into the URL. For example, *{{tlc|Album chart|Billboard200|1|4=artist=Pnk}} is the syntax for citing a number 1 position on the ''Billboard'' 200 for P!nk. The reference generated by the template will point to the following URL: http://www.billboard.com/music/pnk/chart-history/billboard-200. *Entering the artist name as "P!nk" will produce an invalid URL (http://www.billboard.com/music/p!nk/chart-history/billboard-200). {| class="wikitable sortable" border="1" |+''Billboard'' chart entries !scope="col"| Chart ID !scope="col"| Output !scope="col"| Requirements !scope="col"| Notes |- !scope="row"| Billboard200 | US [[Billboard 200|''Billboard'' 200]] ||align="center"| artist || |- !scope="row"| BillboardAlbumSales | US [[Top Album Sales]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardDigital | US [[Digital Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardDanceElectronic | US [[Top Dance Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardRandBHipHop | US [[Top R&B/Hip-Hop Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardRandB | US [[Top R&B Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardRap | US [[Top Rap Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardRock | US [[Top Rock Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardAlternative | US [[Top Alternative Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardHardRock | US [[Top Hard Rock Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardFolk | US [[Americana/Folk Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardCountry | US [[Top Country Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardBluegrass | US [[Top Bluegrass Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardJazz | US [[Top Jazz Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardContemporaryJazz | US [[Top Contemporary Jazz Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardBlues | US [[Top Blues Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardClassical | US [[Top Classical Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardClassicalCrossover | US [[Top Classical Crossover Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardLatin | US [[Top Latin Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardRegionalMexican | US [[Regional Mexican Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardLatinPop | US [[Latin Pop Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardTropical | US [[Tropical Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardChristian | US [[Christian Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardGospel | US [[Top Gospel Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardHoliday | US [[Top Holiday Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardHeatseekers | US [[Heatseekers Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardIndependent | US [[Independent Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardCatalog | US [[Top Catalog Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardReggae | US Top Reggae Albums (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardWorld | US World Albums (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardComedy | US [[Top Comedy Albums]] (''Billboard'') ||align="center"| artist || |- <!-- | BillboardKids || US [[Kid Albums]] (''Billboard'') ||align="center"| artist || not handled in template --> |- !scope="row"| BillboardSoundtrack | US Soundtrack Albums (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardTastemaker | US Indie Store Album Sales (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardVinyl | US [[Top Vinyl Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardCanada | [[Billboard Canadian Albums|Canadian Albums]] (''Billboard'') ||align="center"| artist || |- <!-- | BillboardNewAge || US New Age Albums (''Billboard'') ||align="center"| artist || not handled in template --> !scope="row"| BillboardLatinRhythm | US [[Latin Rhythm Albums]] (''Billboard'') ||align="center"| artist || |- !scope="row"| BillboardCurrentAlbums | US [[Top Current Album Sales]] (''Billboard'') ||align="center"| artist || |- |} ===Music DVD charts=== The following Chart IDs are for Music DVDs. These are different from Live albums and some charts defines them separately. The editor must be extremely careful with the naming when using some of the following IDs. {| class="wikitable" |+Music DVD sales charts !scope="col"| Chart ID !scope="col"| Output !scope="col"| Website used as archive !scope="col"| Req. !scope="col"| Notes |- !scope="row"| AustraliaMV | Australian Music DVD ([[ARIA Charts|ARIA]]) ||align="center"| www.ariacharts.com.au ||align="center"| artist<br>dvd<br>archiveurl<br>archivedate || This ID needs the chart to be archived to secure future verifiability. That means, it must be used archiving the URL [http://www.ariacharts.com.au/pages/charts_display_music.asp?chart=1V40DVD] with either [[WebCite]] or any other archiving method. Then, providing the parameters needed on the template. On ''archiveurl'' the WebCite URL must be written, and on ''url'' the original given above. |- !scope="row"| AustriaMV | Austrian Music DVD ([[Ö3 Austria Top 40|Ö3 Austria]]) ||align="center"| www.austriancharts.at ||align="center"| date || The ''date'' parameter must be provided in the DD-MM-YYYY format. |- !scope="row"| FlandersMV | Belgian Music DVD ([[Ultratop]] Flanders) ||align="center"| www.ultratop.be ||align="center"| artist<br>album<br>dvd <br><br>'''or'''<br><br>year<br>date<br>startdate || Don't forget to check as some albums have the [DVD] tag after the name (example: The Reel Me [DVD]). In that case, use the '''dvd''' parameter instead of the '''album''' parameter. <br><br> Alternatively, if the title has a special character that cannot be hyperlinked to, you can reference an archived version of the DVD chart by providing the ''year'' and the ''date'' (in YYYYMMDD format). The ''startdate'' parameter is the same date as the ''date'' parameter but in a different format for purposes of the reference's hyperlink text; ''startdate'' should be in a "DD/MM/YYYY" format. |- !scope="row"| WalloniaMV | Belgian Music DVD ([[Ultratop]] Wallonia) ||align="center"| www.ultratop.be ||align="center"| artist<br>album<br>dvd <br><br>'''or'''<br><br>year<br>date<br>startdate || Don't forget to check as some albums have the [DVD] tag after the name (example: The Reel Me [DVD]). In that case, use the '''dvd''' parameter instead of the '''album''' parameter. <br><br> Alternatively, if the title has a special character that cannot be hyperlinked to, you can reference an archived version of the DVD chart by providing the ''year'' and the ''date'' (in YYYYMMDD format). The ''startdate'' parameter is the same date as the ''date'' parameter but in a different format for purposes of the reference's hyperlink text; ''startdate'' should be in a "DD/MM/YYYY" format. |- !scope="row"| DenmarkMV | Danish Music DVD ([[Hitlisten]]) ||align="center"| www.hitlisten.nu ||align="center"| week<br>year || |- !scope="row"| FinlandMV | Finnish Music DVD ([[The Official Finnish Charts|Suomen virallinen lista]]) ||align="center"| www.ifpi.fi ||align="center"| artist<br>album || |- !scope="row"| FranceMV | French Music DVD ([[SNEP]]) ||align="center"| www.chartsinfrance.net ||align="center"| artist<br>dvd<br>id || The ''id'' parameter can be found searching on the archive before selecting the year: For example [http://www.chartsinfrance.net/charts/1544/videos-musicales.php http://www.chartsinfrance.net/charts/'''1544'''/videos-musicales.php]. |- !scope="row"| ItalyMV | Italian Music DVD ([[Federazione Industria Musicale Italiana|FIMI]]) ||align="center"| www.fimi.it ||align="center"| year<br>week<br>startdate<br>enddate || The ''startdate'' and ''enddate'' parameters are for purposes of the reference's hyperlink text. They are in a "DD.MM.YYYY" format. |- !scope="row"| IrelandMV | Irish Music Videos ([[Official Charts Company|OCC]]) ||align="center"| www.officialcharts.com ||align="center"| artist<br>date || Irish Video Chart Top 50 archive from January 6, 2017 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.officialcharts.com/charts/irish-video-chart/ the archives of the OCC]. |- !scope="row"| NetherlandsMV | Dutch Music DVD ([[MegaCharts]]) ||align="center"| www.dutchcharts.nl ||align="center"| artist<br>album<br>dvd || Don't forget to check as some albums have the [DVD] tag after the name (example: The Reel Me [DVD]). In that case, use the '''dvd''' parameter instead of the '''album''' parameter. |- !scope="row"| SpainMV | Spanish Music DVD ([[Productores de Música de España|PROMUSICAE]]) ||align="center"| www.promusicae.es ||align="center"| year<br>week || The ''year'' parameter must contain the year from which the charting took place by scrolling in [http://www.promusicae.es/listas/semanales this URL]. The ''week'' parameter must be in numbers. Example: 06 for June. |- !scope="row"| SwedenMV | Swedish Music DVD ([[Sverigetopplistan]]) ||align="center"| www.sverigetopplistan.se ||align="center"| year<br>week || The URL contains six numbers, in which the first four digits are the year and the last two are the week. Example: https://www.sverigetopplistan.se/chart/105?dspy=2006&dspp=39 |- !scope="row"| SwitzerlandMV | Swiss Music DVD ([[Swiss Hitparade|Schweizer Hitparade]]) ||align="center"| www.swisscharts.com ||align="center"| date || The ''date'' parameter must be provided in the DD-MM-YYYY format. |- !scope="row"| UKMV | UK Music Videos ([[Official Charts Company|OCC]]) ||align="center"| www.officialcharts.com ||align="center"| artist<br>date || Music Video Chart Top 50 archive from January 30, 1994 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.officialcharts.com/charts/music-video-chart/ the archives of the OCC]. |- !scope="row"| USMV | US Music Videos (''Billboard'') ||align="center"| www.billboard.biz ||align="center"| artist<br>date || Music Video Sales chart archive from 1980 onwards.<br/> The ''date'' parameter must be provided in the YYYY-MM-DD format, which is the issue date that can be found on [http://www.billboard.com/biz/charts/2015-02-07/music-video the URL after clicking here]. |- !scope="row"| USMV2 | US Music Videos ([[RIAA Charts|RIAA]]) ||align="center"| www.riaa.com ||align="center"| artist<br>date || Music Video Chart Top 50 archive from January 30, 1994 onwards.<br/> The ''date'' parameter must be provided in the YYYYMMDD format, which is the issue date that can be found on [http://www.riaa.com/charts/music-video-chart/ the archives of the RIAA]. |} ==Examples with table layout== ===Example with dummy data=== Since this template produces only individual rows within a table, you will need to add (or already have) the table's framework in the article. Here is an example table with its corresponding output: <syntaxhighlight lang="wikitext">{| class="wikitable sortable plainrowheaders" |+Example album chart ! scope="col"| Chart ! scope="col"| Peak<br />position |- ! scope="row"| row 1, cell 1 | row 1, cell 2 |- ! scope="row"| row 2, cell 1 | row 2, cell 2 |- {{Album chart|Billboard200|2|artist=Paramore|rowheader=true}} |- {{Album chart|BillboardRock|1|artist=Paramore|rowheader=true}} |} {{reflist}}</syntaxhighlight> Expands into: {| class="wikitable sortable plainrowheaders" |+Example album chart ! scope="col"| Chart ! scope="col"| Peak<br />position |- ! scope="row"| row 1, cell 1 | row 1, cell 2 |- ! scope="row"| row 2, cell 1 | row 2, cell 2 |- {{Album chart|Billboard200|2|artist=Paramore|rowheader=true}} |- {{Album chart|BillboardRock|1|artist=Paramore|rowheader=true}} |} <references/> ===Example with realistic data=== Example using chart data from [[Homework (Daft Punk album)|''Homework'' (Daft Punk album)]]: <syntaxhighlight lang="wikitext">{| class="wikitable sortable plainrowheaders" |+Chart performance for ''Homework'' ! scope="col"| Chart (1997) ! scope="col"| Peak<br />position |- {{Album chart|Australia|37|artist=Daft Punk|album=Homework|refname=ARIA|access-date=30 May 2012|rowheader=true}} |- {{Album chart|Norway|40|artist=Daft Punk|album=Homework|refname=HungM|access-date=30 May 2012|rowheader=true}} |- {{Album chart|New Zealand|8|artist=Daft Punk|album=Homework|refname=HungM2|access-date=30 May 2012|rowheader=true}} |- {{Album chart|Netherlands|25|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|Austria|34|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|Flanders|7|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|Wallonia|9|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|BillboardCanada|15|artist=Daft Punk|access-date=30 May 2012|rowheader=true}} |- {{Album chart|Finland|34|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|France|3|refname=FAC|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|Sweden|16|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|UK|8|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|US|8|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|Billboard200|150|artist=Daft Punk|access-date=30 May 2012|rowheader=true}} |} {{reflist}}</syntaxhighlight> Expands into: {| class="wikitable sortable plainrowheaders" |+Chart performance for ''Homework'' ! scope="col"| Chart (1997) ! scope="col"| Peak<br />position |- {{Album chart|Australia|37|artist=Daft Punk|album=Homework|refname=ARIA|access-date=30 May 2012|rowheader=true}} |- {{Album chart|Norway|40|artist=Daft Punk|album=Homework|refname=HungM|access-date=30 May 2012|rowheader=true}} |- {{Album chart|New Zealand|8|artist=Daft Punk|album=Homework|refname=HungM2|access-date=30 May 2012|rowheader=true}} |- {{Album chart|Netherlands|25|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|Austria|34|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|Flanders|7|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|Wallonia|9|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|BillboardCanada|15|artist=Daft Punk|access-date=30 May 2012|rowheader=true}} |- {{Album chart|Finland|34|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|France|3|refname=FAC|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|Sweden|16|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|UK|8|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|US|8|artist=Daft Punk|album=Homework|access-date=30 May 2012|rowheader=true}} |- {{Album chart|Billboard200|150|artist=Daft Punk|access-date=30 May 2012|rowheader=true}} |} <references/> == Tracking category == This template will automatically categorize articles: * {{clc|Pages using album chart with unknown parameters}} – articles with unsupported parameters * "Album chart usages for X", where X is the chart identifier. This is used to keep track of template usage and to ease maintenance. See {{clc|Album chart usages}}. Note that alternate names are not handled gracefully, that is, each identifier is categorizes separately. == TemplateData == <templatedata> { "params": { "1": {}, "2": {}, "3": {}, "rowheader": {}, "url": {}, "title": {}, "location": {}, "work": {}, "page": {}, "date": {}, "publisher": {}, "access-date": {}, "accessdate": {}, "artist": {}, "publish-date": {}, "publishdate": {}, "refname": {}, "refgroup": {}, "note": {}, "id": {}, "album": {}, "chartid": {}, "week": {}, "year": {}, "address": {}, "archiveurl": {}, "archive-url": {}, "archivedate": {}, "archive-date": {}, "dvd": {}, "startdate": {}, "enddate": {} }, "paramOrder": [ "1", "2", "3", "rowheader", "url", "title", "location", "work", "page", "date", "publisher", "access-date", "accessdate", "artist", "publish-date", "publishdate", "refname", "refgroup", "note", "id", "album", "chartid", "week", "year", "address", "archiveurl", "archive-url", "archivedate", "archive-date", "dvd", "startdate", "enddate" ], "format": "inline" } </templatedata> ==See also== * {{tl|Single chart}}&nbsp;– counterpart of ''Album chart'' for chart positions for single releases. <includeonly>{{sandbox other|| <!-- Categories below this line; interwikis at Wikidata --> [[Category:Album templates]] [[Category:Record chart templates]] [[Category:Templates that add a tracking category]] [[Category:WikiProject Albums templates]] [[Category:Templates that generate named references]] }}</includeonly> 3fainaft5ywfxi4vj2nsh6kt8a2t83z Module:Music chart 828 174979 739134 2026-04-22T20:27:24Z ~2026-24668-01 73666 Created page with "local p = {} ------------------------------------------------------------------------------- -- Module:Music Chart -- Generates table rows for music chart positions with automatic references. -- Chart data stored in JSON files, referenced by key (e.g., "Australia"). -- -- Called via templates: -- {{Single chart|Australia|1|artist=...|song=...|...}} -- {{Album chart|Australia|1|artist=...|album=...|...}} -- {{Year-end single chart|Australia|1|artist=...|song=...|year=202..." 739134 Scribunto text/plain local p = {} ------------------------------------------------------------------------------- -- Module:Music Chart -- Generates table rows for music chart positions with automatic references. -- Chart data stored in JSON files, referenced by key (e.g., "Australia"). -- -- Called via templates: -- {{Single chart|Australia|1|artist=...|song=...|...}} -- {{Album chart|Australia|1|artist=...|album=...|...}} -- {{Year-end single chart|Australia|1|artist=...|song=...|year=2024|...}} -- {{Year-end album chart|Australia|1|artist=...|album=...|year=2024|...}} -- -- Template code: {{#invoke:Music chart|main|type=single}} -- Arguments passed automatically from template call. ------------------------------------------------------------------------------- --============================================================================= -- SECTION 1: CONFIGURATION -- All module settings in one place. Edit here to customize behavior. --============================================================================= local CONFIG = { --------------------------------------------------------------------------- -- TEXT OUTPUT --------------------------------------------------------------------------- -- Month names for {dateMDY} placeholder months = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, -- Human-readable names for chart types (used in error messages and categories) type_names = { single = "Single", album = "Album", ["year-end-single"] = "Year-end single", ["year-end-album"] = "Year-end album", }, --------------------------------------------------------------------------- -- POSITION VALIDATION --------------------------------------------------------------------------- -- Maximum allowed numeric position (1-200 typical for charts) max_position = 200, -- Accepted dash characters for "not charted" position -- en-dash (–) for enwiki, em-dash (—) for ruwiki, hyphen (-) as fallback -- For multiple: accepted_dashes = {"–", "—", "-"}, accepted_dashes = {"–"}, -- Error message templates errors = { prefix = 'ERROR in "%s": ', unknown_chart = 'Unknown chart "%s".', missing_params = "Missing parameters: %s.", invalid_date = "Invalid date format. Expected: %s.", invalid_year = "Invalid year format: %s. Expected 4 digits.", invalid_week = "Invalid week format: %s. Expected week 1–53 or combined weeks like 51+52.", missing_chart = "Missing parameter: chart.", missing_position = "Missing parameter: position.", invalid_position = "Invalid position: %s. Expected number 1–%d or dash (–).", manual_missing_url_title = "Manual mode (M) requires url and title parameters.", url_validation = "Invalid URL. Required domain: %s.", use_new_chart = "For this date range, use %s instead.", }, -- Warning templates (shown only in preview mode) warnings = { unused_params = 'WARNING: Unused parameters for "%s": %s.', -- chartkey, params unknown_params = 'WARNING: Unknown parameters for "%s": %s.', -- chartkey, params invalid_date_ref = "Date format should be %s.", }, -- Reference text templates text = { retrieved = "Retrieved %s.", -- %s = access-date archived = "Archived from [%s the original] on %s.", -- %s = archive-url, archive-date }, -- Category name templates -- %s placeholders filled with type name, chart key, param name categories = { usage = "%s chart usages for %s", -- type, chartkey named_ref = "%s chart making named ref", manual_ref = "%s chart using manual ref mode", defunct = "%s chart used with defunct chart", unknown_chart = "%s chart used with unknown chart", missing_params = "%s chart used with missing parameters", unknown_params = "Pages using %s chart with unknown parameters", unused_params = "%s chart with unused parameters", manual_missing_url_title = "%s chart with manual mode missing url or title", without_artist = "%s chart called without artist", without_song = "%s chart called without song", without_album = "%s chart called without album", -- checks both album and dvd invalid_position = "%s chart with invalid position", track_param = "%s chart %s without %s parameter", -- type, chartkey, param unsubstituted = "%s chart with unsubstituted parameters", }, --------------------------------------------------------------------------- -- CORE SETTINGS --------------------------------------------------------------------------- -- Default chart type when not specified default_type = "single", -- Path to JSON data files -- %s is replaced with chart type: "single", "album", "year-end-single", "year-end-album" json_path = "Module:Music chart/%s.json", -- Category namespace prefix category_prefix = "Category:", -- Format for {dateMDY} placeholder -- %M = month name, %d = day number, %Y = 4-digit year -- Example: "%M %d, %Y" with date 2024-01-15 → "January 15, 2024" date_format_mdy = "%M %d, %Y", -- Prefixes for auto-generated reference names (refname) -- Result: prefix_chartkey_artist (e.g., "sc_Australia_Beyoncé") ref_prefixes = { single = "sc", -- Single chart album = "ac", -- Album chart ["year-end-single"] = "ye", ["year-end-album"] = "ye", }, -- Where to display errors: "both" | "cell" | "ref" error_display = "both", -- Check for unknown parameters (not in CONFIG.params) check_unknown_params = true, -- Check for unused parameters (provided but not used by chart) check_unused_params = true, -- Optional wrapper for dates in references (access-date, publish-date, archive-date) -- nil = output dates as-is -- Use %s for date value (two %s if wrapper needs fallback) -- Examples: -- Optional template to reformat dates in references (access-date, archive-date). -- #time parses most date formats automatically (2025-01-15, January 15, 2025, 15.01.2025, etc.) -- #iferror returns original value if parsing fails (e.g., invalid or unusual format) -- Examples: -- "{{#iferror:{{#time:F j, Y|%s}}|%s}}" → "January 15, 2025" (MDY) -- "{{#iferror:{{#time:j F Y|%s}}|%s}}" → "15 January 2025" (DMY) -- nil → output date as-is without reformatting date_wrapper = nil, -- Date validation patterns (Lua patterns for each format) date_patterns = { ["DD-MM-YYYY"] = "^%d%d%-%d%d%-%d%d%d%d$", ["DD.MM.YYYY"] = "^%d%d%.%d%d%.%d%d%d%d$", ["DD/MM/YYYY"] = "^%d%d/%d%d/%d%d%d%d$", ["MM-DD-YYYY"] = "^%d%d%-%d%d%-%d%d%d%d$", ["YYMMDD"] = "^%d%d%d%d%d%d$", ["YYYY-MM-DD"] = "^%d%d%d%d%-%d%d%-%d%d$", ["YYYYMMDD"] = "^%d%d%d%d%d%d%d%d$", ["DD.MM.YYYY–DD.MM.YYYY"] = "^%d%d%.%d%d%.%d%d%d%d[–%-~]%d%d%.%d%d%.%d%d%d%d$", ["YYYY.MM.DD–YYYY.MM.DD"] = "^%d%d%d%d%.%d%d%.%d%d[–%-~]%d%d%d%d%.%d%d%.%d%d$", ["YYYYMMDD-YYYYMMDD"] = "^%d%d%d%d%d%d%d%d[%-~]%d%d%d%d%d%d%d%d$", }, -- Parameter aliases (canonical → alternatives) param_aliases = { ["access-date"] = {"accessdate"}, ["publish-date"] = {"publishdate"}, ["archive-url"] = {"archiveurl"}, ["archive-date"] = {"archivedate"}, }, -- Parameter groups for validation -- base: always allowed | content: chart-specific | manual: only with 3=M params = { base = { [1] = true, [2] = true, [3] = true, chart = true, type = true, position = true, refname = true, refgroup = true, rowheader = true, note = true, artist = true, song = true, album = true, dvd = true, ["access-date"] = true, ["publish-date"] = true, ["archive-url"] = true, ["archive-date"] = true, }, content = { date = true, year = true, week = true, startdate = true, enddate = true, artistid = true, songid = true, chartid = true, id = true, page = true, url = true, title = true, }, manual = { work = true, location = true, publisher = true, ["url-status"] = true }, }, --------------------------------------------------------------------------- -- OUTPUT FORMATS --------------------------------------------------------------------------- -- Cell prefixes cell_normal = "| ", cell_header = '!scope="row"| ', -- Position cell style position_style = 'style="text-align:center;"|', -- Note format note_format = "<br>''<small>%s</small>''", --------------------------------------------------------------------------- -- SHOW CHARTS SETTINGS (affect only showCharts output) --------------------------------------------------------------------------- -- Sort order for group (countries) and chart IDs: "abc" (alphabetical) or "keep" (JSON order) sort_order = "abc", -- Optional wrapper for Group column (country/region names) -- nil = output as-is -- Use %s for group name -- Examples: -- "{{Country|%s}}" → wraps in Country template -- "{{Flagicon|%s}} %s" → adds flag icon (two %s: for flag and name) group_wrapper = "{{Country|%s}}", } --============================================================================= -- SECTION 2: UTILITY FUNCTIONS --============================================================================= -- Get type display name local function getTypeName(chartType) return CONFIG.type_names[chartType] or chartType end -- Build category link local function catLink(pattern, ...) return string.format("[[" .. CONFIG.category_prefix .. pattern .. "]]", ...) end local function renderTableCellContent(frame, text) if type(text) ~= "string" then return text end if frame and string.find(text, "{{", 1, true) then return frame:preprocess(text) end return text end -- Build category link with sort key local function catLinkSort(pattern, sortKey, ...) local catName = string.format(pattern, ...) return string.format("[[%s%s|%s]]", CONFIG.category_prefix, catName, sortKey) end -- Check if arg has non-empty value local function hasArg(args, key) return args[key] and args[key] ~= "" end -- Helper to set error messages based on CONFIG.error_display local function setErrorDisplay(errMsg, currentInline, currentRef) local inline = currentInline or "" local inRef = currentRef or "" if CONFIG.error_display == "both" or CONFIG.error_display == "cell" then inline = inline .. errMsg end if CONFIG.error_display == "both" or CONFIG.error_display == "ref" then inRef = inRef .. errMsg end return inline, inRef end --============================================================================= -- SECTION 3: URL ENCODERS -- Encode parameter values for URLs. Selected via "encode" field in JSON. -- Encoding applies only to text params: artist, song, album, dvd -- -- Operations (in "encode" array): -- normalize - remove diacritics (é→e, ñ→n) -- ansi - Latin-1 encoding (é→%E9 instead of UTF-8 %C3%A9) -- lower - lowercase -- clean-symbols - remove special chars, keep alphanumeric and dash -- space-plus - space → + (default if no encode specified), full URL encoding -- space-dash - space → -, encode only non-ASCII (preserves $, ', etc.) -- space-url - space → %20 (standard URL encoding) -- -- Order in array doesn't matter - applied in fixed order: -- normalize → lower → clean-symbols → space replacement → URL encoding -- -- "encode" can be set at chart level or in multiple entries (entry overrides chart) --============================================================================= local Encoders = {} -- Remove diacritics using Unicode normalization (NFD decomposition) -- é → e + combining accent → remove combining → e local function removeDiacritics(s) -- NFD decomposes: é → e + ́ (combining acute) local decomposed = mw.ustring.toNFD(s) -- Remove combining diacritical marks (U+0300–U+036F) return mw.ustring.gsub(decomposed, "[\204\128-\205\175]", "") end -- Parse encode config (array or nil) into flags local function parseEncodeConfig(config) local flags = { ansi = false, normalize = false, lower = false, cleanSymbols = false, space = "+", spaceUrl = false } if not config then return flags end if type(config) == "string" then config = {config} end for _, op in ipairs(config) do if op == "ansi" then flags.ansi = true elseif op == "normalize" then flags.normalize = true elseif op == "lower" then flags.lower = true elseif op == "clean-symbols" then flags.cleanSymbols = true elseif op == "space-plus" then flags.space = "+" elseif op == "space-dash" then flags.space = "-" elseif op == "space-url" then flags.spaceUrl = true end end return flags end -- Main encode function function Encoders.encode(s, config) if not s then return "" end local flags = parseEncodeConfig(config) -- 1. Remove diacritics (é→e, ñ→n) if flags.normalize then s = removeDiacritics(s) end -- 2. Lowercase if flags.lower then s = string.lower(s) end -- 3. Clean (remove special chars, keep alphanumeric and dash) if flags.cleanSymbols then s = string.gsub(s, " ", "-") s = string.gsub(s, "(%d)[^%w%-](%d)", "%1-%2") -- 2.0 → 2-0 s = string.gsub(s, "[^%w%-]", "") return s -- clean mode doesn't need further encoding end -- 4. Handle & before space replacement s = string.gsub(s, "&", "%%26") -- 5. Space replacement + encoding if flags.spaceUrl then -- Standard URL encoding (space → %20) return mw.uri.encode(s, "PATH") elseif flags.ansi then -- Latin-1 (ISO-8859-1) encoding local r = "" for i = 1, mw.ustring.len(s) do local k = mw.ustring.codepoint(s, i, i) if k == 32 then r = r .. flags.space elseif k == 91 or k == 93 or k <= 32 or k > 126 then if k > 255 then -- UTF-8 multi-byte (Chinese, etc.) local char = mw.ustring.sub(s, i, i) for j = 1, #char do r = r .. string.format("%%%02X", char:byte(j)) end else -- Latin-1 single byte r = r .. string.format("%%%02X", k) end else r = r .. mw.ustring.sub(s, i, i) end end return r elseif flags.space == "-" then -- space-dash: replace spaces, encode only non-ASCII (preserve $, ', etc.) s = string.gsub(s, " ", "-") local r = "" for i = 1, mw.ustring.len(s) do local k = mw.ustring.codepoint(s, i, i) if k > 127 then -- Non-ASCII: UTF-8 encode local char = mw.ustring.sub(s, i, i) for j = 1, #char do r = r .. string.format("%%%02X", char:byte(j)) end else r = r .. mw.ustring.sub(s, i, i) end end return r else -- Default: space-plus with full URL encoding s = mw.uri.encode(s, "PATH") s = string.gsub(s, "%%20", "+") return s end end --============================================================================= -- SECTION 4: HELPER FUNCTIONS -- Special chart-specific logic called via "helper" field in JSON. -- Result available as {helper} placeholder in URL/title templates. -- -- To add new helper: -- 1. Add function Helpers.your_name(args) returning string -- 2. Add required params to Helpers.params["your_name"] -- 3. Use in JSON: "helper": "your_name", in URL: "{helper}" --============================================================================= local Helpers = {} Helpers.alternatives = { single = { Slovakdigital = "Slovakdigital2", Slovakia = "Slovakia2", }, } -- Required params for each helper (won't be flagged as "unused") Helpers.params = { south_africa_size = {"year", "week"}, australia_issue = {"url"}, bulgaria_date_range = {"url"}, germany_timestamp = {"date"}, czech_week_id = {"year", "week"}, israel_week = {"year", "week"}, } -- [single: Southafrica2] South Africa chart size changed over time: -- 2021-2022: 100 | 2023 w1-17: 100, w18+: 10 | 2024: 10 -- 2025 w1-12: 10, w13-37: 50, w38+: 20 | 2026+: 20 function Helpers.south_africa_size(args) local year, week = tonumber(args.year) or 0, tonumber(args.week) or 0 if year < 2023 then return "100" elseif year == 2023 then return week < 18 and "100" or "10" elseif year == 2024 then return "10" elseif year == 2025 then if week < 13 then return "10" elseif week < 38 then return "50" else return "20" end else return "20" end end -- [single: Australiadance, Australiapandora, Australiaurban] -- Extract issue number from pandora.nla.gov.au URL -- Matches "Issue+123" or "issue%20456" → "123" or "456" function Helpers.australia_issue(args) local url = args.url or "" return string.match(url, "[IiSsUuEe]+[+%%20]*(%d+)") or "" end -- [single: Bulgaria] Extract and format date range from bamp-bg.org URL -- URL: ...01012024-07012024.html → "01.01.2024 – 07.01.2024" function Helpers.bulgaria_date_range(args) local url = args.url or "" local d1, m1, y1, d2, m2, y2 = string.match(url, "(%d%d)(%d%d)(%d%d%d%d)%-(%d%d)(%d%d)(%d%d%d%d)%.html$") if d1 then return string.format("%s.%s.%s – %s.%s.%s", d1, m1, y1, d2, m2, y2) end d1, m1, y1, d2, m2, y2 = string.match(url, "(%d%d)(%d%d)(%d%d)%-(%d%d)(%d%d)(%d%d)%.html$") if d1 then return string.format("%s.%s.20%s – %s.%s.20%s", d1, m1, y1, d2, m2, y2) end d1, m1, d2, m2, y2 = string.match(url, "%-(%d%d)(%d%d)%-(%d%d)(%d%d)(%d%d%d%d)%.html$") if d1 then return string.format("%s.%s.%s – %s.%s.%s", d1, m1, y2, d2, m2, y2) end return "" end -- [single: Slovakdigital, Slovakia] Recommend switching to ...2 for 2016w43+ function Helpers.getAlternativeChart(chartType, chartKey, args) local altCharts = Helpers.alternatives[chartType] local altChart = altCharts and altCharts[chartKey] if not altChart then return nil end local year = tonumber(args.year) or 0 local week = tonumber(string.match(args.week or "", "^%d+")) or 0 return year * 100 + week >= 201643 and altChart or nil end -- [album: GermanyComp] Convert DD.MM.YYYY to Unix timestamp (milliseconds) -- Returns timestamp for Monday 12:00 UTC of that week function Helpers.germany_timestamp(args) local date = args.date or "" local d, m, y = string.match(date, "^(%d%d)%.(%d%d)%.(%d%d%d%d)$") if not d then return "" end d, m, y = tonumber(d), tonumber(m), tonumber(y) local function isLeapYear(yr) return yr % 4 == 0 and (yr % 100 ~= 0 or yr % 400 == 0) end local daysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} local days = 0 for yr = 1970, y - 1 do days = days + (isLeapYear(yr) and 366 or 365) end if isLeapYear(y) then daysInMonth[2] = 29 end for mo = 1, m - 1 do days = days + daysInMonth[mo] end days = days + d - 1 local dow = (days + 3) % 7 -- 0=Mon, 6=Sun days = days - dow -- go back to Monday return string.format("%.0f", (days * 86400 + 12 * 3600) * 1000) end -- Czech/Slovak week IDs cache local czechWeekIds = nil local czechMaxKey, czechMaxId = nil, nil -- [single: Czech Republic, Czechdigital, Slovakia2, Slovakdigital2; album: Czech, Slovakia] -- Returns weekId for ifpicr.cz URL parameter -- Data from Module:Music chart/chartdata-czech.json, future weeks calculated from newest entry -- Supports combined weeks like "51+52" - uses first week's ID function Helpers.czech_week_id(args) -- Handle combined weeks like "51+52" - extract first number local year = tonumber(args.year) or 0 local week = tonumber(string.match(args.week or "", "^%d+")) or 0 if year == 0 or week == 0 then return "" end -- Load week IDs table on first use if not czechWeekIds then czechWeekIds = mw.loadJsonData("Module:Music chart/chartdata-czech.json") -- Find the newest week (highest key) and its ID czechMaxKey, czechMaxId = 0, 0 for k, v in pairs(czechWeekIds) do -- Parse "YYYY-WW" format local y, w = string.match(k, "^(%d+)-(%d+)$") if y then local numKey = tonumber(y) * 100 + tonumber(w) if numKey > czechMaxKey then czechMaxKey = numKey czechMaxId = v end end end end -- Format key as YYYY-WW (string with dash to ensure it stays a string in JSON) local key = string.format("%d-%02d", year, week) -- Check if in table if czechWeekIds[key] then return tostring(czechWeekIds[key]) end -- For future weeks: calculate from last known local currentYw = year * 100 + week if currentYw > czechMaxKey then local lastYear, lastW = math.floor(czechMaxKey / 100), czechMaxKey % 100 -- Convert year+week to "ID count" where weeks 51+52 share same ID local function toIdCount(y, w) return y * 51 + math.min(w, 51) end return tostring(czechMaxId + toIdCount(year, week) - toIdCount(lastYear, lastW)) end return "" end -- [single: Israel] Returns "WW DD-MM-YY DD-MM-YY" for Media Forest URL -- Week 1 starts on Sunday closest to Jan 1 (prev Sunday unless prev year had 53 weeks and Jan 1 is Fri) function Helpers.israel_week(args) local year, week = tonumber(args.year) or 0, tonumber(args.week) or 0 if year == 0 or week == 0 then return "" end local function toDays(y, m, d) -- days since Jan 1, 2000 local days = (y - 2000) * 365 + math.floor((y - 1997) / 4) - math.floor((y - 1901) / 100) + math.floor((y - 1601) / 400) local mdays = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334} days = days + mdays[m] + d - 1 if m > 2 and (y % 4 == 0 and (y % 100 ~= 0 or y % 400 == 0)) then days = days + 1 end return days end local function toDate(days) -- days to DD-MM-YY local y, m, d = 2000, 1, days + 1 while true do local ydays = (y % 4 == 0 and (y % 100 ~= 0 or y % 400 == 0)) and 366 or 365 if d <= ydays then break end d, y = d - ydays, y + 1 end local mdays = {31, (y % 4 == 0 and (y % 100 ~= 0 or y % 400 == 0)) and 29 or 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} for i = 1, 12 do if d <= mdays[i] then m = i; break end; d = d - mdays[i] end return string.format("%02d-%02d-%02d", d, m, y % 100) end local jan1 = toDays(year, 1, 1) local dow = (jan1 + 6) % 7 -- 0=Sun local prevDow = (toDays(year - 1, 1, 1) + 6) % 7 local week1Sun = (dow == 0) and jan1 or ((prevDow == 4 and dow == 5) and (jan1 + 7 - dow) or (jan1 - dow)) local sun = week1Sun + (week - 1) * 7 return string.format("%02d%%20%s%%20%s", week, toDate(sun), toDate(sun + 6)) end -- Call helper by name (safe wrapper) function Helpers.call(name, args) return name and Helpers[name] and Helpers[name](args) or "" end -- Get required params for helper function Helpers.getRequiredParams(helperName) return helperName and Helpers.params[helperName] or {} end --============================================================================= -- SECTION 5: DATE UTILITIES -- Parse and format dates. Computed placeholders: {dateDigits}, {dateMDY}, -- {dateDMY}, {dateYMD}, {dateYear} --============================================================================= local DateUtils = {} function DateUtils.digitsOnly(s) return s and string.gsub(s, "[%-%.%/]", "") or "" end function DateUtils.formatMDY(y, m, d) local month = CONFIG.months[tonumber(m)] or m return CONFIG.date_format_mdy:gsub("%%M", month):gsub("%%d", tonumber(d)):gsub("%%Y", y) end function DateUtils.wrap(date) if not date or date == "" then return nil end if CONFIG.date_wrapper then return string.format(CONFIG.date_wrapper, date, date) end return date end -- Parse date string into y, m, d components function DateUtils.parse(date, chart) if not date then return nil end local y, m, d -- YYYY-MM-DD y, m, d = string.match(date, "^(%d%d%d%d)%-(%d%d)%-(%d%d)$") if y then return y, m, d end -- YYYYMMDD y, m, d = string.match(date, "^(%d%d%d%d)(%d%d)(%d%d)$") if y then return y, m, d end -- YYMMDD local yy, mm, dd = string.match(date, "^(%d%d)(%d%d)(%d%d)$") if yy then return "20" .. yy, mm, dd end -- DD-MM-YYYY or DD.MM.YYYY or DD/MM/YYYY d, m, y = string.match(date, "^(%d%d)[%-%.%/](%d%d)[%-%.%/](%d%d%d%d)$") if d then local mid = tonumber(m) local isMMDD = (chart and chart.date_format and string.match(chart.date_format, "^MM")) or (mid and mid > 12) if isMMDD then return y, d, m end -- swap d and m return y, m, d end return nil end -- Parse date string and compute all format variants function DateUtils.compute(date, chart) if not date then return {} end local vals = { dateDigits = DateUtils.digitsOnly(date) } local y, m, d = DateUtils.parse(date, chart) if not y then return vals end vals.dateYear = y vals.dateMDY = DateUtils.formatMDY(y, m, d) -- January 15, 2024 vals.dateDMY = string.format("%s.%s.%s", d, m, y) -- 15.01.2024 vals.dateYMD = string.format("%s-%s-%s", y, m, d) -- 2024-01-15 vals.dateSlash = string.format("%d/%d/%s", tonumber(d), tonumber(m), y) -- 15/1/2024 return vals end -- Validate date against chart's expected format function DateUtils.validate(date, chart, entry) local dateFormat = (entry and entry.date_format) or chart.date_format local dateFormatAlt = (entry and entry.date_format_alt) or chart.date_format_alt if not dateFormat or not date then return true, nil end local pat = CONFIG.date_patterns[dateFormat] local patAlt = dateFormatAlt and CONFIG.date_patterns[dateFormatAlt] if (pat and mw.ustring.match(date, pat)) or (patAlt and mw.ustring.match(date, patAlt)) then return true, nil end local formats = dateFormatAlt and (dateFormat .. " or " .. dateFormatAlt) or dateFormat return false, formats end -- Validate year format (must be exactly 4 digits) function DateUtils.validateYear(year) if not year or year == "" then return true, nil end if mw.ustring.match(year, "^%d%d%d%d$") then return true, nil end return false, year end -- Validate week format (must be 1-53, or special format like "51+52") function DateUtils.validateWeek(week) if not week or week == "" then return true, nil end local singleWeek = tonumber(week) if singleWeek and mw.ustring.match(week, "^%d%d?$") and singleWeek >= 1 and singleWeek <= 53 then return true, nil end local week1, week2 = mw.ustring.match(week, "^(%d%d?)%+(%d%d?)$") week1, week2 = tonumber(week1), tonumber(week2) if week1 and week2 and week1 >= 1 and week1 <= 53 and week2 >= 1 and week2 <= 53 then return true, nil end return false, week end --============================================================================= -- SECTION 6: TEMPLATE SUBSTITUTION -- Replace {placeholder} patterns with values. Handles URL encoding. -- Encoding applies only to text params: artist, song, album, dvd --============================================================================= local Template = {} -- Replace literal string (not pattern) function Template.safeReplace(str, search, repl) local pos = string.find(str, search, 1, true) while pos do str = string.sub(str, 1, pos - 1) .. repl .. string.sub(str, pos + #search) pos = string.find(str, search, pos + #repl, true) end return str end -- Build reverse alias map: alias -> canonical local aliasToCanonical = {} for canonical, aliases in pairs(CONFIG.param_aliases) do for _, alias in ipairs(aliases) do aliasToCanonical[alias] = canonical end end -- Text parameters that need URL encoding local textParams = { artist = true, song = true, album = true, dvd = true } -- Substitute all {placeholders} in template -- encodeConfig: array of operations from chart.encode or entry.encode function Template.substitute(template, args, chart, encodeConfig) if not template then return "" end local result = template -- Computed date placeholders for k, v in pairs(DateUtils.compute(args.date, chart)) do result = Template.safeReplace(result, "{" .. k .. "}", v) end -- Helper placeholder if chart and chart.helper then result = Template.safeReplace(result, "{helper}", Helpers.call(chart.helper, args)) end local dateParams = {archivedate = true, ["archive-date"] = true, accessdate = true, ["access-date"] = true} -- Substitute a single placeholder local function subst(name, rawValue) local placeholder = "{" .. name .. "}" if not string.find(result, placeholder, 1, true) then return end local encoded if name == "url" and string.match(rawValue, "^https?://") then encoded = rawValue -- URL as-is elseif dateParams[name] then encoded = DateUtils.wrap(rawValue) or rawValue -- Date with optional wrapper elseif textParams[name] and type(encodeConfig) == "table" then encoded = Encoders.encode(rawValue, encodeConfig) -- Text params encoded only when table passed else encoded = rawValue -- Everything else as-is end result = Template.safeReplace(result, placeholder, encoded) end -- Process all args for key, value in pairs(args) do if type(value) == "string" and value ~= "" then local k = tostring(key) subst(k, value) -- Substitute aliases if CONFIG.param_aliases[k] then for _, alias in ipairs(CONFIG.param_aliases[k]) do subst(alias, value) end elseif aliasToCanonical[k] then subst(aliasToCanonical[k], value) end end end return result end --============================================================================= -- SECTION 7: PARAMETER UTILITIES -- Extract params from templates, check if known/unused/missing. --============================================================================= local Params = {} -- Computed placeholders map to source param Params.computed = { dateDigits = "date", dateDMY = "date", dateYMD = "date", dateMDY = "date", dateSlash = "date", dateYear = "date", helper = true } -- Extract param name from placeholder (handles computed params) local function resolveParam(placeholder) local source = Params.computed[placeholder] if source == true then return nil end -- helper-computed, skip return source or placeholder end local function addOrderedParam(list, seen, param) if not param or param == "helper" or tonumber(param) or seen[param] then return end if list then table.insert(list, param) end seen[param] = true end local COMPOSITE_SECONDARY_FIELDS = { week = 100, month = 100, } local function getCompositeSecondaryParam(param) local secondaryParam = param and string.match(param, "^year%+(%a+)$") return COMPOSITE_SECONDARY_FIELDS[secondaryParam] and secondaryParam or nil end local function addExpandedWhenParam(list, seen, param) local secondaryParam = getCompositeSecondaryParam(param) if secondaryParam then addOrderedParam(list, seen, "year") addOrderedParam(list, seen, secondaryParam) else addOrderedParam(list, seen, param) end end -- Add params from template string to list (preserving order) and seen set function Params.addFromTemplateOrdered(list, seen, str) if not str then return end for placeholder in string.gmatch(str, "{([%w%-]+)}") do addOrderedParam(list, seen, resolveParam(placeholder)) end end -- Extract {placeholder} names from template string (returns set) function Params.extractFromTemplate(str) local params = {} if not str then return params end for placeholder in string.gmatch(str, "{([%w%-]+)}") do local param = resolveParam(placeholder) if param then params[param] = true end end return params end function Params.isKnown(param) if CONFIG.params.base[param] or CONFIG.params.content[param] or CONFIG.params.manual[param] then return true end -- Check if param is a canonical name with aliases if CONFIG.param_aliases[param] then return true end -- Check if param is an alias for _, aliasList in pairs(CONFIG.param_aliases) do for _, alias in ipairs(aliasList) do if alias == param then return true end end end return false end function Params.getValue(args, param) if hasArg(args, param) then return args[param] end -- If param is canonical, check its aliases if CONFIG.param_aliases[param] then for _, alt in ipairs(CONFIG.param_aliases[param]) do if hasArg(args, alt) then return args[alt] end end end -- If param is an alias, check canonical name local canonical = aliasToCanonical[param] if canonical and hasArg(args, canonical) then return args[canonical] end return nil end function Params.hasValue(args, param) return Params.getValue(args, param) ~= nil end -- Add params from template string to a set function Params.addFromTemplate(set, str) for k in pairs(Params.extractFromTemplate(str)) do set[k] = true end end function Params.addWhenParamsOrdered(list, seen, when) if not when then return end for part in string.gmatch(when, "[^,|]+") do local param = string.match(mw.text.trim(part), "^!?([%w_%-%+]+)") addExpandedWhenParam(list, seen, param) end end function Params.addWhenParams(set, when) Params.addWhenParamsOrdered(nil, set, when) end -- Collect all params used by chart definition function Params.collectFromChart(chart) local used = {} local chartTemplates = { [1] = chart.url, [2] = chart.url_title, [3] = chart.ref, [4] = chart.ref_note, } for i = 1, 4 do Params.addFromTemplate(used, chartTemplates[i]) end if chart.multiple then for _, entry in ipairs(chart.multiple) do local entryTemplates = { [1] = entry.url, [2] = entry.url_title, [3] = entry.ref, [4] = entry.ref_note, } for i = 1, 4 do Params.addFromTemplate(used, entryTemplates[i]) end Params.addWhenParams(used, entry.when) end end for _, param in ipairs(Helpers.getRequiredParams(chart.helper)) do used[param] = true end return used end -- Find unknown params (not in CONFIG) function Params.checkUnknown(allKeys, args) local unknown = {} for param in pairs(allKeys) do if not Params.isKnown(param) then table.insert(unknown, tostring(param)) end end if args[3] and args[3] ~= "M" then table.insert(unknown, "3=" .. tostring(args[3])) end table.sort(unknown) return #unknown > 0 and table.concat(unknown, ", ") or nil end -- Find unused params (provided but not used by chart) function Params.checkUnused(args, chart) local usedByChart = Params.collectFromChart(chart) local isManualRef = args[3] == "M" local unused = {} for param in pairs(args) do if CONFIG.params.content[param] and not usedByChart[param] then table.insert(unused, tostring(param)) end if CONFIG.params.manual[param] and not isManualRef then table.insert(unused, tostring(param)) end end table.sort(unused) return #unused > 0 and table.concat(unused, ", ") or nil end -- Validate position value function Params.validatePosition(position) if not position or position == "" then return false, "empty" end for _, dash in ipairs(CONFIG.accepted_dashes) do if position == dash then return true end end local num = tonumber(position) if num and num >= 1 and num <= CONFIG.max_position and num == math.floor(num) then return true end return false, position end --============================================================================= -- SECTION 8: MISSING PARAMS CHECKER --============================================================================= local MissingChecker = {} function MissingChecker.formatParamSet(paramSet) local list = {} for param in pairs(paramSet) do table.insert(list, param) end table.sort(list) return table.concat(list, "+") end function MissingChecker.getMissing(paramSet, args) local missing = {} for param in pairs(paramSet) do if not Params.hasValue(args, param) then table.insert(missing, param) end end table.sort(missing) return missing end function MissingChecker.hasAll(paramSet, args) for param in pairs(paramSet) do if not Params.hasValue(args, param) then return false end end return true end function MissingChecker.collectRequired(url, title, ref, chart) local required = {} if type(url) == "table" then for _, entry in ipairs(url) do local entryTemplates = { [1] = entry.url, [2] = entry.url_title, } for i = 1, 2 do Params.addFromTemplate(required, entryTemplates[i]) end end else local templates = { [1] = url, [2] = title } for i = 1, 2 do Params.addFromTemplate(required, templates[i]) end end local refTemplates = { [1] = ref, [2] = chart.ref_note } for i = 1, 2 do Params.addFromTemplate(required, refTemplates[i]) end for _, param in ipairs(Helpers.getRequiredParams(chart.helper)) do required[param] = true end return required end -- Check if v1 is dominated by v2 (v2 is subset of v1 and v1 has more params) local function isDominated(v1, v2) for k in pairs(v2) do if not v1[k] then return false end end for k in pairs(v1) do if not v2[k] then return true end end return false end -- Check missing for charts with multiple URL variants function MissingChecker.checkMultiple(chart, args, ref) local refParams = {} local refTemplates = { [1] = ref, [2] = chart.ref_note } for i = 1, 2 do Params.addFromTemplate(refParams, refTemplates[i]) end local helperReq = Helpers.getRequiredParams(chart.helper) -- Build list of param sets for each variant local variants = {} for _, entry in ipairs(chart.multiple) do local variantParams = {} local variantTemplates = { [1] = entry.url or chart.url, [2] = entry.url_title or chart.url_title, [3] = entry.ref_note, } for i = 1, 3 do Params.addFromTemplate(variantParams, variantTemplates[i]) end for k in pairs(refParams) do variantParams[k] = true end for _, param in ipairs(helperReq) do variantParams[param] = true end table.insert(variants, variantParams) end -- Check if any variant is fully satisfied for _, variantParams in ipairs(variants) do if MissingChecker.hasAll(variantParams, args) then return nil, variantParams end end -- Extract unique URL-only param sets (excluding ref params) local uniqueVariants, seen = {}, {} for _, variantParams in ipairs(variants) do local urlOnly = {} for k in pairs(variantParams) do if not refParams[k] then urlOnly[k] = true end end local key = MissingChecker.formatParamSet(urlOnly) if key ~= "" and not seen[key] then seen[key] = true table.insert(uniqueVariants, urlOnly) end end -- Multiple unique variants: filter out dominated ones and show options if #uniqueVariants > 1 then local dominated = {} for i, v1 in ipairs(uniqueVariants) do for j, v2 in ipairs(uniqueVariants) do if i ~= j and isDominated(v1, v2) then dominated[i] = true break end end end local options = {} for i, v in ipairs(uniqueVariants) do if not dominated[i] then table.insert(options, MissingChecker.formatParamSet(v)) end end if #options == 1 then return options[1], refParams end return table.concat(options, " or "), refParams end -- Single unique variant: show missing params if #uniqueVariants == 1 then local allRequired = {} for k in pairs(uniqueVariants[1]) do allRequired[k] = true end for k in pairs(refParams) do allRequired[k] = true end local missing = MissingChecker.getMissing(allRequired, args) return #missing > 0 and table.concat(missing, ", ") or nil, uniqueVariants[1] end -- No URL params, only ref params local missingRef = MissingChecker.getMissing(refParams, args) return #missingRef > 0 and table.concat(missingRef, ", ") or nil, refParams end function MissingChecker.check(chart, args, url, title, ref) if chart.multiple then return MissingChecker.checkMultiple(chart, args, ref) end local required = MissingChecker.collectRequired(url, title, ref, chart) local missing = MissingChecker.getMissing(required, args) return #missing > 0 and table.concat(missing, ", ") or nil, required end --============================================================================= -- SECTION 9: ENTRY SELECTION --============================================================================= local EntrySelector = {} -- Comparison operators lookup table local COMPARISON_OPS = { ["<="] = function(a, b) return a <= b end, [">="] = function(a, b) return a >= b end, ["<"] = function(a, b) return a < b end, [">"] = function(a, b) return a > b end, } local function parseComparisonCondition(cond) cond = mw.text.trim(cond) for _, operator in ipairs({"<=", ">=", "<", ">"}) do local param, op, val = string.match(cond, "^([%w_%-%+]+)(" .. operator .. ")(.+)$") if param then return param, op, mw.text.trim(val) end end end local function normalizeDateComparisonValue(value, compareValue) local rawValue = tostring(value or "") local rawCompare = tostring(compareValue or "") if string.match(rawCompare, "^%d%d%d%d$") then return tonumber(string.sub(rawValue, 1, 4)) or tonumber(string.match(rawValue, "(%d%d%d%d)")) or 0, tonumber(rawCompare) or 0 end local y, m, d = string.match(rawValue, "^(%d%d%d%d)%-(%d%d?)%-(%d%d?)$") if y then rawValue = string.format("%04d%02d%02d", tonumber(y), tonumber(m), tonumber(d)) end y, m, d = string.match(rawCompare, "^(%d%d%d%d)%-(%d%d?)%-(%d%d?)$") if y then rawCompare = string.format("%04d%02d%02d", tonumber(y), tonumber(m), tonumber(d)) end local rawDigits = string.gsub(rawValue, "%D", "") local compareDigits = string.gsub(rawCompare, "%D", "") if #rawDigits >= 8 then rawValue = string.sub(rawDigits, 1, 8) end if #compareDigits >= 8 then rawCompare = string.sub(compareDigits, 1, 8) end return tonumber(rawValue) or 0, tonumber(rawCompare) or 0 end local function normalizeCompositeKeyComparisonValue(param, args, compareValue) local secondaryParam = getCompositeSecondaryParam(param) if not secondaryParam then return nil, nil, false end local scale = COMPOSITE_SECONDARY_FIELDS[secondaryParam] local yearRaw = Params.getValue(args, "year") local secondaryRaw = Params.getValue(args, secondaryParam) if not yearRaw or not secondaryRaw then return nil, nil, true end local year = tonumber(yearRaw) or 0 local secondary = tonumber(string.match(secondaryRaw, "^%d+")) or 0 local compareYear, compareSecondary = string.match(tostring(compareValue or ""), "^(%d%d%d%d)%s*%+%s*(%d+)$") if compareYear then return year * scale + secondary, (tonumber(compareYear) or 0) * scale + (tonumber(compareSecondary) or 0), true end local compareDigits = string.gsub(tostring(compareValue or ""), "%D", "") return year * scale + secondary, tonumber(compareDigits) or 0, true end local function normalizeComparisonValues(param, paramValue, compareValue, args) if param == "date" or param == "archivedate" or param == "archive-date" then local argVal, cmpVal = normalizeDateComparisonValue(paramValue, compareValue) return argVal, cmpVal, false end local compositeArgVal, compositeCmpVal, isComposite = normalizeCompositeKeyComparisonValue(param, args, compareValue) if isComposite then return compositeArgVal, compositeCmpVal, true end return tonumber(paramValue) or 0, tonumber(compareValue) or 0, false end local function checkCompositeComparison(condA, condB, args) local paramA, opA, valA = parseComparisonCondition(condA) local paramB, opB, valB = parseComparisonCondition(condB) if not paramA or not paramB or opA ~= opB then return nil end local secondaryParam, yearVal, secondaryVal if paramA == "year" and COMPOSITE_SECONDARY_FIELDS[paramB] then secondaryParam, yearVal, secondaryVal = paramB, valA, valB elseif paramB == "year" and COMPOSITE_SECONDARY_FIELDS[paramA] then secondaryParam, yearVal, secondaryVal = paramA, valB, valA else return nil end local scale = COMPOSITE_SECONDARY_FIELDS[secondaryParam] local year = tonumber(Params.getValue(args, "year")) or 0 local secondary = tonumber(string.match(Params.getValue(args, secondaryParam) or "", "^%d+")) or 0 local compareValue = (tonumber(yearVal) or 0) * scale + (tonumber(secondaryVal) or 0) local argValue = year * scale + secondary return COMPARISON_OPS[opA](argValue, compareValue) end -- Check single condition local function checkSingleCondition(cond, args) cond = mw.text.trim(cond) -- Negation check: !param if string.sub(cond, 1, 1) == "!" then local param = string.sub(cond, 2) return not Params.getValue(args, param) end local param, op, val = parseComparisonCondition(cond) if param and op and val then local argVal, cmpVal, isComposite = normalizeComparisonValues(param, Params.getValue(args, param), val, args) if isComposite and argVal == nil then return false end return COMPARISON_OPS[op](argVal, cmpVal) end -- Equality check: param=value local key, eqVal = string.match(cond, "^([^=]+)=(.+)$") if key and eqVal then return Params.getValue(args, key) == eqVal end -- Existence check: param (non-empty) return Params.getValue(args, cond) ~= nil end -- Check if "when" condition matches args function EntrySelector.matchesCondition(when, args, helperValue) if not when or when == "" then return true end local helperVal = string.match(when, "^helper=(.+)$") if helperVal then return helperValue == helperVal end local function matchesAndConditions(expr) local parts = {} for param in string.gmatch(expr, "([^,]+)") do table.insert(parts, mw.text.trim(param)) end local i = 1 while i <= #parts do if i < #parts then local compositeMatch = checkCompositeComparison(parts[i], parts[i + 1], args) if compositeMatch ~= nil then if not compositeMatch then return false end i = i + 2 else if not checkSingleCondition(parts[i], args) then return false end i = i + 1 end else if not checkSingleCondition(parts[i], args) then return false end i = i + 1 end end return true end for expr in string.gmatch(when, "([^|]+)") do if matchesAndConditions(expr) then return true end end return false end -- Select URL entry from chart.multiple based on args -- Returns table with: url, url_title, ref, lang, provider, chart, entry, encode, helperValue, defunct function EntrySelector.select(chart, args) -- Default result from chart base values local result = { url = chart.url, url_title = chart.url_title, ref = chart.ref, lang = chart.lang, provider = chart.provider, chart = chart.chart, encode = chart.encode, entry = nil, helperValue = nil, defunct = chart.defunct } if not chart.multiple then return result end local helperValue = chart.helper and Helpers.call(chart.helper, args) or nil result.helperValue = helperValue -- Helper to apply entry overrides with fallback to chart defaults local function applyEntry(entry) result.url = entry.url or chart.url result.url_title = entry.url_title or chart.url_title result.ref = entry.ref or chart.ref result.lang = entry.lang or chart.lang result.provider = entry.provider or chart.provider result.chart = entry.chart or chart.chart result.encode = entry.encode or chart.encode result.defunct = chart.defunct or entry.defunct result.entry = entry end if chart.combine then local entries = {} local hasDefunctEntry = false for _, entry in ipairs(chart.multiple) do if EntrySelector.matchesCondition(entry.when, args, helperValue) then hasDefunctEntry = hasDefunctEntry or entry.defunct table.insert(entries, { url = entry.url or chart.url, url_title = entry.url_title or chart.url_title, ref = entry.ref, ref_note = entry.ref_note, lang = entry.lang, encode = entry.encode or chart.encode }) end end if #entries > 0 then result.url = entries result.url_title = nil result.defunct = chart.defunct or hasDefunctEntry end else for _, entry in ipairs(chart.multiple) do if EntrySelector.matchesCondition(entry.when, args, helperValue) then applyEntry(entry) break end end end return result end --============================================================================= -- SECTION 10: OUTPUT BUILDERS --============================================================================= local Builder = {} local NBSP = string.char(194, 160) -- Build wikitext link from URL and title -- encodeConfig: table of operations for text params (empty {} = default space-plus), nil = no encoding function Builder.link(url, title, args, chart, encodeConfig) if not url or url == "" then return "" end if string.sub(url, 1, 1) == "[" then return '"' .. Template.substitute(url, args, chart, nil) .. '"' end local encodedUrl = Template.substitute(url, args, chart, encodeConfig or {}) local linkTitle = Template.substitute(title or "", args, chart, nil) linkTitle = linkTitle:gsub("%[", "&#91;"):gsub("%]", "&#93;") return linkTitle ~= "" and ('"[' .. encodedUrl .. " " .. linkTitle .. ']"') or ("[" .. encodedUrl .. "]") end function Builder.appendLang(text, lang) local cleanText = mw.text.trim(text or "") local cleanLang = tostring(lang or ""):gsub("^%s+", "") local hasGlue = cleanLang:find("^&nbsp;") or cleanLang:find("^&#160;") or cleanLang:find("^&#[Xx][Aa]0;") or cleanLang:find("^" .. NBSP) if not hasGlue then cleanLang = mw.text.trim(cleanLang) end if cleanText == "" then return cleanLang end if cleanLang == "" then return cleanText end return cleanText .. (hasGlue and "" or " ") .. cleanLang end -- Build chart display name with provider function Builder.chartName(chartName, provider, chartKey) local name = chartName or chartKey return provider and provider ~= "" and (name .. " (" .. provider .. ")") or name end -- Build reference name function Builder.refName(chartType, chartKey, args, chart, selectedEntry) if args.refname then return args.refname end local prefix = CONFIG.ref_prefixes[chartType] or "sc" local suffix = string.match(chartType, "^year%-end") and (args.year or "") or (args.artist or "") local defaultRefname = prefix .. "_" .. chartKey .. "_" .. suffix local format = (selectedEntry and selectedEntry.refname_format) or (chart and chart.refname_format) if not format then return defaultRefname end local refname = format for key, value in pairs(args) do if type(value) == "string" and value ~= "" then refname = refname:gsub("{" .. key .. "|[^}]*}", value):gsub("{" .. key .. "}", value) end end refname = refname:gsub("{[^}]+|([^}]*)}", "%1"):gsub("{[^}]+}", "") return #refname < 5 and defaultRefname or refname end -- Build reference content function Builder.refContent(chart, args, urlResult, lang, refText, isYearEnd, selectedEntry) local accessDate = DateUtils.wrap(Params.getValue(args, "access-date")) local archiveDate = DateUtils.wrap(Params.getValue(args, "archive-date")) local pubDate = DateUtils.wrap(Params.getValue(args, "publish-date")) local archiveUrl = Params.getValue(args, "archive-url") local refNote = (selectedEntry and selectedEntry.ref_note) or chart.ref_note -- Combine mode: bullet list if type(urlResult) == "table" and chart.combine then local bullets, hasEntryRef = {}, false for _, entry in ipairs(urlResult) do local link = Builder.link(entry.url, entry.url_title, args, chart, entry.encode) if link ~= "" then local entryLang = entry.lang or lang local linkWithLang = Builder.appendLang(link, entryLang) local parts = {linkWithLang} if entry.ref then parts[#parts + 1] = entry.ref hasEntryRef = true if accessDate then parts[#parts + 1] = string.format(CONFIG.text.retrieved, accessDate) end end if entry.ref_note then parts[#parts + 1] = Template.substitute(entry.ref_note, args, chart, nil) end local line = table.concat(parts, ". ") if not line:match("%.$") then line = line .. "." end bullets[#bullets + 1] = "*" .. line end end local prefix = refNote and Template.substitute(refNote, args, chart, nil) or "" local result = prefix ~= "" and (prefix .. "\n" .. table.concat(bullets, "\n")) or table.concat(bullets, "\n") -- Add shared ref if no entry-level refs if not hasEntryRef and refText and refText ~= "" then local sharedRef = refText if accessDate then sharedRef = sharedRef .. ". " .. string.format(CONFIG.text.retrieved, accessDate) end if not sharedRef:match("%.$") then sharedRef = sharedRef .. "." end result = result .. "\n" .. sharedRef end return result end -- Standard format local parts = {} local urlLang = "" if type(urlResult) == "table" then for _, entry in ipairs(urlResult) do local link = Builder.link(entry.url, entry.url_title, args, chart) if link ~= "" then urlLang = urlLang .. (urlLang ~= "" and " " or "") .. link end end elseif urlResult and urlResult ~= "" then urlLang = urlResult end urlLang = Builder.appendLang(urlLang, lang) if urlLang ~= "" then table.insert(parts, urlLang) end if refText then table.insert(parts, refText) end if pubDate and isYearEnd then table.insert(parts, pubDate) end if archiveUrl and archiveDate and not (refText and string.find(refText, "Archived", 1, true)) then table.insert(parts, string.format(CONFIG.text.archived, archiveUrl, archiveDate)) end if refNote then table.insert(parts, Template.substitute(refNote, args, chart, nil)) end local result = table.concat(parts, ". ") local skipDot = result:match("%.$") or result:match("{{cite Kent") if result ~= "" and not skipDot then result = result .. "." end if accessDate then result = result .. (result ~= "" and " " or "") .. string.format(CONFIG.text.retrieved, accessDate) end if chart.ref_suffix then result = result .. " " .. Template.substitute(chart.ref_suffix, args, chart, nil) end return result end -- Build URL result (with or without substitution based on missing params) function Builder.urlResult(url, urlTitle, args, chart, hasMissing, encodeConfig) if type(url) == "table" then return url end if hasMissing then if not url or url == "" then return "" end if string.sub(url, 1, 1) == "[" then return '"' .. url .. '"' end return urlTitle and ('"[' .. url .. " " .. urlTitle .. ']"') or ("[" .. url .. "]") end return Builder.link(url, urlTitle, args, chart, encodeConfig) end -- Build note text function Builder.noteText(args) return hasArg(args, "note") and string.format(CONFIG.note_format, args.note) or "" end -- Build ref tag function Builder.refTag(frame, refContent, refname, refgroup) if not refContent or refContent == "" then return "" end local refAttrs = {name = refname} if refgroup and refgroup ~= "" then refAttrs.group = refgroup end local processed = string.find(refContent, "{{", 1, true) and frame:preprocess(refContent) or refContent return frame:extensionTag('ref', processed, refAttrs) end -- Build final output row function Builder.outputRow(frame, args, chartName, warnings, errorInline, refTag, noteText, position, cats) local cell = args.rowheader == "true" and CONFIG.cell_header or CONFIG.cell_normal local renderedChartName = renderTableCellContent(frame, chartName) return string.format('%s%s%s%s%s%s\n|%s%s%s', cell, renderedChartName, warnings, errorInline, refTag, noteText, CONFIG.position_style, position, cats) end --============================================================================= -- SECTION 11: CATEGORIES --============================================================================= local Categories = {} function Categories.shouldCategorize() return mw.title.getCurrentTitle().namespace == 0 end function Categories.build(chartType, chartKey, chart, args, position, entry) if not Categories.shouldCategorize() then return "" end local t = getTypeName(chartType) local cats = {catLink(CONFIG.categories.usage, t, chartKey)} local isDefunct = chart.defunct or (entry and entry.defunct) if isDefunct then table.insert(cats, catLinkSort(CONFIG.categories.defunct, chartKey, t)) end if args[3] == "M" then table.insert(cats, catLinkSort(CONFIG.categories.manual_ref, chartKey, t)) end if not hasArg(args, "artist") then table.insert(cats, catLink(CONFIG.categories.without_artist, t)) end if string.match(chartType, "single") and not hasArg(args, "song") then table.insert(cats, catLink(CONFIG.categories.without_song, t)) end if string.match(chartType, "album") and not hasArg(args, "album") and not hasArg(args, "dvd") then table.insert(cats, catLink(CONFIG.categories.without_album, t)) end if hasArg(args, "refname") then table.insert(cats, catLink(CONFIG.categories.named_ref, t)) end -- Category conditions from chart definition if chart.category_conditions then local oldPosition = args.position args.position = position local helperValue = chart.helper and Helpers.call(chart.helper, args) or nil for _, cond in ipairs(chart.category_conditions) do if EntrySelector.matchesCondition(cond.when, args, helperValue) and cond.category then table.insert(cats, "[[" .. CONFIG.category_prefix .. cond.category .. "]]") end end args.position = oldPosition elseif chart.number_one_category and tonumber(position) == 1 then table.insert(cats, "[[" .. CONFIG.category_prefix .. chart.number_one_category .. "]]") end if chart.track_param and not hasArg(args, chart.track_param) then table.insert(cats, catLink(CONFIG.categories.track_param, t, chartKey, chart.track_param)) end return table.concat(cats) end --============================================================================= -- SECTION 12: ERROR HANDLING --============================================================================= local Errors = {} local ERROR_SPAN = '<span style="color:red;">' .. CONFIG.errors.prefix .. '%s</span>' local WARNING_SPAN = '<span style="color:orange;">%s</span>' -- Format error span with chartKey and message local function errorSpan(chartKey, msg) return string.format(ERROR_SPAN, chartKey, msg) end function Errors.make(chartType, chartKey, msg) local t = getTypeName(chartType) local cat = Categories.shouldCategorize() and catLink(CONFIG.categories.missing_params, t) or "" return errorSpan(chartKey, msg) .. cat end function Errors.inline(chartKey, param, extra) local msg if param == "invalid_date" then msg = string.format(CONFIG.errors.invalid_date, extra or "YYYY-MM-DD") elseif param == "invalid_year" then msg = string.format(CONFIG.errors.invalid_year, extra or "?") elseif param == "invalid_week" then msg = string.format(CONFIG.errors.invalid_week, extra or "?") elseif param == "unknown chart" then msg = string.format(CONFIG.errors.unknown_chart, chartKey) else msg = string.format(CONFIG.errors.missing_params, param) end return errorSpan(chartKey, msg) end function Errors.warning(text) return string.format(WARNING_SPAN, text) end function Errors.checkUnsubstituted(output) local found = {} for param in string.gmatch(output, "{([%w%-]+)}") do found[param] = true end local list = {} for ph in pairs(found) do table.insert(list, ph) end if #list > 0 then table.sort(list); return table.concat(list, ", ") end return nil end function Errors.isPreview() local frame = mw.getCurrentFrame() return frame and frame:preprocess("{{REVISIONID}}") == "" end --============================================================================= -- SECTION 13: DATA LOADING --============================================================================= local dataCache = {} local function loadData(chartType) if not CONFIG.type_names[chartType] then return nil end if dataCache[chartType] then return dataCache[chartType] end local grouped = mw.loadJsonData(string.format(CONFIG.json_path, chartType)) local flat = {} for country, charts in pairs(grouped) do if string.sub(country, 1, 1) ~= "_" then for key, info in pairs(charts) do local copy = {} for k, v in pairs(info) do copy[k] = v end if not copy.chart then copy.chart = country end flat[key] = copy end end end dataCache[chartType] = flat return flat end --============================================================================= -- SECTION 14: MAIN ENTRY POINT --============================================================================= local function parseArgs(frame) local args = {} local allKeys = CONFIG.check_unknown_params and {} or nil for k, v in pairs(frame.args) do if allKeys then allKeys[k] = true end if v and v ~= "" then args[k] = mw.text.trim(v) end end for k, v in pairs(frame:getParent().args) do if allKeys then allKeys[k] = true end if v and v ~= "" then args[k] = mw.text.trim(v) end end return args, allKeys end local function resolveChart(data, chartKey) local chart = data[chartKey] if not chart then return nil end return chart.alias_for and data[chart.alias_for] or chart end -- Check unknown params and return warning string and category string local function checkUnknownParams(allKeys, args, chartKey, chartType, shouldCat) if not CONFIG.check_unknown_params then return "", "" end local unknownParams = Params.checkUnknown(allKeys, args) if not unknownParams then return "", "" end local warning = "" if Errors.isPreview() then warning = Errors.warning(string.format(CONFIG.warnings.unknown_params, chartKey, unknownParams)) end local cat = "" local typeName = getTypeName(chartType) if shouldCat == nil then shouldCat = Categories.shouldCategorize() end if shouldCat then cat = catLinkSort(CONFIG.categories.unknown_params, chartKey .. ": " .. unknownParams, string.lower(typeName)) end return warning, cat end -- Check if param is used in URL or helper (critical error) vs only in ref (warning) local function checkParamInUrl(chart, url, paramName) local urlParams = type(url) == "string" and Params.extractFromTemplate(url) or {} if chart.multiple then for _, entry in ipairs(chart.multiple) do for k in pairs(Params.extractFromTemplate(entry.url)) do urlParams[k] = true end end end if urlParams[paramName] then return true end for _, param in ipairs(Helpers.getRequiredParams(chart.helper)) do if param == paramName then return true end end return false end -- Handle manual ref mode (3=M) local function handleManualMode(frame, args, allKeys, chartType, chartKey, chart, typeName, shouldCat) if not hasArg(args, "url") or not hasArg(args, "title") then local errCat = shouldCat and catLinkSort(CONFIG.categories.manual_missing_url_title, chartKey, string.lower(typeName)) or "" return CONFIG.cell_normal .. errorSpan(chartKey, CONFIG.errors.manual_missing_url_title) .. errCat end -- Build cite news template using table for cleaner construction local citeParams = { "{{cite news", "|url=" .. args.url, "|title=" .. args.title, } local optionalParams = { {args.work, "|work="}, {args.publisher, "|publisher="}, {args.location, "|location="}, {args.date, "|date="}, {Params.getValue(args, "access-date"), "|access-date="}, {Params.getValue(args, "archive-url"), "|archive-url="}, {Params.getValue(args, "archive-date"), "|archive-date="}, {args["url-status"], "|url-status="}, } for _, param in ipairs(optionalParams) do if param[1] then table.insert(citeParams, param[2] .. param[1]) end end table.insert(citeParams, "}}") local cite = table.concat(citeParams) -- Manual refs are anonymous by default (like original template), unless refname explicitly provided local refname = args.refname -- nil if not provided = anonymous ref local refTag = Builder.refTag(frame, frame:preprocess(cite), refname, args.refgroup) local chartName = Builder.chartName(chart.chart, chart.provider, chartKey) local position = args.position or args[2] local noteText = Builder.noteText(args) local unknownWarning, unknownCat = checkUnknownParams(allKeys, args, chartKey, chartType, shouldCat) local cats = Categories.build(chartType, chartKey, chart, args, position) .. unknownCat return Builder.outputRow(frame, args, chartName, unknownWarning, "", refTag, noteText, position, cats) end function p.main(frame) local args, allKeys = parseArgs(frame) local chartType = args.type or CONFIG.default_type local chartKey = args.chart or args[1] local position = args.position or args[2] local typeName = getTypeName(chartType) local shouldCat = Categories.shouldCategorize() if not chartKey or chartKey == "" then return CONFIG.cell_normal .. Errors.make(chartType, "?", CONFIG.errors.missing_chart) end if not position or position == "" then return CONFIG.cell_normal .. Errors.make(chartType, chartKey, CONFIG.errors.missing_position) end local positionValid, positionErr = Params.validatePosition(position) if not positionValid then local errMsg = string.format(CONFIG.errors.invalid_position, positionErr, CONFIG.max_position) local cat = shouldCat and catLink(CONFIG.categories.invalid_position, typeName) or "" return CONFIG.cell_normal .. errorSpan(chartKey, errMsg) .. cat end local data = loadData(chartType) if not data then return CONFIG.cell_normal .. errorSpan(chartKey or "?", 'Unknown chart type "' .. chartType .. '".') end local chart = resolveChart(data, chartKey) if not chart then local cat = shouldCat and catLinkSort(CONFIG.categories.unknown_chart, chartKey, typeName) or "" return CONFIG.cell_normal .. errorSpan(chartKey, string.format(CONFIG.errors.unknown_chart, chartKey)) .. cat end if args[3] == "M" then return handleManualMode(frame, args, allKeys, chartType, chartKey, chart, typeName, shouldCat) end local isYearEnd = string.match(chartType, "^year%-end") ~= nil local sel = EntrySelector.select(chart, args) local errorInline, errorInRef, extraCats = "", "", "" local refChart, refSel = chart, sel local altChart = args.year and args.week and Helpers.getAlternativeChart(chartType, chartKey, args) if altChart then return CONFIG.cell_normal .. errorSpan(chartKey, string.format(CONFIG.errors.use_new_chart, altChart)) end if refSel.lang and string.find(refSel.lang, "{{", 1, true) then refSel.lang = frame:preprocess(refSel.lang) end -- URL validation if chart.url_validation and hasArg(args, "url") then if not string.find(args.url, chart.url_validation, 1, true) then local msg = string.format(CONFIG.errors.url_validation, chart.url_validation) errorInline, errorInRef = setErrorDisplay(errorSpan(chartKey, msg), errorInline, errorInRef) end end -- Missing params local missing = MissingChecker.check(refChart, args, refSel.url, refSel.url_title, refSel.ref) if missing and errorInline == "" then local errMsg = Errors.inline(chartKey, missing) errorInline, errorInRef = setErrorDisplay(errMsg, errorInline, errorInRef) if shouldCat then extraCats = extraCats .. catLinkSort(CONFIG.categories.missing_params, chartKey, typeName) end end -- Unused params local unusedWarning = "" if CONFIG.check_unused_params then local unusedParams = Params.checkUnused(args, chart) if unusedParams then if shouldCat then extraCats = extraCats .. catLinkSort(CONFIG.categories.unused_params, chartKey, typeName) end if Errors.isPreview() then unusedWarning = Errors.warning(string.format(CONFIG.warnings.unused_params, chartKey, unusedParams)) end end end -- Unknown params local unknownWarning, unknownCat = checkUnknownParams(allKeys, args, chartKey, chartType, shouldCat) extraCats = extraCats .. unknownCat -- Date validation if args.date then local valid, formats = DateUtils.validate(args.date, refChart, refSel.entry) if not valid then if checkParamInUrl(refChart, refSel.url, "date") then local dateErr = Errors.inline(chartKey, "invalid_date", formats) errorInline, errorInRef = setErrorDisplay(dateErr, errorInline, errorInRef) elseif Errors.isPreview() then errorInline = errorInline .. Errors.warning(string.format(CONFIG.warnings.invalid_date_ref, formats)) end end end -- Year/week format validation local dateParamChecks = { {param = "year", validator = DateUtils.validateYear, errorKey = "invalid_year"}, {param = "week", validator = DateUtils.validateWeek, errorKey = "invalid_week"}, } for _, check in ipairs(dateParamChecks) do if args[check.param] then local valid, badValue = check.validator(args[check.param]) if not valid then if checkParamInUrl(refChart, refSel.url, check.param) then local err = Errors.inline(chartKey, check.errorKey, badValue) errorInline, errorInRef = setErrorDisplay(err, errorInline, errorInRef) if shouldCat then extraCats = extraCats .. catLinkSort(CONFIG.categories.unsubstituted, chartKey .. ": " .. check.param, typeName) end elseif Errors.isPreview() then errorInline = errorInline .. Errors.warning(string.format(CONFIG.errors[check.errorKey], badValue)) end end end end local urlResult = Builder.urlResult(refSel.url, refSel.url_title, args, refChart, missing ~= nil, refSel.encode) local refText = missing and (refSel.ref or "") or Template.substitute(refSel.ref or "", args, refChart, nil) local refContent = Builder.refContent(refChart, args, urlResult, refSel.lang, refText, isYearEnd, refSel.entry) if errorInRef ~= "" then refContent = errorInRef .. " " .. refContent end local chartName = Builder.chartName(sel.chart, sel.provider, chartKey) local refname = Builder.refName(chartType, chartKey, args, chart, sel.entry) local refTag = Builder.refTag(frame, refContent, refname, args.refgroup) local noteText = Builder.noteText(args) local cats = Categories.build(chartType, chartKey, chart, args, position, sel.entry) .. extraCats local warnings = unusedWarning .. unknownWarning local output = Builder.outputRow(frame, args, chartName, warnings, errorInline, refTag, noteText, position, cats) -- Check for unsubstituted placeholders local unsubstituted = Errors.checkUnsubstituted(output .. refContent) if unsubstituted then if errorInline == "" then output = Builder.outputRow(frame, args, chartName, warnings, Errors.inline(chartKey, unsubstituted), refTag, noteText, position, cats) end if shouldCat then output = output .. catLinkSort(CONFIG.categories.unsubstituted, chartKey .. ": " .. unsubstituted, typeName) end end return output end --============================================================================= -- SECTION 15: UTILITY FUNCTIONS --============================================================================= function p.chartExists(frame) local chartType = frame.args.type or CONFIG.default_type local chartKey = frame.args.chart or frame.args[1] if not chartKey then return "0" end local data = loadData(chartType) return data and data[chartKey] and "1" or "0" end --============================================================================= -- SECTION 16: SHOW CHARTS TABLE GENERATOR --============================================================================= local ShowCharts = {} function ShowCharts.countArray(arr) if not arr then return 0 end local count = 0 for _ in ipairs(arr) do count = count + 1 end return count end function ShowCharts.chartIdCell(chartKey) return "<code>" .. chartKey .. "</code>" end local function collectShowChartParams(entry, chart) local paramList = {} local seen = {} Params.addWhenParamsOrdered(paramList, seen, entry.when) local templates = { [1] = entry.url or chart.url, [2] = entry.url_title or chart.url_title, [3] = chart.ref, [4] = chart.ref_note, [5] = entry.ref_note, } for i = 1, 5 do Params.addFromTemplateOrdered(paramList, seen, templates[i]) end for _, param in ipairs(Helpers.getRequiredParams(chart.helper)) do addOrderedParam(paramList, seen, param) end return paramList end function ShowCharts.usageCountLink(chartKey, typeName) local cat = string.format(CONFIG.categories.usage, typeName, chartKey) local count = mw.site.stats.pagesInCategory(cat, "pages") or 0 return "[[:" .. CONFIG.category_prefix .. cat .. "|" .. count .. "]]" end function ShowCharts.buildParamsStr(entry, chart) local paramList = collectShowChartParams(entry, chart) local dateFormat = entry.date_format or chart.date_format if dateFormat then local displayFormat = dateFormat:gsub("–", "-"):gsub("~", "-") for i, param in ipairs(paramList) do if param == "date" then paramList[i] = "date <span style=\"font-size:85%\">[" .. displayFormat .. "]</span>" break end end end return #paramList > 0 and table.concat(paramList, ", ") or "—" end -- Build raw param list (without formatting) for template call generation function ShowCharts.getRawParams(entry, chart) return collectShowChartParams(entry, chart) end -- Build template call string for copy-paste function ShowCharts.buildTemplateCall(chartKey, entry, chart, typeName) local params = ShowCharts.getRawParams(entry, chart) local call = "{{" .. typeName .. " chart&#124;" .. chartKey .. "&#124;0" for _, p in ipairs(params) do call = call .. "&#124;" .. p .. "=" end call = call .. "}}" return "<code>" .. call .. "</code>" end function ShowCharts.isRefOnlyOverride(entry, chart) return not (entry.url and entry.url ~= chart.url) and not (entry.url_title and entry.url_title ~= chart.url_title) end local function escapeForTable(str) if not str then return nil end local links = {} str = str:gsub("%[%[(.-)%]%]", function(l) links[#links + 1] = "[[" .. l .. "]]" return "\1" .. #links .. "\1" end) str = str:gsub("|", "&#124;") return str:gsub("\1(%d+)\1", function(n) return links[tonumber(n)] end) end function ShowCharts.buildCombineBullet(entry, chart, sampleArgs) local link = escapeForTable(Builder.link(entry.url or chart.url, entry.url_title or chart.url_title, sampleArgs, chart)) local lang = entry.lang or chart.lang link = Builder.appendLang(link, lang and mw.text.nowiki(lang) or nil) -- Only add entry-level ref, not chart-level (chart.ref is added separately below bullets) if entry.ref then link = link .. ". " .. escapeForTable(entry.ref) end if entry.ref_note then link = link .. ". " .. escapeForTable(Template.substitute(entry.ref_note, sampleArgs, chart, nil)) end -- Add trailing dot if not link:match("%.$") then link = link .. "." end return link end function ShowCharts.buildSampleOutput(entry, chart, sampleArgs) local function sub(s) if not s then return nil end return escapeForTable(Template.substitute(s, sampleArgs, chart, nil)) end local url = entry.url or chart.url local urlTitle = entry.url_title or chart.url_title local lang = entry.lang or chart.lang local ref = entry.ref or chart.ref local refNote = entry.ref_note or chart.ref_note local hasCondition = ShowCharts.isRefOnlyOverride(entry, chart) and entry.when local parts = {} if url then local link = escapeForTable(Builder.link(url, urlTitle, sampleArgs, chart)) if link and link ~= "" then link = Builder.appendLang(link, lang and mw.text.nowiki(lang) or nil) parts[#parts + 1] = link end end if hasCondition then local overrides = {} if entry.ref_note then overrides[#overrides + 1] = sub(entry.ref_note) end if entry.ref and entry.ref ~= chart.ref then overrides[#overrides + 1] = "ref: " .. sub(entry.ref) end if entry.lang and entry.lang ~= chart.lang then overrides[#overrides + 1] = "lang: " .. mw.text.nowiki(entry.lang) end if #overrides > 0 then parts[#parts + 1] = "[" .. entry.when .. " → " .. table.concat(overrides, "; ") .. "]" end end if ref then parts[#parts + 1] = sub(ref) end local refNoteShownInCondition = hasCondition and entry.ref_note if refNote and not refNoteShownInCondition then parts[#parts + 1] = sub(refNote) end if #parts == 0 then return "''(no url)''" end local out = table.concat(parts, ". ") if not out:match("%.$") then out = out .. "." end if chart.ref_suffix then out = out .. " " .. sub(chart.ref_suffix) end return out end function ShowCharts.getSampleArgs(chart) local sampleArgs = { date = "2024-01-15", year = "2024", week = "3", chartid = "12345", songid = "67890", artistid = "11111", dvd = "Sample DVD", startdate = "01/01/2024", enddate = "07/01/2024", id = "123", page = "42", title = "Sample Title", } local dateFormats = { ["YYYYMMDD"] = "20240115", ["YYMMDD"] = "110115", ["DD-MM-YYYY"] = "15-01-2024", ["MM-DD-YYYY"] = "01-15-2024", ["DD.MM.YYYY"] = "15.01.2024", ["YYYYMMDD-YYYYMMDD"] = "20251219-20251225", ["DD.MM.YYYY–DD.MM.YYYY"] = "19.12.2025–25.12.2025", ["YYYY.MM.DD–YYYY.MM.DD"] = "2025.12.19–2025.12.25", } if chart.date_format and dateFormats[chart.date_format] then sampleArgs.date = dateFormats[chart.date_format] end return sampleArgs end function ShowCharts.rowspanCell(content, rowspan, style) return string.format('%srowspan="%d" | %s', style or "", rowspan, content or "") end function ShowCharts.groupMultipleEntries(entries, chartDefunct) local groups = {} local current = nil for i, entry in ipairs(entries or {}) do local rowDefunct = chartDefunct or entry.defunct or false if not current or current.defunct ~= rowDefunct then current = {start = i, count = 1, defunct = rowDefunct} table.insert(groups, current) else current.count = current.count + 1 end end return groups end function ShowCharts.categoryLink(catName) if not catName then return "—" end return "[[:" .. CONFIG.category_prefix .. catName .. "|" .. catName .. "]]" end function ShowCharts.formatGroup(name, frame) if string.find(name, "%[no wrap%]") then return (string.gsub(name, "%s*%[no wrap%]%s*", "")) end if CONFIG.group_wrapper then local wrapped = string.format(CONFIG.group_wrapper, name, name) if string.find(wrapped, "{{", 1, true) then return frame:preprocess(wrapped) end return wrapped end return name end function ShowCharts.formatChartName(name, frame) return renderTableCellContent(frame, name) end function ShowCharts.isMvChart(chartKey) return string.sub(chartKey, -2) == "MV" end function ShowCharts.buildRows(grouped, countries, opts, frame, mvFilter) local rows = {} for _, country in ipairs(countries) do local keys = {} for k in pairs(grouped[country]) do if mvFilter == nil or ShowCharts.isMvChart(k) == mvFilter then table.insert(keys, k) end end if #keys > 0 then if opts.sortAlpha then table.sort(keys) end -- Count rows for this country (for rowspan) local countryRowCount = 0 for _, k in ipairs(keys) do local c = grouped[country][k] if c.multiple and not c.alias_for and not c.combine then countryRowCount = countryRowCount + ShowCharts.countArray(c.multiple) else countryRowCount = countryRowCount + 1 end end local countryRowsEmitted = 0 for _, chartKey in ipairs(keys) do local chart = grouped[country][chartKey] local isFirstCountryRow = (countryRowsEmitted == 0) local sampleArgs = ShowCharts.getSampleArgs(chart) local chartDisplay = ShowCharts.formatChartName(chart.chart or country, frame) local providerDisplay = renderTableCellContent(frame, chart.provider or "—") -- Base style for defunct charts (without pipe) local style = chart.defunct and 'style="background:#ffebee;" ' or "" local docNote = chart.doc_note or "" -- Helper to build row start with country cell -- First row of country: "| rowspan=N | Country || " -- Other rows: "| " (start new row cell) local function countryCell() if isFirstCountryRow then isFirstCountryRow = false return string.format('| rowspan="%d" | %s || ', countryRowCount, ShowCharts.formatGroup(country, frame)) end return "| " end -- Cell style prefix: "style=... | " for defunct, empty for normal local cs = style ~= "" and (style .. "| ") or "" if chart.alias_for then local aliasStyle = 'style="background:#fffde7;" ' local aliasCs = aliasStyle .. "| " local colspan = 2 + (opts.showParams and 1 or 0) + (opts.showCategories and 1 or 0) + (opts.showTemplate and 1 or 0) + (opts.showRef and 1 or 0) local aliasContent = string.format('colspan="%d" style="background:#fffde7; text-align:center; color:#666;" | \'\' → %s\'\'', colspan, chart.alias_for) local row = countryCell() .. aliasCs .. ShowCharts.chartIdCell(chartKey) if opts.showUses then row = row .. " || " .. aliasCs .. ShowCharts.usageCountLink(chartKey, opts.typeName) end row = row .. " || " .. aliasContent table.insert(rows, {content = row, note = docNote, noteStyle = aliasStyle}) countryRowsEmitted = countryRowsEmitted + 1 elseif chart.multiple and chart.combine then local row = countryCell() .. cs .. ShowCharts.chartIdCell(chartKey) .. (chart.defunct and " ''(defunct)''" or "") if opts.showUses then row = row .. " || " .. cs .. ShowCharts.usageCountLink(chartKey, opts.typeName) end row = row .. " || " .. cs .. chartDisplay row = row .. " || " .. cs .. providerDisplay if opts.showParams then local allParams = {} for _, ent in ipairs(chart.multiple) do local paramStr = ShowCharts.buildParamsStr(ent, chart) if paramStr ~= "" then allParams[paramStr] = true end end local list = {}; for param in pairs(allParams) do table.insert(list, param) end row = row .. " || " .. cs .. table.concat(list, ", ") end if opts.showCategories then row = row .. " || " .. cs .. ShowCharts.categoryLink(chart.number_one_category) end if opts.showTemplate then local calls = {} for _, ent in ipairs(chart.multiple) do table.insert(calls, ShowCharts.buildTemplateCall(chartKey, ent, chart, opts.typeName)) end row = row .. " || " .. cs .. table.concat(calls, "<br>") end if opts.showRef then local bullets = {} for _, entry in ipairs(chart.multiple) do table.insert(bullets, "• " .. ShowCharts.buildCombineBullet(entry, chart, sampleArgs)) end local prefix = chart.ref_note and escapeForTable(Template.substitute(chart.ref_note, sampleArgs, chart, nil)) or "" local content = prefix ~= "" and (prefix .. "<br>" .. table.concat(bullets, "<br>")) or table.concat(bullets, "<br>") if chart.ref then content = content .. "<br>" .. escapeForTable(Template.substitute(chart.ref, sampleArgs, chart, nil)) .. "." end row = row .. " || " .. cs .. content end table.insert(rows, {content = row, note = docNote, noteStyle = style}) countryRowsEmitted = countryRowsEmitted + 1 elseif chart.multiple then local entryGroups = ShowCharts.groupMultipleEntries(chart.multiple, chart.defunct) local groupIndex = 1 local currentGroup = entryGroups[groupIndex] for j, entry in ipairs(chart.multiple) do while currentGroup and j > (currentGroup.start + currentGroup.count - 1) do groupIndex = groupIndex + 1 currentGroup = entryGroups[groupIndex] end local isGroupFirst = currentGroup and j == currentGroup.start local groupRowspan = currentGroup and currentGroup.count or 1 local rowDefunct = currentGroup and currentGroup.defunct or (chart.defunct or entry.defunct) local entryStyle = rowDefunct and 'style="background:#ffebee;" ' or "" local entryCs = entryStyle ~= "" and (entryStyle .. "| ") or "" local entryNote = entry.doc_note or docNote local row = countryCell() .. entryCs .. ShowCharts.chartIdCell(chartKey) .. (rowDefunct and " ''(defunct)''" or "") local showWhen = entry["when"] and not ShowCharts.isRefOnlyOverride(entry, chart) if showWhen then row = row .. " → " .. entry["when"] end if isGroupFirst then if opts.showUses then row = row .. " || " .. ShowCharts.rowspanCell(ShowCharts.usageCountLink(chartKey, opts.typeName), groupRowspan, entryStyle) end row = row .. " || " .. ShowCharts.rowspanCell(chartDisplay, groupRowspan, entryStyle) row = row .. " || " .. ShowCharts.rowspanCell(providerDisplay, groupRowspan, entryStyle) end if opts.showParams then row = row .. " || " .. entryCs .. ShowCharts.buildParamsStr(entry, chart) end if opts.showCategories and isGroupFirst then row = row .. " || " .. ShowCharts.rowspanCell(ShowCharts.categoryLink(chart.number_one_category), groupRowspan, entryStyle) end if opts.showTemplate then row = row .. " || " .. entryCs .. ShowCharts.buildTemplateCall(chartKey, entry, chart, opts.typeName) end if opts.showRef then row = row .. " || " .. entryCs .. ShowCharts.buildSampleOutput(entry, chart, sampleArgs) end table.insert(rows, {content = row, note = entryNote, noteStyle = entryStyle}) countryRowsEmitted = countryRowsEmitted + 1 end else local row = countryCell() .. cs .. ShowCharts.chartIdCell(chartKey) .. (chart.defunct and " ''(defunct)''" or "") if opts.showUses then row = row .. " || " .. cs .. ShowCharts.usageCountLink(chartKey, opts.typeName) end row = row .. " || " .. cs .. chartDisplay row = row .. " || " .. cs .. providerDisplay if opts.showParams then local entry = { url = chart.url, url_title = chart.url_title } row = row .. " || " .. cs .. ShowCharts.buildParamsStr(entry, chart) end if opts.showCategories then row = row .. " || " .. cs .. ShowCharts.categoryLink(chart.number_one_category) end if opts.showTemplate then local entry = { url = chart.url, url_title = chart.url_title } row = row .. " || " .. cs .. ShowCharts.buildTemplateCall(chartKey, entry, chart, opts.typeName) end if opts.showRef then local entry = { url = chart.url, url_title = chart.url_title, lang = chart.lang } row = row .. " || " .. cs .. ShowCharts.buildSampleOutput(entry, chart, sampleArgs) end table.insert(rows, {content = row, note = docNote, noteStyle = style}) countryRowsEmitted = countryRowsEmitted + 1 end end end end -- Calculate note rowspans if opts.showNotes then local i = 1 while i <= #rows do local note = rows[i].note if note ~= "" then local span = 1 while i + span <= #rows and rows[i + span].note == note do span = span + 1 end rows[i].noteRowspan = span for j = 1, span - 1 do rows[i + j].noteRowspan = 0 end i = i + span else rows[i].noteRowspan = 1 i = i + 1 end end end return rows end function ShowCharts.generateTable(rows, caption, opts) local out = {} table.insert(out, '{| class="wikitable sortable"') table.insert(out, '|+ ' .. caption) table.insert(out, '|-') local header = '! style="width:130px" | Group !! style="width:260px" | Chart ID' if opts.showUses then header = header .. ' !! style="width:40px" | Uses' end header = header .. ' !! style="width:160px" | Chart !! style="width:170px" | Provider' if opts.showParams then header = header .. ' !! style="width:110px" | Required params' end if opts.showCategories then header = header .. ' !! #1 Category' end if opts.showTemplate then header = header .. ' !! style="width:300px" | Template call' end if opts.showRef then header = header .. ' !! style="width:310px" | Sample ref output' end if opts.showNotes then header = header .. ' !! Notes' end table.insert(out, header) for _, row in ipairs(rows) do table.insert(out, '|-') local line = row.content if opts.showNotes then local span = row.noteRowspan or 1 if span > 1 then line = line .. string.format(' || rowspan="%d" %s| %s', span, row.noteStyle, row.note) elseif span == 1 then local noteCell = row.noteStyle ~= "" and (row.noteStyle .. "| ") or "" line = line .. " || " .. noteCell .. row.note end end table.insert(out, line) end table.insert(out, '|}') return table.concat(out, '\n') end function p.showCharts(frame) local chartType = frame.args.type or CONFIG.default_type local filterCountry = frame.args.country local splitDvd = frame.args.splitdvd == "yes" or frame.args.splitdvd == "1" local ok, grouped = pcall(mw.loadJsonData, string.format(CONFIG.json_path, chartType)) if not ok then return '<span style="color:red;">ERROR: Cannot load JSON</span>' end local typeName = getTypeName(chartType) local opts = { showParams = frame.args.params ~= "no", showRef = frame.args.ref ~= "no", showUses = frame.args.uses ~= "no", showCategories = frame.args.number1 == "yes" or frame.args.number1 == "1", showNotes = frame.args.notes == "yes" or frame.args.notes == "1", showTemplate = frame.args.template == "yes" or frame.args.template == "1", sortAlpha = CONFIG.sort_order == "abc", typeName = typeName } local countries = {} for c in pairs(grouped) do if string.sub(c, 1, 1) ~= "_" and (not filterCountry or c == filterCountry) then table.insert(countries, c) end end if opts.sortAlpha then table.sort(countries) end local out = {} local jsonPage = string.format(CONFIG.json_path, chartType):gsub("%.json$", "") table.insert(out, string.format("'''Data:''' [[%s.json]] • '''Testcases:''' [[Template:%s chart/testcases]]", jsonPage, typeName)) table.insert(out, "") if splitDvd then local mainRows = ShowCharts.buildRows(grouped, countries, opts, frame, false) local dvdRows = ShowCharts.buildRows(grouped, countries, opts, frame, true) if #mainRows > 0 then table.insert(out, ShowCharts.generateTable(mainRows, typeName .. " chart outputs", opts)) end if #dvdRows > 0 then table.insert(out, "") table.insert(out, ShowCharts.generateTable(dvdRows, "Music DVD chart outputs", opts)) end else local rows = ShowCharts.buildRows(grouped, countries, opts, frame, nil) table.insert(out, ShowCharts.generateTable(rows, typeName .. " chart outputs", opts)) end return table.concat(out, '\n') end return p sw7picjas6s0a4he57yidllq8gnfjbg Module:Music chart/album.json 828 174980 739135 2026-04-22T20:50:36Z ~2026-24668-01 73666 Created page with "{ "_schema": "See single.json for schema documentation", "Argentina": { "Argentina": { "chart": "Argentine Albums", "provider": "[[CAPIF]]", "date_format": "DD/MM/YYYY", "url": "http://adminlic.capif.org.ar/sis_resultados_rankings_web.aspx", "url_title": "{artist} – {album}", "ref_note": "''Note'': On ''Fecha'', select {date} to see the correspondent chart", "ref": "Argentine Albums. CAPIF", "ref_suffix": "{{dead link|date=April 2013}}",..." 739135 json application/json { "_schema": "See single.json for schema documentation", "Argentina": { "Argentina": { "chart": "Argentine Albums", "provider": "[[CAPIF]]", "date_format": "DD/MM/YYYY", "url": "http://adminlic.capif.org.ar/sis_resultados_rankings_web.aspx", "url_title": "{artist} – {album}", "ref_note": "''Note'': On ''Fecha'', select {date} to see the correspondent chart", "ref": "Argentine Albums. CAPIF", "ref_suffix": "{{dead link|date=April 2013}}", "defunct": true, "doc_note": "Data from February 7, 2010." } }, "Australia": { "Australia": { "chart": "Australian Albums", "provider": "[[ARIA Charts|ARIA]]", "encode": [ "ansi" ], "url": "https://australian-charts.com/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "Australiancharts.com – {artist} – {album}", "ref": "Hung Medien" }, "AustraliaMV": { "chart": "Australian Music DVD", "provider": "[[Australian Recording Industry Association|ARIA]]", "doc_note": "Use ISO date format (YYYY-MM-DD) for 'archivedate'.", "multiple": [ { "when": "archivedate\u003C2011", "url": "[{archiveurl} Top 40 DVD Chart - Australian Record Industry Association]", "ref": "[[Australian Recording Industry Association]]. Archived from [http://www.ariacharts.com.au/pages/charts_display_music.asp?chart=1V40DVD the original] on {archivedate}", "doc_note": "URL provides data from May 2008 to August 2012." }, { "when": "archivedate\u003C2016", "url": "[{archiveurl} ARIA Australian Top 40 Music DVDs]", "ref": "[[Australian Recording Industry Association]]. Archived from [http://www.ariacharts.com.au/chart/music-dvds the original] on {archivedate}", "doc_note": "URL provides data from May 2011 to January 2016." }, { "when": "archivedate\u003E=2016", "url": "[{archiveurl} ARIA Australian Top 40 Music DVDs]", "ref": "[[Australian Recording Industry Association]]. Archived from [https://www.ariacharts.com.au/charts/music-dvds-chart the original] on {archivedate}", "doc_note": "URL provides data from February 2016 to December 2019." } ] } }, "Austria": { "Austria": { "chart": "Austrian Albums", "provider": "[[Ö3 Austria Top 40|Ö3 Austria]]", "encode": [ "ansi" ], "url": "https://austriancharts.at/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "Austriancharts.at – {artist} – {album}", "lang": "(in German)", "ref": "Hung Medien" }, "AustriaMV": { "chart": "Austrian Music DVD", "provider": "[[Ö3 Austria Top 40|Ö3 Austria]]", "date_format": "DD-MM-YYYY", "url": "https://austriancharts.at/charts/musik-dvd/{date}", "url_title": "Austria Top 40 – Musik-DVD: {date}", "lang": "(in German)", "ref": "[[Ö3 Austria Top 40]]. Hung Medien" } }, "Belgium": { "Flanders": { "chart": "Belgian Albums", "provider": "[[Ultratop]] Flanders", "encode": [ "ansi" ], "url": "https://www.ultratop.be/nl/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "Ultratop.be – {artist} – {album}", "lang": "(in Dutch)", "ref": "Hung Medien" }, "FlandersMV": { "chart": "Belgian Music DVD", "provider": "[[Ultratop]] Flanders", "multiple": [ { "when": "date, year", "date_format": "YYYYMMDD", "url": "https://www.ultratop.be/nl/muziek-dvd/{year}/{date}", "url_title": "Ultratop Muziek-Dvd: {year}\u0026nbsp;– {dateDMY}" }, { "when": "artist, dvd", "url": "https://www.ultratop.be/nl/showitem.asp?interpret={artist}\u0026titel={dvd}+%5BDVD%5D\u0026cat=a", "url_title": "{artist} – {dvd} [DVD\u0026#93;" }, { "when": "artist, album", "url": "https://www.ultratop.be/nl/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "{artist} – {album}" } ], "lang": "(in Dutch)", "ref": "Ultratop.be. Hung Medien", "doc_note": "Use 'dvd' if album has [DVD] tag, otherwise 'album'. For archived charts: 'year' and 'date'." }, "Wallonia": { "chart": "Belgian Albums", "provider": "[[Ultratop]] Wallonia", "encode": [ "ansi" ], "url": "https://www.ultratop.be/fr/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "Ultratop.be – {artist} – {album}", "lang": "(in French)", "ref": "Hung Medien" }, "WalloniaMV": { "chart": "Belgian Music DVD", "provider": "[[Ultratop]] Wallonia", "multiple": [ { "when": "date, year", "date_format": "YYYYMMDD", "url": "https://www.ultratop.be/fr/dvd-musicaux/{year}/{date}", "url_title": "Ultratop Dvd Musicaux: {year}\u0026nbsp;– {dateDMY}" }, { "when": "artist, dvd", "url": "https://www.ultratop.be/fr/showitem.asp?interpret={artist}\u0026titel={dvd}+%5BDVD%5D\u0026cat=a", "url_title": "{artist} – {dvd} [DVD\u0026#93;" }, { "when": "artist, album", "url": "https://www.ultratop.be/fr/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "{artist} – {album}" } ], "lang": "(in French)", "ref": "Ultratop.be. Hung Medien", "doc_note": "Use 'dvd' if album has [DVD] tag, otherwise 'album'. For archived charts: 'year' and 'date'." } }, "Brazil": { "Brazil": { "chart": "Brazilian Albums", "provider": "[[Associação Brasileira dos Produtores de Discos|ABPD]]", "url": "http://www.abpd.org.br/noticias_internas.asp?noticia={id}", "url_title": "ABPD CD - TOP 10 Semanal", "lang": "(in Portuguese)", "ref": "[[Associação Brasileira dos Produtores de Discos]]", "doc_note": "The 'id' is the number at the end of the URL (noticia=)." } }, "Canada": { "BillboardCanada": { "chart": "[[Canadian Albums Chart|Canadian Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/CNA", "url_title": "{artist} Chart History (Canadian Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "Canada": { "chart": "Canada Top Albums/CDs", "provider": "''[[RPM (magazine)|RPM]]''", "url": "https://www.bac-lac.gc.ca/eng/discover/films-videos-sound-recordings/rpm/Pages/image.aspx?Image=nlc008388.{chartid}\u0026URLjpg=http%3a%2f%2fwww.collectionscanada.gc.ca%2fobj%2f028020%2ff4%2fnlc008388.{chartid}.gif\u0026Ecopy=nlc008388.{chartid}", "url_title": "Top RPM Albums: Image {chartid}", "ref": "''[[RPM (magazine)|RPM]]''. [[Library and Archives Canada]]", "doc_note": "The 'chartid' is the number after nlc008388. in the URL." } }, "Croatia": { "Croatia": { "chart": "Croatian International Albums", "provider": "[[Top of the Shops|HDU]]", "url": "[http://www.hdu-toplista.com/index.php?what=arhiva\u0026w=details\u0026id={id} Top Stranih \u0026#91;Top Foreign\u0026#93;]", "lang": "(in Croatian)", "ref": "Top Foreign Albums. Hrvatska diskografska udruga", "doc_note": "The 'id' is the number at the end of the URL." }, "CroatiaCombined": { "chart": "Croatian Albums", "provider": "[[Top of the Shops|HDU]]", "url": "[http://www.hdu-toplista.com/index.php?what=arhiva\u0026w=details\u0026id={id} Top Kombiniranih \u0026#91;Top Combined\u0026#93;]", "lang": "(in Croatian)", "ref": "Top Combined Albums. Hrvatska diskografska udruga", "doc_note": "The 'id' is the number at the end of the URL." } }, "Czech Republic": { "Czech": { "chart": "Czech Albums", "provider": "[[International Federation of the Phonographic Industry|ČNS IFPI]]", "helper": "czech_week_id", "url": "https://ifpicr.cz/hitparada/14?weekId={helper}", "url_title": "ČNS IFPI – CZ Albums – Top 100 – {week}. týden {year}", "lang": "(in Czech)", "ref": "[[International Federation of the Phonographic Industry|ČNS IFPI]]", "doc_note": "Data from 2006w01. Week number is shown in the dropdown list (e.g. '44. týden 2019' means week 44, year 2019). If the link opens the wrong week, add the correct weekId to [[Module:Music chart/chartdata-czech.json|chartdata-czech.json]]." } }, "Denmark": { "Denmark": { "chart": "Danish Albums", "provider": "[[Hitlisten]]", "encode": [ "ansi" ], "url": "https://danishcharts.dk/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "Danishcharts.dk – {artist} – {album}", "ref": "Hung Medien", "doc_note": "Not recommended for charts prior to November 2007. Use Denmark2 instead." }, "Denmark2": { "chart": "Danish Albums", "provider": "[[Hitlisten]]", "url": "http://www.hitlisterne.dk/default.asp?w={week}\u0026y={year}\u0026list=a40", "url_title": "Top 40 Albums - {week} / {year}", "ref": "[[Tracklisten]]", "doc_note": "For album charts prior to November 2007." }, "DenmarkMV": { "chart": "Danish Music DVD", "provider": "[[Hitlisten]]", "url": "http://www.hitlisten.nu/andrelister.asp?w={week}\u0026y={year}\u0026list=v10", "url_title": "Musik Video Top-10: Uge {week} – {year}", "lang": "(in Danish)", "ref": "Hitlisten.NU" } }, "Finland": { "Finland": { "chart": "Finnish Albums", "provider": "[[The Official Finnish Charts|Suomen virallinen lista]]", "encode": [ "normalize", "lower", "clean-symbols", "space-dash" ], "url": "https://www.ifpi.fi/lista/artistit/{artist}/albumi/{album}", "url_title": "{artist}: {album}", "lang": "(in Finnish)", "ref": "[[Musiikkituottajat – IFPI Finland]]" }, "FinlandMV": { "chart": "Finnish Music DVD", "provider": "[[The Official Finnish Charts|Suomen virallinen lista]]", "encode": [ "normalize", "lower", "clean-symbols", "space-dash" ], "url": "https://ifpi.fi/lista/artistit/{artist}/albumi/{album}/", "url_title": "{artist}: {album}", "lang": "(in Finnish)", "ref": "[[Musiikkituottajat – IFPI Finland]]" } }, "France": { "France": { "chart": "French Albums", "provider": "[[SNEP]]", "encode": [ "ansi" ], "url": "https://lescharts.com/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "Lescharts.com – {artist} – {album}", "ref": "Hung Medien" }, "FranceMV": { "chart": "French Music DVD", "provider": "[[SNEP]]", "url": "http://www.chartsinfrance.net/charts/{id}/videos-musicales.php", "url_title": "{artist} – {dvd}", "lang": "(in French)", "ref": "Classement Officiel des ventes de DVD Musicaux. [[SNEP]]", "doc_note": "The 'id' is the number in the URL before /videos-musicales.php." } }, "Germany": { "Germany": { "chart": "German Albums", "provider": "[[GfK Entertainment charts|Offizielle Top 100]]", "url": "https://www.offiziellecharts.de/album-details-{id}", "url_title": "Offiziellecharts.de – {artist} – {album}", "lang": "(in German)", "ref": "[[GfK Entertainment charts]]", "doc_note": "The 'id' is the number at the end of the URL." }, "GermanyComp": { "chart": "German Compilation Albums", "provider": "[[GfK Entertainment charts|Offizielle Top 100]]", "url": "https://www.offiziellecharts.de/charts/compilation/for-date-{helper}", "url_title": "Offizielle Deutsche Charts – Top 30 Compilation-Charts", "date_format": "DD.MM.YYYY", "helper": "germany_timestamp", "ref": "[[GfK Entertainment charts]]", "doc_note": "Data available from 1992. Use the first date above the chart as date (right after 'Datum:'). Module converts it into the ID." }, "GermanyPop": { "chart": "German Pop Albums", "provider": "[[GfK Entertainment charts|Offizielle Top 100]]", "url": "https://www.offiziellecharts.de/pop-details-{id}", "url_title": "Offiziellecharts.de – {artist} – {album}", "lang": "(in German)", "ref": "[[GfK Entertainment charts]]", "doc_note": "The 'id' is the number at the end of the URL." } }, "Greece": { "Greece": { "chart": "Greek Albums", "provider": "[[IFPI Greece|IFPI]]", "encode": [ "ansi" ], "url": "http://greekcharts.com/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "Greekcharts.com – {artist} – {album}", "ref": "Hung Medien", "doc_note": "Data available from 2010 to 2011, week 31 only." } }, "Hungary": { "Hungary": { "chart": "Hungarian Albums", "provider": "[[Association of Hungarian Record Companies|MAHASZ]]", "url": "https://slagerlistak.hu/album-top-40-slagerlista/{year}/{week}", "url_title": "Album Top 40 slágerlista – {year}. {week}. hét", "lang": "(in Hungarian)", "ref": "[[Association of Hungarian Record Companies|MAHASZ]]" }, "HungaryComp": { "chart": "Hungarian Compilation Albums", "provider": "[[Association of Hungarian Record Companies|MAHASZ]]", "url": "https://slagerlistak.hu/album-top-40-slagerlista/{year}/{week}", "url_title": "Válogatás- és mixlemezek slágerlistája – {year}. {week}. hét", "lang": "(in Hungarian)", "ref": "[[Association of Hungarian Record Companies|MAHASZ]]", "doc_note": "Data available from 2000. Listed under the main albums chart." } }, "Ireland": { "Ireland": { "chart": "Irish Albums", "provider": "[[Irish Recorded Music Association|IRMA]]", "url": "https://web.archive.org/web/20180101010101/https://www.chart-track.co.uk/index.jsp?c=p%2Fmusicvideo%2Fmusic%2Farchive%2Findex_test.jsp\u0026ct=240002\u0026arch=t\u0026lyr={year}\u0026year={year}\u0026week={week}", "url_title": "GFK Chart-Track Albums: Week {week}, {year}", "ref": "[[GfK Chart-Track]]. [[Irish Recorded Music Association|IRMA]]. Archived from [https://www.chart-track.co.uk/index.jsp?c=p%2Fmusicvideo%2Fmusic%2Farchive%2Findex_test.jsp\u0026ct=240002\u0026arch=t\u0026lyr={year}\u0026year={year}\u0026week={week} the original]", "doc_note": "Week 1–53, no leading zero. Data 2000–2016.", "defunct": true }, "Ireland2": { "chart": "Irish Albums", "provider": "[[Irish Recorded Music Association|IRMA]]", "encode": [ "ansi" ], "url": "http://www.irish-charts.com/showinterpret.asp?interpret={artist}", "url_title": "Irish-charts.com – Discography {artist}", "ref": "Hung Medien", "doc_note": "Links to the artist's discography." }, "Ireland3": { "chart": "Irish Albums", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/irish-albums-chart/{dateDigits}/ie7502/", "url_title": "Official Irish Albums Chart on {dateSlash} – Top 50", "ref": "[[Official Charts Company]]", "doc_note": "Data from January 6, 2017." }, "IrelandClassical": { "chart": "Irish Classical Albums", "provider": "[[Irish Recorded Music Association|IRMA]]", "url": "https://web.archive.org/web/20180101010101/https://www.chart-track.co.uk/index.jsp?c=p%2Fmusicvideo%2Fmusic%2Farchive%2Findex_test.jsp\u0026ct=240005\u0026arch=t\u0026lyr={year}\u0026year={year}\u0026week={week}", "url_title": "GFK Chart-Track – Classical Albums: Week {week}, {year}", "ref": "[[GfK Chart-Track]]. [[Irish Recorded Music Association|IRMA]]. Archived from [https://www.chart-track.co.uk/index.jsp?c=p%2Fmusicvideo%2Fmusic%2Farchive%2Findex_test.jsp\u0026ct=240005\u0026arch=t\u0026lyr={year}\u0026year={year}\u0026week={week} the original]", "doc_note": "Week 1–53, no leading zero.", "defunct": true }, "IrelandComp": { "chart": "Irish Compilation Albums", "provider": "[[Irish Recorded Music Association|IRMA]]", "url": "https://web.archive.org/web/20180101010101/https://www.chart-track.co.uk/index.jsp?c=p%2Fmusicvideo%2Fmusic%2Farchive%2Findex_test.jsp\u0026ct=240003\u0026arch=t\u0026lyr={year}\u0026year={year}\u0026week={week}", "url_title": "GFK Chart-Track – Multi-Artist Compilation Albums: Week {week}, {year}", "ref": "[[GfK Chart-Track]]. [[Irish Recorded Music Association|IRMA]]. Archived from [https://www.chart-track.co.uk/index.jsp?c=p%2Fmusicvideo%2Fmusic%2Farchive%2Findex_test.jsp\u0026ct=240003\u0026arch=t\u0026lyr={year}\u0026year={year}\u0026week={week} the original]", "doc_note": "Week 1–53, no leading zero.", "defunct": true }, "IrelandIndependent": { "chart": "Irish Independent Albums", "provider": "[[Irish Recorded Music Association|IRMA]]", "url": "https://web.archive.org/web/20180101010101/https://www.chart-track.co.uk/index.jsp?c=p%2Fmusicvideo%2Fmusic%2Farchive%2Findex_test.jsp\u0026ct=240007\u0026arch=t\u0026lyr={year}\u0026year={year}\u0026week={week}", "url_title": "GFK Chart-Track – Independent Albums: Week {week}, {year}", "ref": "[[GfK Chart-Track]]. [[Irish Recorded Music Association|IRMA]]. Archived from [https://www.chart-track.co.uk/index.jsp?c=p%2Fmusicvideo%2Fmusic%2Farchive%2Findex_test.jsp\u0026ct=240007\u0026arch=t\u0026lyr={year}\u0026year={year}\u0026week={week} the original]", "doc_note": "Week 1–53, no leading zero.", "defunct": true }, "IrelandMV": { "chart": "Irish Music Videos", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/irish-video-chart/{dateDigits}/ie12/", "url_title": "Official Irish Video Chart on {dateSlash} – Top 50", "ref": "[[Official Charts Company]]", "doc_note": "Data from January 6, 2017." } }, "Italy": { "Italy": { "chart": "Italian Albums", "provider": "[[Federazione Industria Musicale Italiana|FIMI]]", "encode": [ "ansi" ], "url": "https://italiancharts.com/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "Italiancharts.com – {artist} – {album}", "ref": "Hung Medien" }, "ItalyMV": { "chart": "Italian Music DVD", "provider": "[[Federazione Industria Musicale Italiana|FIMI]]", "url": "https://www.fimi.it/top-of-the-music/classifiche.kl#/charts/4/{year}/{week}", "url_title": "DVD: Classifica settimanale WK {week} (dal {startdate} al {enddate})", "lang": "(in Italian)", "ref": "[[Federazione Industria Musicale Italiana]]" } }, "Japan": { "Oricon": { "chart": "Japanese Albums", "provider": "[[Oricon]]", "date_format": "YYYY-MM-DD", "multiple": [ { "when": "date\u003C2021-03-15", "url": "https://web.archive.org/web/20210101010101/https://www.oricon.co.jp/rank/ja/w/{date}/", "ref": "[[Oricon]]. Archived from [https://www.oricon.co.jp/rank/ja/w/{date}/ the original]" }, { "when": "date\u003E=2021-03-15", "url": "https://www.oricon.co.jp/rank/ja/w/{date}/", "ref": "[[Oricon]]" } ], "url_title": "Oricon Top 50 Albums: {date}", "lang": "(in Japanese)", "doc_note": "Charts before March 15, 2021 are available only in the archive." } }, "Mexico": { "Mexico": { "chart": "Mexican Albums", "provider": "[[Top 100 Mexico]]", "encode": [ "ansi" ], "url": "http://www.mexicancharts.com/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "Mexicancharts.com – {artist} – {album}", "ref": "Hung Medien", "doc_note": "Data available until 2011, week 49. Use Mexico2 for later data." }, "Mexico2": { "chart": "Mexican Albums", "provider": "[[Top 100 Mexico]]", "url": "[{archiveurl} {artist} – {album}]", "ref": "[[Asociación Mexicana de Productores de Fonogramas y Videogramas]]. Archived from [http://www.centrodedesarrollodigital.com/amprofon3/Top100.pdf the original] on {archivedate}", "defunct": true, "doc_note": "Data from 2011, week 49 to 2013, week 18. Look for the archive links in the lists by year from [[Top 100 Mexico]]." } }, "Netherlands": { "Netherlands": { "chart": "Dutch Albums", "provider": "[[Dutch Album Top 100|Album Top 100]]", "encode": [ "ansi" ], "url": "https://dutchcharts.nl/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "Dutchcharts.nl – {artist} – {album}", "lang": "(in Dutch)", "ref": "Hung Medien" }, "NetherlandsComp": { "chart": "Dutch Compilation Albums", "provider": "[[MegaCharts|Compilation Top 30]]", "url": "https://dutchcharts.nl/weekchart.asp?cat=c\u0026date={date}\u0026year={year}", "url_title": "Dutchcharts.nl – {artist} – {album}", "ref": "Hung Medien" }, "NetherlandsMV": { "chart": "Dutch Music DVD", "provider": "[[MegaCharts]]", "multiple": [ { "when": "artist, dvd", "url": "https://dutchcharts.nl/showitem.asp?interpret={artist}\u0026titel={dvd}+%5BDVD%5D\u0026cat=a", "url_title": "{artist} – {dvd} [DVD\u0026#93;" }, { "when": "artist, album", "url": "https://dutchcharts.nl/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "{artist} – {album}" } ], "lang": "(in Dutch)", "ref": "Dutchcharts.nl. Hung Medien", "doc_note": "Use 'dvd' parameter if album name has [DVD] tag, otherwise use 'album'." } }, "New Zealand": { "New Zealand": { "chart": "New Zealand Albums", "provider": "[[Official New Zealand Music Chart|RMNZ]]", "encode": [ "ansi" ], "url": "https://charts.nz/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "Charts.nz – {artist} – {album}", "ref": "Hung Medien" } }, "Norway": { "Norway": { "chart": "Norwegian Albums", "provider": "[[VG-lista]]", "encode": [ "ansi" ], "url": "https://norwegiancharts.com/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "Norwegiancharts.com – {artist} – {album}", "ref": "Hung Medien" } }, "Poland": { "Poland": { "chart": "Polish Albums", "provider": "[[Polish Society of the Phonographic Industry|ZPAV]]", "url": "http://olis.onyx.pl/listy/index.asp?idlisty={id}\u0026lang=en", "url_title": "Oficjalna lista sprzedaży :: OLiS - Official Retail Sales Chart", "ref": "[[Polish music charts|OLiS]]. [[Polish Society of the Phonographic Industry]]", "doc_note": "The 'id' is the number at the end of the URL (idlisty=)." }, "Poland2": { "chart": "Polish Albums", "provider": "[[Polish Society of the Phonographic Industry|ZPAV]]", "date_format": "DD.MM.YYYY–DD.MM.YYYY", "url": "https://www.olis.pl/charts/oficjalna-lista-sprzedazy/albumy", "url_title": "OLiS - oficjalna lista sprzedaży - albumy", "lang": "(in Polish)", "ref_note": "''Note'': Change the date to {date} under \"zmień zakres od–do:\"", "ref": "[[Polish music charts|OLiS]]. [[Polish Society of the Phonographic Industry]]" } }, "Portugal": { "Portugal": { "chart": "Portuguese Albums", "provider": "[[Associação Fonográfica Portuguesa|AFP]]", "encode": [ "ansi" ], "url": "https://portuguesecharts.com/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "Portuguesecharts.com – {artist} – {album}", "ref": "Hung Medien" } }, "South Korea": { "Korea": { "chart": "South Korean Albums", "provider": "[[Circle Chart|Circle]]", "date_format": "YYYY.MM.DD–YYYY.MM.DD", "url": "https://circlechart.kr/page_chart/album.circle", "url_title": "South Korea Circle Album Chart", "ref_note": "''Note'': On the page, select \"{date}\" to obtain the corresponding chart", "ref": "[[Circle Chart|Circle Chart]]", "doc_note": "Overall albums (national and foreign combined)." }, "KoreaInt": { "chart": "South Korean International Albums", "provider": "[[Circle Chart|Circle]]", "date_format": "YYYY.MM.DD–YYYY.MM.DD", "url": "https://circlechart.kr/page_chart/album.circle?hitYear=2018\u0026nationGbn=E", "url_title": "South Korea Circle International Album Chart", "ref_note": "''Note'': On the page, select \"{date}\" to obtain the corresponding chart", "ref": "[[Circle Chart|Circle Chart]]", "doc_note": "Only albums from foreign artists." }, "KoreaNat": { "chart": "South Korean National Albums", "provider": "[[Circle Chart|Circle]]", "date_format": "YYYY.MM.DD–YYYY.MM.DD", "url": "https://circlechart.kr/page_chart/album.circle?hitYear=2018\u0026nationGbn=K", "url_title": "South Korea Circle National Album Chart", "ref_note": "''Note'': On the page, select \"{date}\" to obtain the corresponding chart", "ref": "[[Circle Chart|Circle Chart]]", "doc_note": "Only albums from Korean artists." } }, "Slovakia": { "Slovakia": { "chart": "Slovak Albums", "provider": "[[International Federation of the Phonographic Industry|ČNS IFPI]]", "helper": "czech_week_id", "url": "https://ifpicr.cz/hitparada/36?weekId={helper}", "url_title": "ČNS IFPI – SK Albums – Top 100 – {week}. týden {year}", "lang": "(in Czech)", "ref": "[[International Federation of the Phonographic Industry|ČNS IFPI]]", "doc_note": "Data from 2016w43. Week number is shown in the dropdown list (e.g. '44. týden 2019' means week 44, year 2019). If the link opens the wrong week, add the correct weekId to [[Module:Music chart/chartdata-czech.json|chartdata-czech.json]]." } }, "Spain": { "Spain": { "chart": "Spanish Albums", "provider": "[[Productores de Música de España|Promusicae]]", "encode": [ "ansi" ], "url": "https://spanishcharts.com/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "Spanishcharts.com – {artist} – {album}", "ref": "Hung Medien" }, "SpainMV": { "chart": "Spanish Music DVD", "provider": "[[Productores de Música de España|Promusicae]]", "url": "https://www.promusicae.es/en/weekly-charts/", "url_title": "Weekly Charts - Promusicae", "ref_note": "''Note'': Select ''Category'': DVD, ''Year'': {year}, then find week {week} in the list.", "ref": "Top 20 DVD Musical. [[Productores de Música de España|Promusicae]]" } }, "Sweden": { "Sweden": { "chart": "Swedish Albums", "provider": "[[Sverigetopplistan]]", "encode": [ "ansi" ], "url": "https://swedishcharts.com/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "Swedishcharts.com – {artist} – {album}", "ref": "Hung Medien" }, "SwedenMV": { "chart": "Swedish Music DVD", "provider": "[[Sverigetopplistan]]", "url": "https://www.sverigetopplistan.se/chart/105?dspy={year}\u0026dspp={week}", "url_title": "Veckolista DVD Album – Vecka {week}, {year}", "lang": "(in Swedish)", "ref": "[[Sverigetopplistan]]", "doc_note": "The URL contains 'year' (dspy=) and 'week' (dspp=) parameters." } }, "Switzerland": { "Switzerland": { "chart": "Swiss Albums", "provider": "[[Swiss Hitparade|Schweizer Hitparade]]", "encode": [ "ansi" ], "url": "http://swisscharts.com/showitem.asp?interpret={artist}\u0026titel={album}\u0026cat=a", "url_title": "Swisscharts.com – {artist} – {album}", "ref": "Hung Medien" }, "SwitzerlandMV": { "chart": "Swiss Music DVD", "provider": "[[Swiss Hitparade|Schweizer Hitparade]]", "url": "http://swisscharts.com/charts/musik-dvd/{date}", "url_title": "Schweizer Hitparade – Musik-DVD Top 10: {dateDMY}", "date_format": "DD-MM-YYYY", "ref": "[[Swiss Hitparade]]. Hung Medien" } }, "United Kingdom": { "Scotland": { "chart": "[[Scottish Singles and Albums Charts|Scottish Albums]]", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/scottish-albums-chart/{dateDigits}/40/", "url_title": "Official Scottish Albums Chart on {dateSlash} – Top 100", "ref": "[[Official Charts Company]]", "doc_note": "Data from February 27, 1994." }, "UK": { "chart": "[[UK Albums Chart|UK Albums]]", "provider": "[[Official Charts Company|OCC]]", "url": "https://www.officialcharts.com/artist/_/{artist}/", "url_title": "{artist} Songs and Albums | Full Official Chart History", "ref": "[[Official Charts Company]]", "doc_note": "The site uses an internal resolver to redirect artist names to their discography pages. If this does not work, use UK2." }, "UK2": { "chart": "[[UK Albums Chart|UK Albums]]", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/albums-chart/{dateDigits}/7502/", "url_title": "Official Albums Chart on {dateSlash} – Top 100", "ref": "[[Official Charts Company]]", "doc_note": "Data from July 22, 1956." }, "UKAmericana": { "chart": "[[Official Americana Albums Chart|UK Americana Albums]]", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/americana-albums-chart/{dateDigits}/americana/", "url_title": "Official Americana Albums Chart on {dateSlash} – Top 40", "ref": "[[Official Charts Company]]", "doc_note": "Data from January 29, 2016." }, "UKChristian": { "chart": "[[Official Christian \u0026 Gospel Albums Chart|UK Christian \u0026 Gospel Albums]]", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/christian-and-gospel-albums-chart/{dateDigits}/christ/", "url_title": "Official Christian \u0026 Gospel Albums Chart on {dateSlash} – Top 20", "ref": "[[Official Charts Company]]" }, "UKComp": { "chart": "[[UK Compilation Chart|UK Compilation Albums]]", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/official-compilations-chart/{dateDigits}/7503/", "url_title": "Official Compilations Chart on {dateSlash} – Top 100", "ref": "[[Official Charts Company]]", "doc_note": "Data from February 6, 1994." }, "UKCountry": { "chart": "UK Country Albums", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/country-artists-albums-chart/{dateDigits}/21/", "url_title": "Official Country Artists Albums Chart on {dateSlash} – Top 20", "ref": "[[Official Charts Company]]", "doc_note": "Data from January 30, 1994." }, "UKDance": { "chart": "[[UK Dance Singles and Albums Charts|UK Dance Albums]]", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/dance-albums-chart/{dateDigits}/105/", "url_title": "Official Dance Albums Chart on {dateSlash} – Top 40", "ref": "[[Official Charts Company]]", "doc_note": "Data from September 25, 2005." }, "UKDigital": { "chart": "[[UK Album Downloads Chart|UK Album Downloads]]", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/albums-downloads-chart/{dateDigits}/7003/", "url_title": "Official Album Downloads Chart on {dateSlash} – Top 100", "ref": "[[Official Charts Company]]", "doc_note": "Data from April 9, 2006." }, "UKIndependent": { "chart": "[[UK Independent Singles and Albums Charts|UK Independent Albums]]", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/independent-albums-chart/{dateDigits}/131/", "url_title": "Official Independent Albums Chart on {dateSlash} – Top 50", "ref": "[[Official Charts Company]]", "doc_note": "Data from October 12, 1997." }, "UKJazz": { "chart": "UK Jazz \u0026 Blues Albums", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/jazz-and-blues-albums-chart/{dateDigits}/18/", "url_title": "Official Jazz \u0026 Blues Albums Chart on {dateSlash} – Top 30", "ref": "[[Official Charts Company]]", "doc_note": "Data from January 30, 1994." }, "UKMV": { "chart": "UK Music Videos", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/music-video-chart/{dateDigits}/13/", "url_title": "Official Music Video Chart on {dateSlash} – Top 50", "ref": "[[Official Charts Company]]", "doc_note": "Data from January 30, 1994." }, "UKProgressive": { "chart": "UK Progressive Albums", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/progressive-albums-chart/{dateDigits}/prog/", "url_title": "Official Progressive Albums Chart on {dateSlash} – Top 30", "ref": "[[Official Charts Company]]", "doc_note": "Data from October 7, 2015." }, "UKR\u0026B": { "chart": "[[UK R\u0026B Chart|UK R\u0026B Albums]]", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/r-and-b-albums-chart/{dateDigits}/115/", "url_title": "Official R\u0026B Albums Chart on {dateSlash} – Top 40", "ref": "[[Official Charts Company]]", "doc_note": "Data from October 9, 1994." }, "UKRock": { "chart": "[[UK Rock Chart|UK Rock \u0026 Metal Albums]]", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/rock-and-metal-albums-chart/{dateDigits}/112/", "url_title": "Official Rock \u0026 Metal Albums Chart on {dateSlash} – Top 40", "ref": "[[Official Charts Company]]", "doc_note": "Data from October 9, 1994." }, "UKSoundtrack": { "chart": "UK Soundtrack Albums", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.officialcharts.com/charts/soundtrack-albums-chart/{dateDigits}/140/", "url_title": "Official Soundtrack Albums Chart on {dateSlash} – Top 50", "ref": "[[Official Charts Company]]", "doc_note": "Data from January 13, 2002." }, "UKZobbel": { "chart": "UK Albums", "provider": "[[Official Charts Company|OCC]]", "date_format": "YYMMDD", "url": "http://www.zobbel.de/cluk/{date}cluk.txt", "url_title": "Chart Log UK: {dateDMY}", "ref": "[[UK Albums Chart]]. Zobbel.de", "doc_note": "Data available from January 15, 2005 to January 30, 2016." } }, "United States": { "Billboard200": { "chart": "US [[Billboard 200|''Billboard'' 200]]", "url": "https://www.billboard.com/artist/{artist}/chart-history/TLP", "url_title": "{artist} Chart History (''Billboard'' 200)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardAlbumSales": { "chart": "US [[Top Album Sales]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/TSL", "url_title": "{artist} Chart History (Top Album Sales)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardAlternative": { "chart": "US [[Top Alternative Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/ALT", "url_title": "{artist} Chart History (Top Alternative Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardBluegrass": { "chart": "US [[Top Bluegrass Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/BGR", "url_title": "{artist} Chart History (Top Bluegrass Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardBlues": { "chart": "US [[Top Blues Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/BLU", "url_title": "{artist} Chart History (Top Blues Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardCatalog": { "chart": "US [[Top Catalog Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/TLC", "url_title": "{artist} Chart History (Top Catalog Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardChristian": { "chart": "US [[Top Christian Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/ILL", "url_title": "{artist} Chart History (Christian Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardClassical": { "chart": "US [[Top Classical Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/COA", "url_title": "{artist} Chart History (Top Classical Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardClassicalCrossover": { "chart": "US [[Top Classical Crossover Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/CCF", "url_title": "{artist} Chart History (Top Classical Crossover Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardComedy": { "chart": "US [[Top Comedy Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/GIG", "url_title": "{artist} Chart History (Top Comedy Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardContemporaryJazz": { "chart": "US [[Top Contemporary Jazz Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/JCR", "url_title": "{artist} Chart History (Top Contemporary Jazz Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardCountry": { "chart": "US [[Top Country Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/CLP", "url_title": "{artist} Chart History (Top Country Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardCurrentAlbums": { "chart": "US [[Top Current Album Sales]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/tcl", "url_title": "{artist} Chart History (Top Current Album Sales)", "ref": "''[[Billboard (magazine)|Billboard]]''", "ref_suffix": "{{dead link|date=March 2026}}", "encode": [ "normalize", "space-dash" ], "defunct": true }, "BillboardDanceElectronic": { "chart": "US [[Top Dance Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/ELP", "url_title": "{artist} Chart History (Top Dance/Electronic Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardDigital": { "chart": "US [[Digital Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/digital-albums", "url_title": "{artist} Chart History (Digital Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "ref_suffix": "{{dead link|date=October 2023}}", "encode": [ "ansi", "space-dash" ], "defunct": true }, "BillboardFolk": { "chart": "US [[Americana/Folk Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/FLK", "url_title": "{artist} Chart History (Top Americana/Folk Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardGospel": { "chart": "US [[Top Gospel Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/SLL", "url_title": "{artist} Chart History (Top Gospel Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardHardRock": { "chart": "US [[Top Hard Rock Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/MTL", "url_title": "{artist} Chart History (Top Hard Rock Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardHeatseekers": { "chart": "US [[Top Heatseekers|Heatseekers Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/TLN", "url_title": "{artist} Chart History (Heatseekers Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardHoliday": { "chart": "US [[Top Holiday Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/XML", "url_title": "{artist} Chart History (Holiday Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardIndependent": { "chart": "US [[Independent Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/IND", "url_title": "{artist} Chart History (Independent Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardJazz": { "chart": "US [[Top Jazz Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/JLS", "url_title": "{artist} Chart History (Top Jazz Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardLatin": { "chart": "US [[Top Latin Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/LCM", "url_title": "{artist} Chart History (Top Latin Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardLatinPop": { "chart": "US [[Latin Pop Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/LPP", "url_title": "{artist} Chart History (Latin Pop Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardLatinRhythm": { "chart": "US [[Latin Rhythm Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/LRH", "url_title": "{artist} Chart History (Latin Rhythm Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardRandB": { "chart": "US [[Top R\u0026B Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/RBL", "url_title": "{artist} Chart History (Top R\u0026B Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardRandBHipHop": { "chart": "US [[Top R\u0026B/Hip-Hop Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/BLP", "url_title": "{artist} Chart History (Top R\u0026B/Hip-Hop Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardRap": { "chart": "US [[Top Rap Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/RLP", "url_title": "{artist} Chart History (Top Rap Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardReggae": { "chart": "US Reggae Albums", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/JAH", "url_title": "{artist} Chart History (Reggae Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardRegionalMexican": { "chart": "US [[Regional Mexican Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/LRM", "url_title": "{artist} Chart History (Regional Mexican Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardRock": { "chart": "US [[Top Rock Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/RCK", "url_title": "{artist} Chart History (Top Rock Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardSoundtrack": { "chart": "US Soundtrack Albums", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/STX", "url_title": "{artist} Chart History (Soundtrack Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardTastemaker": { "chart": "US Indie Store Album Sales", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/TAS", "url_title": "{artist} Chart History (Top Tastemaker Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardTropical": { "chart": "US [[Tropical Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/LTS", "url_title": "{artist} Chart History (Tropical Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardVinyl": { "chart": "US [[Vinyl Albums]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/VNL", "url_title": "{artist} Chart History (Vinyl Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "BillboardWorld": { "chart": "US World Albums", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/WLP", "url_title": "{artist} Chart History (World Albums)", "ref": "''[[Billboard (magazine)|Billboard]]''", "encode": [ "normalize", "space-dash" ] }, "USMV": { "chart": "US [[Music Video Sales]]", "provider": "''[[Billboard (magazine)|Billboard]]''", "url": "https://www.billboard.com/artist/{artist}/chart-history/music-video-sales", "url_title": "{artist} Chart History (Music Video Sales)", "ref": "''[[Billboard charts|Billboard]]''", "encode": [ "ansi", "space-dash" ], "defunct": true, "doc_note": "Data available from 1980." }, "Canada2": { "chart": "[[Canada Singles and Albums Charts|Canada Albums]]", "provider": "[[RIAA Charts|RIAA]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.riaa.com/charts/canada-albums-chart/{dateDigits}/40/", "url_title": "RIAA Canada Albums Chart on {dateSlash} – Top 100", "ref": "[[RIAA Charts]]", "doc_note": "Data from February 27, 1994." }, "US": { "chart": "[[US Albums Chart|US Albums]]", "provider": "[[RIAA Charts|RIAA]]", "url": "https://www.riaa.com/artist/_/{artist}/", "url_title": "{artist} Songs and Albums | Full RIAA Chart History", "ref": "[[RIAA Charts]]", "doc_note": "The site uses an internal resolver to redirect artist names to their discography pages. If this does not work, use US2." }, "US2": { "chart": "[[US Albums Chart|US Albums]]", "provider": "[[RIAA Charts|RIAA]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.riaa.com/charts/albums-chart/{dateDigits}/7502/", "url_title": "RIAA Albums Chart on {dateSlash} – Top 100", "ref": "[[RIAA Charts]]", "doc_note": "Data from July 22, 1956." }, "USAmericana": { "chart": "[[RIAA Americana Albums Chart|US Americana Albums]]", "provider": "[[RIAA Charts|RIAA]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.riaa.com/charts/americana-albums-chart/{dateDigits}/americana/", "url_title": "RIAA Americana Albums Chart on {dateSlash} – Top 40", "ref": "[[RIAA Charts]]", "doc_note": "Data from January 29, 2016." }, "USChristian": { "chart": "[[RIAA Christian \u0026 Gospel Albums Chart|US Christian \u0026 Gospel Albums]]", "provider": "[[RIAA Charts|RIAA]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.riia.com/charts/christian-and-gospel-albums-chart/{dateDigits}/christ/", "url_title": "RIAA Christian \u0026 Gospel Albums Chart on {dateSlash} – Top 20", "ref": "[[RIAA Charts]]" }, "USComp": { "chart": "[[US Compilation Chart|US Compilation Albums]]", "provider": "[[RIAA Charts|RIAA]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.riaa.com/charts/riaa-compilations-chart/{dateDigits}/7503/", "url_title": "RIAA Compilations Chart on {dateSlash} – Top 100", "ref": "[[RIAA Charts]]", "doc_note": "Data from February 6, 1994." }, "USCountry": { "chart": "US Country Albums", "provider": "[[RIAA Charts|RIAA]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.RIAA.com/charts/country-artists-albums-chart/{dateDigits}/21/", "url_title": "RIAA Country Artists Albums Chart on {dateSlash} – Top 20", "ref": "[[RIAA Charts]]", "doc_note": "Data from January 30, 1994." }, "USDance": { "chart": "[[US Dance Singles and Albums Charts|US Dance Albums]]", "provider": "[[RIAA Charts|RIAA]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.riaa.com/charts/dance-albums-chart/{dateDigits}/105/", "url_title": "RIAA Dance Albums Chart on {dateSlash} – Top 40", "ref": "[[RIAA Charts]]", "doc_note": "Data from September 25, 2005." }, "USDigital": { "chart": "[[US Album Downloads Chart|US Album Downloads]]", "provider": "[[RIAA Charts|RIAA]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.riaa.com/charts/albums-downloads-chart/{dateDigits}/7003/", "url_title": "RIAA Album Downloads Chart on {dateSlash} – Top 100", "ref": "[[RIAA Charts]]", "doc_note": "Data from April 9, 2006." }, "USIndependent": { "chart": "[[US Independent Singles and Albums Charts|US Independent Albums]]", "provider": "[[RIAA Charts|RIAA]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.riaa.com/charts/independent-albums-chart/{dateDigits}/131/", "url_title": "RIAA Independent Albums Chart on {dateSlash} – Top 50", "ref": "[[RIAA Charts]]", "doc_note": "Data from October 12, 1997." }, "USJazz": { "chart": "US Jazz \u0026 Blues Albums", "provider": "[[RIAA Charts|RIAA]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.riaa.com/charts/jazz-and-blues-albums-chart/{dateDigits}/18/", "url_title": "RIAA Jazz \u0026 Blues Albums Chart on {dateSlash} – Top 30", "ref": "[[RIAA Charts]]", "doc_note": "Data from January 30, 1994." }, "USMV2": { "chart": "US Music Videos", "provider": "[[RIAA Charts|RIAA]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.riaa.com/charts/music-video-chart/{dateDigits}/13/", "url_title": "RIAA Music Video Chart on {dateSlash} – Top 50", "ref": "[[RIAA Charts]]", "doc_note": "Data from January 30, 1994." }, "USProgressive": { "chart": "US Progressive Albums", "provider": "[[RIAA Charts|RIAA]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.riaa.com/charts/progressive-albums-chart/{dateDigits}/prog/", "url_title": "RIAA Progressive Albums Chart on {dateSlash} – Top 30", "ref": "[[RIAA Charts]]", "doc_note": "Data from October 7, 2015." }, "USR\u0026B": { "chart": "[[US R\u0026B Chart|US R\u0026B Albums]]", "provider": "[[RIAA Charts|RIAA]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.riaa.com/charts/r-and-b-albums-chart/{dateDigits}/115/", "url_title": "RIAA R\u0026B Albums Chart on {dateSlash} – Top 40", "ref": "[[RIAA Charts]]", "doc_note": "Data from October 9, 1994." }, "USRock": { "chart": "[[US Rock Chart|US Rock \u0026 Metal Albums]]", "provider": "[[RIAA Charts|RIAA]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.riaa.com/charts/rock-and-metal-albums-chart/{dateDigits}/112/", "url_title": "RIAA Rock \u0026 Metal Albums Chart on {dateSlash} – Top 40", "ref": "[[RIAA Charts]]", "doc_note": "Data from October 9, 1994." }, "USSoundtrack": { "chart": "US Soundtrack Albums", "provider": "[[RIAA Charts|RIAA]]", "date_format": "YYYYMMDD", "date_format_alt": "YYYY-MM-DD", "url": "https://www.riaa.com/charts/soundtrack-albums-chart/{dateDigits}/140/", "url_title": "RIAA Soundtrack Albums Chart on {dateSlash} – Top 50", "ref": "[[RIAA Charts]]", "doc_note": "Data from January 13, 2002." }, "USZobbel": { "chart": "US Albums", "provider": "[[RIAA Charts|RIAA]]", "date_format": "YYMMDD", "url": "http://www.zobbel.de/cluk/{date}cluk.txt", "url_title": "Chart Log US: {dateDMY}", "ref": "[[US Albums Chart]]. Zobbel.de", "doc_note": "Data available from January 15, 2005 to January 30, 2016." } } } oxaoogv5onc08oj57t4wvtz5pmxbdrl Template:Administrator elections status 10 174981 739136 2025-12-17T22:32:45Z en>Novem Linguae 0 bypass redirect. name is better, so more readable 739136 wikitext text/x-wiki <!--{{#ifeq:{{FULLPAGENAME}}|Wikipedia:Administrator elections/{{{1}}}|{{shortcut|WP:ADE{{uc:{{#invoke:String|sub|{{{1}}}|1|3}}}}{{{2}}}}} }}<!--Display shortcut if on election subpage -->{{#ifexpr:{{#time:U}} < {{#time:U|{{Administrator elections status/data|{{{1}}}|nombegin}}}}| <!--Text for before anything starts--> * Nominations for [[WP:Administrator elections/{{{1}}}|the {{{1}}} administrator elections]] will open 00:00, {{#time:j F Y|{{Administrator elections candidate/data|{{{1}}}|nombegin}}}} (UTC). | {{#ifexpr:{{#time:U}} < {{#time:U|{{Administrator elections status/data|{{{1}}}|nomend}} + 1 day}}| <!--Text for when nominations phase open--> * Nominations for [[WP:Administrator elections/{{{1}}}|the {{{1}}} administrator elections]] are '''now open''' to [[WP:XC|extended-confirmed]] editors on '''[[WP:Administrator elections/{{{1}}}/Candidates|the candidates page]]''' until 23:59, {{#time:j F Y|{{Administrator elections candidate/data|{{{1}}}|nomend}}}} (UTC). | {{#ifexpr:{{#time:U}} < {{#time:U|{{Administrator elections status/data|{{{1}}}|discbegin}}}}| <!--Text for when nominations phase closed--> * [[WP:Administrator elections/{{{1}}}/Candidates|Candidate nominations]] are now closed. The discussion phase for [[WP:Administrator elections/{{{1}}}|the {{{1}}} administrator elections]] will begin 00:00, {{#time:j F Y|{{Administrator elections candidate/data|{{{1}}}|discbegin}}}} (UTC). | {{#ifexpr:{{#time:U}} < {{#time:U|{{Administrator elections status/data|{{{1}}}|begin}}}}| <!--Text for when discussion phase open--> * [[WP:Administrator elections/{{{1}}}/Discussion phase|The discussion phase]] is now open for 5 days. Community members are welcome to ask questions and discuss the [[WP:Administrator elections/{{{1}}}/Candidates|'''candidates''']] on their own subpages. * Next up: Discussion will close, and [[WP:Administrator elections/{{{1}}}|the {{{1}}} elections]] will open for voting on 00:00, {{#time:j F Y|{{Administrator elections candidate/data|{{{1}}}|begin}}}} (UTC). | {{#ifexpr:{{#time:U}} < {{#time:U|{{Administrator elections status/data|{{{1}}}|end}} + 1 day}}| <!--Text for when voting phase open--> * Voting in [[WP:Administrator elections/{{{1}}}|the {{{1}}} administrator elections]] is '''now open''' to [[WP:Administrator elections/{{{1}}}#Voter eligibility|eligible voters]] until 23:59, {{#time:j F Y|{{Administrator elections candidate/data|{{{1}}}|end}}}} (UTC). If you wish to participate in this year's elections, please review [[WP:Administrator elections/{{{1}}}/Candidates|the candidates]] and '''follow [[WP:Administrator elections/{{{1}}}/Voting phase|the voting instructions]]'''. * Discussion is now '''closed'''. All candidate discussion subpages have been transcluded onto [[WP:Administrator elections/{{{1}}}/Discussion phase|the discussion phase page]]. | {{#ifexpr:{{#time:U}} > {{#time:U|{{Administrator elections status/data|{{{1}}}|certified}}}}| <!--Text for when results are certified--> * Thank you for participating in [[WP:Administrator elections/{{{1}}}|the {{{1}}} administrator elections]]. The '''[[WP:Administrator elections/{{{1}}}/Results|results]]''' are now available and certified. | {{#ifexpr:{{#time:U}} > {{#time:U|{{Administrator elections status/data|{{{1}}}|end}}}}| <!--Text for when voting phase closed--> * Thank you for participating in [[WP:Administrator elections/{{{1}}}|the {{{1}}} administrator elections]]. [[WP:Administrator elections/{{{1}}}/Results|Results]] are pending release by the scrutineers. }}}}}}}}}}}}}}<noinclude> {{documentation}} </noinclude> m0p4zygf80uwz8j1jaucyjt0bpk3kql 739137 739136 2026-04-22T21:02:36Z Chaotic Enby 58843 1 revision imported from [[:en:Template:Administrator_elections_status]]: For testing guided tour 739136 wikitext text/x-wiki <!--{{#ifeq:{{FULLPAGENAME}}|Wikipedia:Administrator elections/{{{1}}}|{{shortcut|WP:ADE{{uc:{{#invoke:String|sub|{{{1}}}|1|3}}}}{{{2}}}}} }}<!--Display shortcut if on election subpage -->{{#ifexpr:{{#time:U}} < {{#time:U|{{Administrator elections status/data|{{{1}}}|nombegin}}}}| <!--Text for before anything starts--> * Nominations for [[WP:Administrator elections/{{{1}}}|the {{{1}}} administrator elections]] will open 00:00, {{#time:j F Y|{{Administrator elections candidate/data|{{{1}}}|nombegin}}}} (UTC). | {{#ifexpr:{{#time:U}} < {{#time:U|{{Administrator elections status/data|{{{1}}}|nomend}} + 1 day}}| <!--Text for when nominations phase open--> * Nominations for [[WP:Administrator elections/{{{1}}}|the {{{1}}} administrator elections]] are '''now open''' to [[WP:XC|extended-confirmed]] editors on '''[[WP:Administrator elections/{{{1}}}/Candidates|the candidates page]]''' until 23:59, {{#time:j F Y|{{Administrator elections candidate/data|{{{1}}}|nomend}}}} (UTC). | {{#ifexpr:{{#time:U}} < {{#time:U|{{Administrator elections status/data|{{{1}}}|discbegin}}}}| <!--Text for when nominations phase closed--> * [[WP:Administrator elections/{{{1}}}/Candidates|Candidate nominations]] are now closed. The discussion phase for [[WP:Administrator elections/{{{1}}}|the {{{1}}} administrator elections]] will begin 00:00, {{#time:j F Y|{{Administrator elections candidate/data|{{{1}}}|discbegin}}}} (UTC). | {{#ifexpr:{{#time:U}} < {{#time:U|{{Administrator elections status/data|{{{1}}}|begin}}}}| <!--Text for when discussion phase open--> * [[WP:Administrator elections/{{{1}}}/Discussion phase|The discussion phase]] is now open for 5 days. Community members are welcome to ask questions and discuss the [[WP:Administrator elections/{{{1}}}/Candidates|'''candidates''']] on their own subpages. * Next up: Discussion will close, and [[WP:Administrator elections/{{{1}}}|the {{{1}}} elections]] will open for voting on 00:00, {{#time:j F Y|{{Administrator elections candidate/data|{{{1}}}|begin}}}} (UTC). | {{#ifexpr:{{#time:U}} < {{#time:U|{{Administrator elections status/data|{{{1}}}|end}} + 1 day}}| <!--Text for when voting phase open--> * Voting in [[WP:Administrator elections/{{{1}}}|the {{{1}}} administrator elections]] is '''now open''' to [[WP:Administrator elections/{{{1}}}#Voter eligibility|eligible voters]] until 23:59, {{#time:j F Y|{{Administrator elections candidate/data|{{{1}}}|end}}}} (UTC). If you wish to participate in this year's elections, please review [[WP:Administrator elections/{{{1}}}/Candidates|the candidates]] and '''follow [[WP:Administrator elections/{{{1}}}/Voting phase|the voting instructions]]'''. * Discussion is now '''closed'''. All candidate discussion subpages have been transcluded onto [[WP:Administrator elections/{{{1}}}/Discussion phase|the discussion phase page]]. | {{#ifexpr:{{#time:U}} > {{#time:U|{{Administrator elections status/data|{{{1}}}|certified}}}}| <!--Text for when results are certified--> * Thank you for participating in [[WP:Administrator elections/{{{1}}}|the {{{1}}} administrator elections]]. The '''[[WP:Administrator elections/{{{1}}}/Results|results]]''' are now available and certified. | {{#ifexpr:{{#time:U}} > {{#time:U|{{Administrator elections status/data|{{{1}}}|end}}}}| <!--Text for when voting phase closed--> * Thank you for participating in [[WP:Administrator elections/{{{1}}}|the {{{1}}} administrator elections]]. [[WP:Administrator elections/{{{1}}}/Results|Results]] are pending release by the scrutineers. }}}}}}}}}}}}}}<noinclude> {{documentation}} </noinclude> m0p4zygf80uwz8j1jaucyjt0bpk3kql Template:Administrator elections status/data 10 174982 739138 2026-04-20T14:23:04Z en>Aaron Liu 0 this status seems to duplicate the "nominations will open" message already generated by the parent template 739138 wikitext text/x-wiki {{#switch:{{{1}}}<!--insert new elections right after this line--> |May 2026={{#switch:{{{2}}} |nombegin = 29 April 2026 |nomend = 5 May 2026 |pollsetupbegin = 6 May 2026 |pollsetupend = 7 May 2026 |discbegin = 8 May 2026 |discend = 12 May 2026 |begin = 13 May 2026 |end = 19 May 2026 |certified = <!--enter date once election certified--> |poll = <!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = <!--votewiki [[Special:SecurePoll]] ID--> |previous = December 2025 |next = October 2026 }} |December 2025={{#switch:{{{2}}} |nombegin = 25 November 2025 |nomend = 1 December 2025 |pollsetupbegin = 2 December 2025 |pollsetupend = 3 December 2025 |discbegin = 4 December 2025 |discend = 8 December 2025 |begin = 9 December 2025 |end = 15 December 2025 |certified = 16 December 2025 |poll = 877 |votewikiid = |previous = July 2025 |next = May 2026 |status = Please leave your feedback on how the election went on the '''[[Wikipedia:Administrator elections/December 2025/Debrief|debrief page]]'''. }} |July 2025={{#switch:{{{2}}} |nombegin = 9 July 2025 |nomend = 16 July 2025 |pollsetupbegin = 16 July 2025 |pollsetupend = 18 July 2025 |discbegin = 18 July 2025 |discend = 23 July 2025 |begin = 23 July 2025 |end = 30 July 2025 |certified = 31 July 2025 |poll = 837 |votewikiid = |previous = October 2024 |next = December 2025 |status = [[Wikipedia:Administrator elections/July 2025/RFC phase|The RFC phase]] is now complete, see [[Wikipedia:Administrator elections/July 2025#Post-election RFCs|Post-election RFCs]] for a summary of results. }} |October 2024|2024={{#switch:{{{2}}} |nombegin = 8 October 2024 |nomend = 15 October 2024 |discbegin = 22 October 2024 |discend = 25 October 2024 |begin = 25 October 2024 |end = 1 November 2024 |certified = 4 November 2024 |poll = 812 |votewikiid = 1691 |previous = |next = July 2025 }} <!--testcase data--> |future={{#switch:{{{2}}} |nombegin = 3 April 4000 }} |nombegin={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 4000 }} |nomend={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 4000 }} |discbegin={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 2018 |begin = 20 April 4000 |poll = 750<!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = 1480<!--votewiki [[Special:SecurePoll]] ID--> }} |begin={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 2018 |begin = 20 April 2018 |end = 27 April 4000 |poll = 750<!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = 1480<!--votewiki [[Special:SecurePoll]] ID--> }} |end={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 2018 |begin = 20 April 2018 |end = 27 April 2018 |certified = 29 April 4000 |poll = 750<!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = 1480<!--votewiki [[Special:SecurePoll]] ID--> }} |April 2018|#default={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 2018 |begin = 20 April 2018 |end = 27 April 2018 |certified = 29 April 2018 |poll = 750<!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = 1480<!--votewiki [[Special:SecurePoll]] ID--> }} }}<noinclude>{{documentation}}</noinclude> 3w3ml02wp364xtdzf3lt47pes0d7fam 739139 739138 2026-04-22T21:02:37Z Chaotic Enby 58843 1 revision imported from [[:en:Template:Administrator_elections_status/data]]: For testing guided tour 739138 wikitext text/x-wiki {{#switch:{{{1}}}<!--insert new elections right after this line--> |May 2026={{#switch:{{{2}}} |nombegin = 29 April 2026 |nomend = 5 May 2026 |pollsetupbegin = 6 May 2026 |pollsetupend = 7 May 2026 |discbegin = 8 May 2026 |discend = 12 May 2026 |begin = 13 May 2026 |end = 19 May 2026 |certified = <!--enter date once election certified--> |poll = <!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = <!--votewiki [[Special:SecurePoll]] ID--> |previous = December 2025 |next = October 2026 }} |December 2025={{#switch:{{{2}}} |nombegin = 25 November 2025 |nomend = 1 December 2025 |pollsetupbegin = 2 December 2025 |pollsetupend = 3 December 2025 |discbegin = 4 December 2025 |discend = 8 December 2025 |begin = 9 December 2025 |end = 15 December 2025 |certified = 16 December 2025 |poll = 877 |votewikiid = |previous = July 2025 |next = May 2026 |status = Please leave your feedback on how the election went on the '''[[Wikipedia:Administrator elections/December 2025/Debrief|debrief page]]'''. }} |July 2025={{#switch:{{{2}}} |nombegin = 9 July 2025 |nomend = 16 July 2025 |pollsetupbegin = 16 July 2025 |pollsetupend = 18 July 2025 |discbegin = 18 July 2025 |discend = 23 July 2025 |begin = 23 July 2025 |end = 30 July 2025 |certified = 31 July 2025 |poll = 837 |votewikiid = |previous = October 2024 |next = December 2025 |status = [[Wikipedia:Administrator elections/July 2025/RFC phase|The RFC phase]] is now complete, see [[Wikipedia:Administrator elections/July 2025#Post-election RFCs|Post-election RFCs]] for a summary of results. }} |October 2024|2024={{#switch:{{{2}}} |nombegin = 8 October 2024 |nomend = 15 October 2024 |discbegin = 22 October 2024 |discend = 25 October 2024 |begin = 25 October 2024 |end = 1 November 2024 |certified = 4 November 2024 |poll = 812 |votewikiid = 1691 |previous = |next = July 2025 }} <!--testcase data--> |future={{#switch:{{{2}}} |nombegin = 3 April 4000 }} |nombegin={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 4000 }} |nomend={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 4000 }} |discbegin={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 2018 |begin = 20 April 4000 |poll = 750<!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = 1480<!--votewiki [[Special:SecurePoll]] ID--> }} |begin={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 2018 |begin = 20 April 2018 |end = 27 April 4000 |poll = 750<!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = 1480<!--votewiki [[Special:SecurePoll]] ID--> }} |end={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 2018 |begin = 20 April 2018 |end = 27 April 2018 |certified = 29 April 4000 |poll = 750<!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = 1480<!--votewiki [[Special:SecurePoll]] ID--> }} |April 2018|#default={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 2018 |begin = 20 April 2018 |end = 27 April 2018 |certified = 29 April 2018 |poll = 750<!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = 1480<!--votewiki [[Special:SecurePoll]] ID--> }} }}<noinclude>{{documentation}}</noinclude> 3w3ml02wp364xtdzf3lt47pes0d7fam 739142 739139 2026-04-22T21:03:19Z Chaotic Enby 58843 not used 739142 wikitext text/x-wiki {{#switch:{{{1}}}<!--insert new elections right after this line--> |May 2026={{#switch:{{{2}}} |nombegin = 29 April 2026 |nomend = 5 May 2026 |pollsetupbegin = 6 May 2026 |pollsetupend = 7 May 2026 |discbegin = 8 May 2026 |discend = 12 May 2026 |begin = 13 May 2026 |end = 19 May 2026 |certified = <!--enter date once election certified--> |poll = <!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = <!--votewiki [[Special:SecurePoll]] ID--> |previous = December 2025 |next = October 2026 }} |December 2025={{#switch:{{{2}}} |nombegin = 25 November 2025 |nomend = 1 December 2025 |pollsetupbegin = 2 December 2025 |pollsetupend = 3 December 2025 |discbegin = 4 December 2025 |discend = 8 December 2025 |begin = 9 December 2025 |end = 15 December 2025 |certified = 16 December 2025 |poll = 877 |votewikiid = |previous = July 2025 |next = May 2026 |status = Please leave your feedback on how the election went on the '''[[Wikipedia:Administrator elections/December 2025/Debrief|debrief page]]'''. }} |July 2025={{#switch:{{{2}}} |nombegin = 9 July 2025 |nomend = 16 July 2025 |pollsetupbegin = 16 July 2025 |pollsetupend = 18 July 2025 |discbegin = 18 July 2025 |discend = 23 July 2025 |begin = 23 July 2025 |end = 30 July 2025 |certified = 31 July 2025 |poll = 837 |votewikiid = |previous = October 2024 |next = December 2025 |status = [[Wikipedia:Administrator elections/July 2025/RFC phase|The RFC phase]] is now complete, see [[Wikipedia:Administrator elections/July 2025#Post-election RFCs|Post-election RFCs]] for a summary of results. }} |October 2024|2024={{#switch:{{{2}}} |nombegin = 8 October 2024 |nomend = 15 October 2024 |discbegin = 22 October 2024 |discend = 25 October 2024 |begin = 25 October 2024 |end = 1 November 2024 |certified = 4 November 2024 |poll = 812 |votewikiid = 1691 |previous = |next = July 2025 }} <!--testcase data--> |future={{#switch:{{{2}}} |nombegin = 3 April 4000 }} |nombegin={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 4000 }} |nomend={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 4000 }} |discbegin={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 2018 |begin = 20 April 4000 |poll = 750<!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = 1480<!--votewiki [[Special:SecurePoll]] ID--> }} |begin={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 2018 |begin = 20 April 2018 |end = 27 April 4000 |poll = 750<!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = 1480<!--votewiki [[Special:SecurePoll]] ID--> }} |end={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 2018 |begin = 20 April 2018 |end = 27 April 2018 |certified = 29 April 4000 |poll = 750<!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = 1480<!--votewiki [[Special:SecurePoll]] ID--> }} |April 2018|#default={{#switch:{{{2}}} |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 2018 |begin = 20 April 2018 |end = 27 April 2018 |certified = 29 April 2018 |poll = 750<!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = 1480<!--votewiki [[Special:SecurePoll]] ID--> }} }} gok079jc0iyyhn2uqo5md7sj86fqhwo Template:Administrator elections status/doc 10 174983 739140 2025-12-17T22:34:07Z en>Novem Linguae 0 This template gets its data from [[Template:Administrator elections status/data]], which has a list of elections and a list of phase start and end dates for each election. 739140 wikitext text/x-wiki {{Documentation subpage}} This template gets its data from [[Template:Administrator elections status/data]], which has a list of elections and a list of phase start and end dates for each election. For support, ask this talk page or any editor of [[Wikipedia:Arbitration Committee Elections December/Header/Switch]], which this template heavily borrows from. <templatedata> { "params": { "1": { "label": "Election ID", "type": "string", "required": true, "example": "July 2025" } }, "description": "Automatically switch between different status texts for the different stages of the specified administrator election." } </templatedata><includeonly>{{Sandbox other|| <!-- Categories below this line --> [[Category:Wikipedia administrator elections templates]] }}</includeonly> 97o6ghy0qbgdqec59dt8qnhsy8l6xvp 739141 739140 2026-04-22T21:02:37Z Chaotic Enby 58843 1 revision imported from [[:en:Template:Administrator_elections_status/doc]]: For testing guided tour 739140 wikitext text/x-wiki {{Documentation subpage}} This template gets its data from [[Template:Administrator elections status/data]], which has a list of elections and a list of phase start and end dates for each election. For support, ask this talk page or any editor of [[Wikipedia:Arbitration Committee Elections December/Header/Switch]], which this template heavily borrows from. <templatedata> { "params": { "1": { "label": "Election ID", "type": "string", "required": true, "example": "July 2025" } }, "description": "Automatically switch between different status texts for the different stages of the specified administrator election." } </templatedata><includeonly>{{Sandbox other|| <!-- Categories below this line --> [[Category:Wikipedia administrator elections templates]] }}</includeonly> 97o6ghy0qbgdqec59dt8qnhsy8l6xvp Template:Administrator elections status/data/latest month 10 174984 739143 2026-04-17T20:42:08Z en>Leijurv 0 less than two weeks away, surely it is reasonable to put the dates in the header now 739143 wikitext text/x-wiki May 2026<noinclude>{{Documentation}}</noinclude> 8v32d3zhrwf5vh2hosrbmizx58gfk6p 739144 739143 2026-04-22T21:03:43Z Chaotic Enby 58843 1 revision imported from [[:en:Template:Administrator_elections_status/data/latest_month]]: For testing guided tour 739143 wikitext text/x-wiki May 2026<noinclude>{{Documentation}}</noinclude> 8v32d3zhrwf5vh2hosrbmizx58gfk6p 739145 739144 2026-04-22T21:03:56Z Chaotic Enby 58843 not used 739145 wikitext text/x-wiki May 2026 01bqdp4ard3t0eqo1a685ggpci87x27 MediaWiki:Guidedtour-tour-aelect/title 8 174985 739148 2026-04-22T21:14:09Z Chaotic Enby 58843 title 739148 wikitext text/x-wiki English Wikipedia administrator elections, {{Administrator elections status/data/latest month}} 3smq20xef4pi3s0j5quvj08bv0z5gp3 MediaWiki:Guidedtour-tour-aelect/startDate 8 174986 739149 2026-04-22T21:18:24Z Chaotic Enby 58843 time 739149 wikitext text/x-wiki {{#time: Y-m-d | {{Template:Administrator elections status/data|{{Template:Administrator elections status/data/latest month}}|begin}} }} 00:00:00 UTC mwi41gcz018nezgmh08jvebkdn5fsrc 739160 739149 2026-04-22T21:30:41Z Chaotic Enby 58843 redundant 739160 wikitext text/x-wiki {{#time: Y-m-d | {{Administrator elections status/data|{{Administrator elections status/data/latest month}}|begin}} }} 00:00:00 UTC eqv82jd3sm91t828vgfhtvnm8631yiz MediaWiki:Guidedtour-tour-aelect/endDate 8 174987 739150 2026-04-22T21:24:37Z Chaotic Enby 58843 time, note that the template now uses the 23:59 format already 739150 wikitext text/x-wiki {{#time: Y-m-d | {{Template:Administrator elections status/data|{{Template:Administrator elections status/data/latest month}}|end}} }} 23:59:59 UTC jrian3yx2qr89nbpn1buctsbvkq3rxb 739159 739150 2026-04-22T21:30:26Z Chaotic Enby 58843 redundant duh 739159 wikitext text/x-wiki {{#time: Y-m-d | {{Administrator elections status/data|{{Administrator elections status/data/latest month}}|end}} }} 23:59:59 UTC 47m81jvtbje7mssidyzu8fc31pegwdr Category:Album covers 14 174988 739151 2026-04-22T21:25:37Z ~2026-24668-01 73666 Created page with "{{catdiffuse}} {{Commons category}} Images in this category are [[album cover|audio recording covers]] which are used in articles under the [[fair use]] clause of [[United States copyright law]]. Please remember that according to [[Wikipedia:Non-free content#Policy|Wikipedia policy for non-free content]] every non-free image '''must contribute significantly to the article''' (e.g. identify the subject of an article, or specifically illustrate relevant points or sections..." 739151 wikitext text/x-wiki {{catdiffuse}} {{Commons category}} Images in this category are [[album cover|audio recording covers]] which are used in articles under the [[fair use]] clause of [[United States copyright law]]. Please remember that according to [[Wikipedia:Non-free content#Policy|Wikipedia policy for non-free content]] every non-free image '''must contribute significantly to the article''' (e.g. identify the subject of an article, or specifically illustrate relevant points or sections within the text) and '''must not serve a purely decorative purpose'''. Images that have purely decorative purpose may be deleted. {{See also|:Category:Album-cover and concert-poster artists}} {{Image template notice|Non-free album cover}} {{CollapsibleLargeCategoryTOC}} [[Category:Albums|Covers, album]] [[Category:Business images]] [[Category:Wikipedia non-free images|Album covers]] [[Category:Images of art]] [[Category:Music images]] [[Category:Packaging]] [[Category:Cover art]] ea7no7irqfr29dzjc6apvuzvk95as4e Category:WET Awards 14 174989 739152 2026-04-22T21:27:07Z ~2026-24668-01 73666 Created page with "{{cat main}} [[Category:American music awards]] [[Category:American television awards]] [[Category:WET original programming|Awards]] [[Category:Wikipedia categories named after American awards]] [[Category:Lifetime achievement awards]]" 739152 wikitext text/x-wiki {{cat main}} [[Category:American music awards]] [[Category:American television awards]] [[Category:WET original programming|Awards]] [[Category:Wikipedia categories named after American awards]] [[Category:Lifetime achievement awards]] d2cw5dc6309qrwcf7ljfn21rwner01a Category:American music awards 14 174990 739153 2026-04-22T21:27:45Z ~2026-24668-01 73666 Created page with "{{Commons category|Music awards of the United States}} {{C|American awards|American}} {{C|Music awards|music awards}}. [[Category:American music industry|Awards]] [[Category:American performing arts awards|music]] [[Category:Music awards by country]] [[Category:North American music awards]] [[Category:American awards by subject|Music]] {{CatAutoTOC}}" 739153 wikitext text/x-wiki {{Commons category|Music awards of the United States}} {{C|American awards|American}} {{C|Music awards|music awards}}. [[Category:American music industry|Awards]] [[Category:American performing arts awards|music]] [[Category:Music awards by country]] [[Category:North American music awards]] [[Category:American awards by subject|Music]] {{CatAutoTOC}} d9qxhetjifzhum4k60cxw7eftnoub0c MediaWiki:Guidedtour-tour-aelect/openSSL 8 174991 739154 2026-04-22T21:27:51Z Chaotic Enby 58843 we're getting this one right too 739154 wikitext text/x-wiki Open your terminal and move to the folder in which you want to store your keys. For example: {{#tag:syntaxhighlight|cd "F:\\Dropbox\\Important Documents\\Notes By Topic\\Wikipedia\\Election encryption keys\\{{#time: Y-m-d | {{Template:Administrator elections status/data|{{Template:Administrator elections status/data/latest month}}|begin}} }} enwiki election"|lang=ps1}} gs5qg1pj5q2ovxgmu3j8ox4zhssxbsk 739158 739154 2026-04-22T21:30:13Z Chaotic Enby 58843 better at putting a redundant namespace than a safesubst huh? 739158 wikitext text/x-wiki Open your terminal and move to the folder in which you want to store your keys. For example: {{#tag:syntaxhighlight|cd "F:\\Dropbox\\Important Documents\\Notes By Topic\\Wikipedia\\Election encryption keys\\{{#time: Y-m-d | {{#switch:May 2026<!--insert new elections right after this line--> |May 2026={{#switch:begin |nombegin = 29 April 2026 |nomend = 5 May 2026 |pollsetupbegin = 6 May 2026 |pollsetupend = 7 May 2026 |discbegin = 8 May 2026 |discend = 12 May 2026 |begin = 13 May 2026 |end = 19 May 2026 |certified = <!--enter date once election certified--> |poll = <!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = <!--votewiki [[Special:SecurePoll]] ID--> |previous = December 2025 |next = October 2026 }} |December 2025={{#switch:begin |nombegin = 25 November 2025 |nomend = 1 December 2025 |pollsetupbegin = 2 December 2025 |pollsetupend = 3 December 2025 |discbegin = 4 December 2025 |discend = 8 December 2025 |begin = 9 December 2025 |end = 15 December 2025 |certified = 16 December 2025 |poll = 877 |votewikiid = |previous = July 2025 |next = May 2026 |status = Please leave your feedback on how the election went on the '''[[Wikipedia:Administrator elections/December 2025/Debrief|debrief page]]'''. }} |July 2025={{#switch:begin |nombegin = 9 July 2025 |nomend = 16 July 2025 |pollsetupbegin = 16 July 2025 |pollsetupend = 18 July 2025 |discbegin = 18 July 2025 |discend = 23 July 2025 |begin = 23 July 2025 |end = 30 July 2025 |certified = 31 July 2025 |poll = 837 |votewikiid = |previous = October 2024 |next = December 2025 |status = [[Wikipedia:Administrator elections/July 2025/RFC phase|The RFC phase]] is now complete, see [[Wikipedia:Administrator elections/July 2025#Post-election RFCs|Post-election RFCs]] for a summary of results. }} |October 2024|2024={{#switch:begin |nombegin = 8 October 2024 |nomend = 15 October 2024 |discbegin = 22 October 2024 |discend = 25 October 2024 |begin = 25 October 2024 |end = 1 November 2024 |certified = 4 November 2024 |poll = 812 |votewikiid = 1691 |previous = |next = July 2025 }} <!--testcase data--> |future={{#switch:begin |nombegin = 3 April 4000 }} |nombegin={{#switch:begin |nombegin = 3 April 2018 |nomend = 10 April 4000 }} |nomend={{#switch:begin |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 4000 }} |discbegin={{#switch:begin |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 2018 |begin = 20 April 4000 |poll = 750<!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = 1480<!--votewiki [[Special:SecurePoll]] ID--> }} |begin={{#switch:begin |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 2018 |begin = 20 April 2018 |end = 27 April 4000 |poll = 750<!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = 1480<!--votewiki [[Special:SecurePoll]] ID--> }} |end={{#switch:begin |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 2018 |begin = 20 April 2018 |end = 27 April 2018 |certified = 29 April 4000 |poll = 750<!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = 1480<!--votewiki [[Special:SecurePoll]] ID--> }} |April 2018|#default={{#switch:begin |nombegin = 3 April 2018 |nomend = 10 April 2018 |discbegin = 17 April 2018 |begin = 20 April 2018 |end = 27 April 2018 |certified = 29 April 2018 |poll = 750<!--enwiki [[Special:SecurePoll]] ID--> |votewikiid = 1480<!--votewiki [[Special:SecurePoll]] ID--> }} }} }} enwiki election"|lang=ps1}} pjxfuaje6zbr3qlpr6p0q0nnjbavlx4 739162 739158 2026-04-22T21:45:15Z Chaotic Enby 58843 Undid revision [[Special:Diff/739158|739158]] by [[Special:Contributions/Chaotic Enby|Chaotic Enby]] ([[User talk:Chaotic Enby|talk]]) critical mistake 739162 wikitext text/x-wiki Open your terminal and move to the folder in which you want to store your keys. For example: {{#tag:syntaxhighlight|cd "F:\\Dropbox\\Important Documents\\Notes By Topic\\Wikipedia\\Election encryption keys\\{{#time: Y-m-d | {{Administrator elections status/data|{{Administrator elections status/data/latest month}}|begin}} }} enwiki election"|lang=ps1}} 7tpio489thnxqdck6iai71v524tri2a Template:Preview warning 10 174992 739155 2026-04-22T21:28:22Z ~2026-24668-01 73666 Created page with "<includeonly>{{safesubst:#invoke:If preview|pwarning}}</includeonly><noinclude> {{documentation}} </noinclude>" 739155 wikitext text/x-wiki <includeonly>{{safesubst:#invoke:If preview|pwarning}}</includeonly><noinclude> {{documentation}} </noinclude> c6997f5zp58bnd9g47cgo51gl3zmsu2 MediaWiki:Guidedtour-tour-aelect/questionText 8 174993 739156 2026-04-22T21:28:53Z Chaotic Enby 58843 "do we live in a society?" - the ridler 739156 wikitext text/x-wiki {{Template:Administrator elections status/data/latest month}} English Wikipedia Administrator Election candidates hc6s5k4gepcfi4118zl85vxu3ii1fgl 739164 739156 2026-04-22T21:45:49Z Chaotic Enby 58843 no redundancy 739164 wikitext text/x-wiki {{Administrator elections status/data/latest month}} English Wikipedia Administrator Election candidates adrwxh9gvotf42rd97evizsh1aj1x4t MediaWiki:Guidedtour-tour-aelect/candidateNames 8 174994 739157 2026-04-22T21:29:44Z Chaotic Enby 58843 safesubst 739157 wikitext text/x-wiki Add the candidate names here '''in alphabetical order''', one per option, in the following format: {{#tag:syntaxhighlight|[[Wikipedia:Administrator elections/May 2026/Candidates/CANDIDATE|CANDIDATE]]|lang=wikitext}} pz55okysqqv0odu57cnoio7bme5flka 739163 739157 2026-04-22T21:45:37Z Chaotic Enby 58843 safesubst was a mistake 739163 wikitext text/x-wiki Add the candidate names here '''in alphabetical order''', one per option, in the following format: {{#tag:syntaxhighlight|[[Wikipedia:Administrator elections/{{Administrator elections status/data/latest month}}/Candidates/CANDIDATE|CANDIDATE]]|lang=wikitext}} g7oip6lyg271g0aoifijzb9hv4g04o5 MediaWiki:Reportincident-dialog-harassment-type-hate-speech-or-discrimination 8 174995 739166 2026-04-22T21:47:34Z CaptainEek 47282 test 739166 wikitext text/x-wiki [[Cow]] 6hwbnytri6242m3hi5yddlzarpbyfj6 User:Jaheim1971 2 174996 739168 2026-04-22T23:38:42Z Jaheim1971 73668 Created page with "User Page, Welcome!" 739168 wikitext text/x-wiki User Page, Welcome! e9m5vua5cgi8i8ktbx4uxz4wo0swsfo