Metro Goldwyn Mayer Wiki

Template:About Template:Short description Template:Use dmy dates

Hannibal is a 2001 American psychological horror[6]-thriller film[7] directed by Ridley Scott, adapted from the 1999 novel by Thomas Harris. The sequel to the 1991 film The Silence of the Lambs, Anthony Hopkins reprises his role as the cannibalistic serial killer Hannibal Lecter. Julianne Moore co-stars as FBI Special Agent Clarice Starling, the role first held by Jodie Foster. Ray Liotta, Giancarlo Giannini, and Gary Oldman also star.

Silence of the Lambs director Jonathan Demme, screenwriter Ted Tally, and Foster all declined to be involved in the adaptation, finding the novel too lurid. Scott became attached after the success of Gladiator (2000), and signed on after reading the script pitched by Dino De Laurentiis, who produced Manhunter (1986), the first Lecter film. David Mamet and Steven Zaillian wrote the screenplay.

Set ten years after The Silence of the Lambs, Hannibal follows Starling's attempts to apprehend Lecter in Italy before his surviving victim, Mason Verger, captures him. Hannibal broke box office records in the United States, Australia, Canada and the United Kingdom in February 2001,[8] but received mixed reviews.[9] Template:TOC limit

Plot[]

A decade after tracking down serial killer Jame Gumb,Template:Efn FBI Special Agent Clarice Starling is blamed for a botched drug raid. She is contacted by Mason Verger, the only surviving victim of the cannibalistic serial killer Hannibal Lecter, who has been missing since escaping custody during the Gumb investigation. A wealthy child molester, Verger was paralyzed and disfigured by Lecter during a therapy session. He has been pursuing an elaborate scheme to capture, torture, and kill Lecter ever since. Using his wealth and political influence, Verger has Starling reassigned to Lecter's case, hoping her involvement will draw Lecter out.

After learning of Starling's disgrace, Lecter sends her a taunting letter. A perfume expert identifies a fragrance on the letter: skin cream with ingredients only available to a few shops in the world. She contacts the police departments of the cities where the shops are located, requesting surveillance tapes. In one city, Florence, Chief Inspector Rinaldo Pazzi is investigating the disappearance of a library curator. Pazzi questions Lecter, who is masquerading as Dr. Fell, the assistant curator and caretaker.

Recognizing Dr. Fell in the surveillance tape, Pazzi accesses the Violent Criminal Apprehension Program database of wanted fugitives. He learns of Verger's US$3 million personal bounty on Lecter. Seeking the bounty, Pazzi ignores Starling's warnings and attempts to capture Lecter alone. He recruits a pickpocket to obtain Lecter's fingerprint to show Verger as proof. The pickpocket, mortally wounded by Lecter, manages to get the print and gives it to Pazzi. Lecter baits Pazzi into an isolated room of the Palazzo Vecchio, ties him up, disembowels him, and hangs him from the balcony.

Verger bribes Justice Department official Paul Krendler to accuse Starling of withholding a note from Lecter, leading to her suspension. Lecter lures Starling to Union Station. Verger's men, having trailed Starling, capture and bring Lecter to Verger. Verger intends to feed Lecter alive to a herd of wild boars bred for this purpose. After her superiors refuse to act, Starling infiltrates Verger's estate. After neutralizing two guards and freeing Lecter, she is shot by a third guard. Lecter picks up an unconscious Starling just before the boars break through the doors. Verger orders his physician Cordell Doemling to shoot Lecter, but, at Lecter's suggestion, Cordell shoves his hated boss into the pen with Lecter offering to take the blame. Lecter carries Starling away and the boars eat Verger alive.

Lecter takes Starling to Krendler's secluded lake house and treats her wounds. When Krendler arrives, Lecter subdues and drugs him. Starling, disoriented by morphine and dressed in a cocktail dress, awakens to find Krendler seated at the table set for an elegant dinner. Weakened by the drugs, she watches in horror as Lecter removes part of Krendler's prefrontal cortex, sautés it, and feeds it to him. Starling tries to attack Lecter, but he overpowers and traps her. She handcuffs his wrist to hers. Hearing the police closing in, Lecter is about to sever her cuffed hand to escape and brings down the cleaver. Starling surrenders to the FBI with her hands intact. On a flight, Lecter prepares to eat a meal he has brought himself, his bandaged arm in a sling. Lecter shares cooked brain with the boy next to him, saying it is important "always to try new things".

Cast[]

Template:Div col

  • Anthony Hopkins as Dr. Hannibal Lecter / Dr. Fell
  • Julianne Moore as FBI Agent Clarice Starling
  • Gary Oldman as Mason VergerTemplate:Efn
  • Ray Liotta as Paul Krendler
  • Frankie R. Faison as Barney Matthews
  • Giancarlo Giannini as Chief Inspector Rinaldo Pazzi
  • Francesca Neri as Allegra Pazzi
  • Željko Ivanek as Dr. Cordell Doemling
  • David Andrews as FBI Agent Clint Pearsall
  • Francis Guinan as FBI Assistant Director Noonan
  • Robert Rietti as Sogliato
  • Enrico Lo Verso as Gnocco
  • Ivano Marescotti as Carlo Deogracias
  • Fabrizio Gifuni as Fabrizio
  • Marco Greco as Tommaso
  • Hazelle Goodman as Evelda Drumgo
  • Terry Serpico as Officer Bolton
  • Boyd Kestner as FBI Agent Burke
  • Peter Shaw as FBI Agent John Brigham
  • James Opher as DEA Agent Eldridge
  • Don McManus as Benny Holcombe
  • Danielle de Niese as Beatrice in Vide Cor Meum
  • Mark Margolis and Ajay Naidu as Perfume Experts

Template:Div col end

Development[]

The Silence of the Lambs, based on the 1988 novel by Thomas Harris, was released in 1991 to critical and commercial success, winning five Academy Awards.[10] Harris spent several years writing a sequel novel; Silence of the Lambs director Jonathan Demme expressed interest in developing a film adaptation when the novel was complete.[11]

The film rights to the Lecter character were owned by producer couple Dino De Laurentiis and Martha De Laurentiis. After producing the first Lecter film, Manhunter, in 1986, they allowed Orion Pictures to produce The Silence of Lambs free without their involvement. When The Silence of the Lambs became a success, the couple became eager for a new Lecter novel they could adapt. After a lengthy wait, De Laurentiis received a call from Harris telling him he had finished the novel and De Laurentiis purchased the rights for a record $10 million.[12]

In April 1999, Los Angeles Times reported that the budget for an adaptation of Hannibal could cost as much as $100 million. It speculated that both Jodie Foster and Anthony Hopkins would receive $15 million each to reprise their roles and that Demme would receive $5 million to $19 million. Mort Janklow, Harris's agent at the time, told the Los Angeles Times that Foster, Hopkins, and Demme would soon receive manuscripts of the novel, claiming it would make an unbelievable film.[13] The novel sold out of its initial 1.6 million print run in the 1999,[14] and went on to sell millions of copies.[15]

Demme declined the invitation to direct,[11] as he reportedly found the material lurid[16] and too gory.[17] In the 2010 Biography Channel documentary Inside Story: The Silence of the Lambs, Demme said: "Tom Harris, as unpredictable as ever, took Clarice and Dr. Lecter's relationship in a direction that just didn't compute for me. And Clarice is drugged up, and she's eating brains with him, and I just thought, 'I can't do this.'"[18] De Laurentiis said of Demme's decision to decline: "When the pope dies, we create a new pope. Good luck to Jonathan Demme. Good-bye."[12] He later said that Demme felt he could not make a sequel as good as The Silence of the Lambs.[19]

Ridley Scott[]

De Laurentiis visited Ridley Scott on the set of Gladiator and suggested he read Hannibal.[19] Scott was in the third week before principal photography was due to finish on Gladiator.[11] Gladiator became a commercial and critical success, earning 12 Academy Award nominations.[15] De Laurentiis asked Scott if he would like to direct Hannibal. Scott thought De Laurentiis was speaking of the Carthaginian general who nearly brought down the Roman Empire around 200 B.C., and replied: "Dino, I'm doing a Roman epic right now. I don't wanna do elephants coming over the Alps next, old boy."[11]

Scott read the manuscript in four sittings within a week, seeing it as a "symphony", and expressed his desire to direct.[11] Scott said: "I haven't read anything so fast since The Godfather. It was so rich in all kinds of ways."[14] Scott had reservations with the ending of the novel, in which Lecter and Starling become lovers: "I couldn't take that quantum leap emotionally on behalf of Starling. Certainly, on behalf of Hannibal—I'm sure that's been in the back of his mind for a number of years. But for Starling, no. I think one of the attractions about Starling to Hannibal is what a straight arrow she is."[14] He also did not find the book believable after the opera scene, "which became like a vampire movie". Harris gave Scott permission to change the ending.[14]

Writing[]

Ted Tally, screenwriter for The Silence of the Lambs, was another key member of the Silence of the Lambs team to decline involvement. Tally, like Demme, had problems with the novel's "excesses".[16] David Mamet was the first screenwriter to produce a draft, which, according to Scott and the producers, needed major revisions.[12] Stacey Snider, co-chairman of Universal Pictures, said: "There's no way David was going to read 15 pages of our notes and then be available to work on the script day-to-day."[13] A script review at ScreenwritersUtopia.com describes the Mamet draft as "stunningly bad" but found Zaillian's rewrite "gripping entertainment".[20] Scott praised Mamet as fast and efficient, but said he passed on his draft because it needed work and he feared Mamet, who was soon directing his own film,[12] would be too busy to redraft it.[14]

Steven Zaillian, writer of Schindler's List, initially declined to write Hannibal, saying he was busy and that "you can almost never win when you do a sequel".[12] He changed his mind, as "it's hard to say no to Dino once and it's almost impossible to say no to him twice".[12] Scott said there were "very few rewrites once I brought in Steve Zaillian ... If you were to ask who were the best three screenwriters in the business, Steve Zaillian would be one of them. We discussed Hannibal endlessly."[14] One of Zaillian's key objectives was to revise Mamet's script until it pleased all parties, meaning that the "love story" would be told by suggestion instead of by "assault".[21] Scott worked through the script with Zaillian for 28 days, making him "sweat through it with him and discuss every inch of the way with him". After 25 days, Scott suddenly realized that Zaillian was "exorcising the 600 pages of the book. He was distilling through discussion what he was gonna finally do ... Frankly I could have just made it."[11]

Casting[]

It was unclear if Jodie Foster (Clarice Starling) and Anthony Hopkins (Hannibal Lecter) would reprise their respective roles for which they won Academy Awards in The Silence of the Lambs (Best Actress/Best Actor).[13] It became apparent that the producers and the studio could do without one of the original "stars" and would go on to find a replacement. The withdrawal of both Foster and Hopkins could possibly have been terminal for the project, however. De Laurentiis confirmed this after the film's release: "First and foremost, I knew we had no movie without Anthony Hopkins."[19]

Involvement of Jodie Foster[]

Foster told Larry King in 1997 that she "would definitely be part of" a sequel to The Silence of the Lambs.[14] In the same year, she told Entertainment Weekly: "Anthony Hopkins always talks about it. I mean, everybody wants to do it. Every time I see him, it's like: 'When is it going to happen? When is it going to happen?'"[22] De Laurentiis thought Foster would decline once she read the book, and believed the final film was better for it.[11] Hopkins also had doubts Foster would be involved, saying he had a "hunch" she would not be.[11]

Foster confirmed that she had turned down the film in December 1999.[23] This caused problems for Universal and partner MGM.[12][22] "The studio is just back from the holiday and is regrouping based on the news, and has no cohesive game plan at the moment," said Kevin Misher, Universal's President of Production.[12] Misher added that, "It was one of those moments when you sit down and think, 'Can Clarice be looked upon as James Bond for instance? A character who is replaceable?' Or was Jodie Foster Clarice Starling, and the audience will not accept anyone else?"[12] Foster said in December 1999 that the characterization of Starling in Hannibal had "negative attributes" and "betrayed" the original character.[23]

Foster's spokeswoman said she declined because Claire Danes had become available for Foster's film Flora Plum.[24] Entertainment Weekly described the Hannibal project as having become "a bloody mess, hemorrhaging talent and money" despite Hopkins being on board.[22] In 2005, after the film had been released, Foster told Total Film: "The official reason I didn't do Hannibal is I was doing another movie, Flora Plum. So I get to say, in a nice dignified way, that I wasn't available when that movie was being shot ... Clarice meant so much to Jonathan and I, she really did, and I know it sounds kind of strange to say but there was no way that either of us could really trample on her."[25]

Julianne Moore as Clarice Starling[]

When it became clear that Foster would skip Hannibal, the production team considered several different actresses,[11] including Cate Blanchett, Angelina Jolie, Gillian Anderson, Hilary Swank, Ashley Judd, Helen Hunt and Julianne Moore.[12] Hopkins asked his agent if he had any "power" over casting. He informed De Laurentiis that he knew Moore, with whom he had worked on Surviving Picasso, and thought her a "terrific actress".[11] Although Hopkins' agent told him he had no contractual influence on casting, Scott thought it correct to discuss who would be Hopkins' "leading lady".[11] Scott said he was "really surprised to find that [he] had five of the top actresses in Hollywood wanting it."[14]

Scott said his decision was swayed in favor of Moore: "She is a true chameleon. She can be a lunatic in Magnolia, a vamp in An Ideal Husband, a porn star in Boogie Nights and a romantic in The End of the Affair."[14] "Julianne Moore, once Jodie decided to pass, was always top of my list," said Scott on his female lead.[26] Moore talked about stepping into a role made famous by another actress: "The new Clarice would be very different. Of course people are going to compare my interpretation with that of Jodie Foster's ... but this film is going to be very different."[27]

Anthony Hopkins as Hannibal Lecter[]

File:London Film Museum - Hannibal (5755433470).jpg

Hannibal Lecter t-shirt worn by Hopkins in Hannibal on display at the London Film Museum

Hopkins was generally expected to reprise his Academy Award-winning role. Hopkins said in June 1999 that he would only be interested if the script was "really good".[13] Hopkins said he could not make up his mind to commit: "I was kind of surprised by this book, Hannibal. I thought it was really overreaching and so bizarre. So I couldn't make up my mind about it all. Some of it I found intriguing, some I was a little doubtful about."[11] When the producers confirmed that they were going to film Harris' novel, Hopkins told them yes, but added: "It needs some condensing."[11] The Hollywood Reporter confirmed that Hopkins had agreed to reprise his role in late December 1999, saying he had approved the latest draft of the script.[28]

Hopkins said he had no difficulty moving back into "Lecter's mind". "I just learned the lines and showed up and walked around as Hannibal Lecter. I thought, 'Do I repeat that same performance, or do I vary it?' Ten years had passed so I changed a bit."[12] In the book, Lecter uses bandages to disguise himself as a plastic surgery patient. This was left out of the film because Scott and Hopkins agreed to leave the face alone.[29] Hopkins said: "It's as if he's making a statement—'catch me if you can'. With his big hat, he's so obvious that nobody thinks he's Hannibal Lecter. I've always thought he's a very elegant man, a Renaissance man."[29] In the film, Lecter is first seen in Florence "as the classical Lecter, lecturing and being smooth", according to Hopkins.[30] When the film moves to the U.S., Hopkins changed his appearance by building up muscle and cropping his hair short "to make him like a mercenary, that he would be so fit and so strong that he could just snap somebody in two if they got ... in his way".[30]

Gary Oldman as Mason Verger[]

The part of Mason Verger, one of Lecter's two surviving victims, was originally offered to Christopher Reeve based on his work as a police officer who uses a wheelchair in Above Suspicion (1995). Not having read the novel, Reeve showed initial interest in the role, but ultimately declined upon realizing that Verger was a quadriplegic, facially-disfigured child rapist.[31][32] The part was later accepted by secondary choice Gary Oldman. Co-producer Martha De Laurentiis claimed they had a "funny situation" with Oldman wanting a prominent "credit". She said: "Now how can you have a prominent credit with Hannibal? The characters are Hannibal and Clarice Starling. So we really couldn't work something out (at first)." Oldman was apparently "out" of the film for a while, but then came back in, asking to go "unbilled". Oldman would become transformed and "unrecognizable as himself" to play the part of Verger. He would have no lips, cheeks or eyelids. Make-up artist Greg Cannom said: "It's really disgusting ... I've been showing people pictures [of Oldman as Verger], and they all just say 'Oh my God,' and walk away, which makes me very happy."[12] Oldman said that having his name completely removed from the billing and credits allowed him to "do it anonymously" under the heavy make-up.[33] In home-release versions of the film, Oldman's name is included in the closing credits.

Further casting[]

Other stars subsequently cast included Ray Liotta as U.S. Justice Department official Paul Krendler (the character had appeared in The Silence of the Lambs, but original actor Ron Vawter had died in the interim) and Italian actor Giancarlo Giannini as Detective Rinaldo Pazzi. Francesca Neri played Pazzi's wife, Allegra. Frankie Faison reprised his role as orderly Barney Matthews, remaining the only actor to play a role in all Hannibal feature films (until Hannibal Rising in 2007), including Manhunter.

Key production crew[]

Scott recruited key production crew whom he had worked with previously. Production designer Norris Spencer had worked on Thelma & Louise, Black Rain and 1492: Conquest of Paradise. Cinematographer John Mathieson, editor Pietro Scalia and composer Hans Zimmer had all worked on Scott's previous film Gladiator.[34]

Production[]

Background[]

Hannibal was filmed in 83 working days over 16 weeks.[35] The film began production on 8 May 2000 in Florence.[35] The film visited key locations in Florence and various locations around the United States.[34] Martha De Laurentiis said the film has almost a hundred locations and that it was a "constant pain of moving and dressing sets. But the locations were beautiful. Who could complain about being allowed to shoot in Palazzo Vecchio in Florence? Or President James Madison's farm in Montpelier or the amazing Biltmore Estate in Asheville?"[34] Eighty million dollars and a year and a half in production were spent before Scott got his first look at Hannibal in the editing room.[36]

Filming locations[]

  • The whole second act of Hannibal takes place in Florence. Ridley Scott had never filmed there before, but described it as "quite an experience ... It was kind of organized chaos ... We were there at the height of tourist season."[34] Within Florence, the production would visit various locations such as the Palazzo Capponi (as Dr. Fell's workplace), the Ponte Vecchio, the Palazzo Vecchio, the Pharmacy of Santa Maria Novella and the Cathedral.[34]
  • After leaving Italy on 5 June 2000, the production moved to Washington, D.C. Filming took place over six days at Union Station.[34] The unusual sight of a carousel would appear in the transportation hub and shopping plaza at Ridley Scott's request.[34]
  • Filming would last for seven weeks in Richmond, Virginia[34] for the shootout in a crowded fish market (shot at Richmond Farmer's Market) early in the film. Julianne Moore underwent Federal Bureau of Investigation training at the Bureau's headquarters before filming.[34]
  • A barn in Orange, Virginia, situated on the estate of President James Madison, was used to house 15 "performing hogs".[34] The 15 Russian boars used in the shoot were from a selection of around 6,000 that the animal wranglers observed.[34]
  • Biltmore Estate in Asheville, North Carolina, the biggest privately owned estate in the U.S., was chosen to signify the huge personal wealth of Mason Verger.[11]

Special make-up effects[]

Make-up artist Greg Cannom was pleased to be involved in Hannibal as it offered him the chance to produce "incredible and original make-ups".[11] For Mason Verger, the make-up team would initially produce 20 different heads which looked like zombies and did not reflect the vision Scott had of the character; Scott wanted Verger to look real with hideous scarring, and not something from the "House of Wax".[11] Scott himself would actually call up the help of expert doctors in an effort to get the look of the character as realistic as possible.[11] Scott showed the make-up team pictures of foetal things, which he thought touching; he wanted to make Mason Verger more touching than monstrous, as he thought of Verger as being someone who hadn't lost his sense of humour ... almost sympathetic.[11] Oldman would spend six hours a day in make-up to prepare for the role.[11]

For one of the film's final and infamous scenes, an exact duplicate was created of the character Paul Krendler, played by Ray Liotta, a scene which blended make-up, puppet work and CGI in a way which Scott called "seamless".[11]

Title sequence[]

The main titles were designed by Nick Livesey, a graduate of the Royal College of Art who worked for one of Scott's production companies in London. The sequence, shot in Florence by Livesey himself was intended as the film's second promotional trailer.[11] The studio thought it not "quite right", but it remained on Scott's mind and would eventually end up as the main title sequence.[11] Livesey would gather footage of pigeons in an empty square in Florence early one morning which, in the final cut, would morph into the face of Hannibal Lecter.[11] Scott believed it a good idea, as it fundamentally asked the question: 'Where is Hannibal Lecter?' Scott explains: "And of course this story tells it, with pigeons in the cobblestones of somewhere, where you wonder where that is ... and there he is... his face appears."[11] The titles are said to have been influenced by the film Seven.[37]

Music[]

Ridley Scott worked very closely with composer Hans Zimmer, during post-production on Hannibal.[11] Scott believes the music to a film is as important as dialogue—"It is the final adjustment to the screenplay, being able to also adjust the performance of the actors in fact."[11] Zimmer and Scott sat in during the editing process with editor Pietro Scalia to discuss scenes in the film and "not music".[11] Zimmer used a symphony orchestra for the opera sequence, but would mostly use what he described as a "very odd orchestra ... only cellos and basses all playing at the extreme ends of their range." This was done to emphasise the character of Lecter. He explains: "Anthony's character is for me somebody at the extreme range of whatever is humanly imaginable somehow." Zimmer also did not want the score to sound like a "modern day orchestra".[11]

The character Mason Verger had his own theme, which become more "perverted" as the film progressed, according to Zimmer.[11] Dante's sonnet was put to music by Zimmer and Patrick Cassidy titled Vide cor Meum for the opera scene in Florence.[38] Tracksounds.com wrote positively of Zimmer's score. "Zimmer truly crafts a score worthy of most fans' full attention ... the classical elements, and yes, even the monologue combine to make this an intense listening experience."[39] In a poll by British Classic FM listeners to find the greatest film soundtrack of all time, Hannibal ranked at Template:Abbr 59.[40] Strauss's The Blue Danube is also played at several points in the film.

Themes[]

Romance[]

Scott has said he believes the underlying emotion of Hannibal is "affection". "In some instances, you might even wonder or certainly from one direction—is it more than affection? It is dark, because the story is of course essentially dark, but it's kind of romantic at the same time."[11] Scott openly admits to a "romantic thematic" running through the film.[11] He told CNN that: "Hannibal was quite a different target, essentially a study between two individuals. Funny enough, it's rather romantic and also quite humorous, but also there's some quite bad behaviour as well."[15] During the opera scene in Florence, Lecter attends an operatic adaptation of one of Dante's sonnets, and meets with Detective Pazzi and his wife, Allegra. She asks Lecter, "Do you believe a man could become so obsessed by a woman after a single encounter?" Lecter replies: "Yes, I believe he could ... but would she see through the bars of his plight and ache for him?" This scene, in the film, is one which Scott claims most people "missed" the meaning of. It was in reference to Starling—to their encounter in The Silence of the Lambs.[26] The New York Times, in its review of the film, said Hannibal, "toys" with the idea of "love that dare not speak its name".[37]

Composer Hans Zimmer believed there were messages and subtext in each scene.[11] He said, "I can score this movie truly as a Freudian archetypal beauty and the beast fairy tale, as a horror movie, as the most elegant piece, on corruption in the American police force, as the loneliest woman on earth, the beauty in renaissance ..."[11] Zimmer ultimately believes it to be a dark love story, centering on two people who should never be together—a modern day Romeo and Juliet.[11] During post-production, Scott, Zimmer and the editor passionately argued about the meaning of Starling's tear during a confrontation with Lecter. They could not agree if it was a tear of "anguish", "loneliness" or "disgust".[11] Scott told the New York Post that, the affair of the heart between Lecter and Starling is metaphorical.[41] Rolling Stone magazine said in their review, "Scott offers a sly parody of relationships—think 'When Hannibal met Sally'."[21]

Retribution and punishment[]

Scott has said he believed Lecter, in his own way, was "pure", whose motivation is the search for "retribution and punishment".[26] "There is something very moral about Lecter in this film," said Scott in his audio commentary. "The behaviour of Hannibal is never insane—[I] didn't want to use that excuse. Is he insane? No, I think he's as sane as you or I. He just likes it."[26] Scott did say, however, "In our normal terms, he's truly evil."[26] Scott also brings up the notion of absolution in reference to Lecter towards the film's end.[26] Verger has one overriding objective in life: to capture Lecter and subject him to a slow, painful death.[42]

Corruption[]

Part of the story involves the character Rinaldo Pazzi (Giancarlo Giannini), a Florentine policeman who learns "Dr. Fell"'s true identity and realizes that this knowledge could make him rich. His escalating abandonment of morality allows him to countenance and facilitate the death of a Romani pickpocket, egged on by the desire to have the best for his much younger wife.[26] There is a moment in the film when Pazzi becomes corrupted, despite being what Scott describes as "very thoughtful".[26]

Release[]

Marketing[]

The first trailer appeared in theaters and was made available via the official website in early May 2000, over nine months before the film's release. As the film had only just begun production, footage was used from The Silence of the Lambs. A second trailer, which featured footage from the new film, was released in late November 2000. In marketing the film, Hopkins' portrayal of Hannibal Lecter was chosen as the unique selling point of Hannibal. "Mr Hopkins is the draw here", said Elvis Mitchell in a 2001 The New York Times article.[43] A poster released in the UK to promote Hannibal, featuring Lecter with a "skin mask" covering the right side of his face, was quickly removed from circulation as it was deemed "too shocking and disturbing for the public."[44]

Upon its release, Hannibal was met with significant media attention,[38][45] with the film's stars and director making several appearances on television, in newspapers and in magazines.[46] In an article for CBS News, Jill Serjeant stated that "the long-awaited sequel to the grisly 1991 thriller Silence of the Lambs is cooking up the hottest Internet and media buzz since the 1999 Star Wars 'prequel'."[46] Stars Anthony Hopkins and Julianne Moore made the covers of a number of magazines, including Vanity Fair, Entertainment Weekly, Premiere[45] and Empire.

Home media[]

Hannibal is available on VHS, as well as a one-disc and two-disc DVD. The two-disc DVD contains an array of special features including: commentary by director Ridley Scott, deleted and alternate scenes, five production featurettes and a "marketing gallery" which contains trailers, production stills and unused poster concepts. While the VHS version features the deleted scenes.

A special "steel-book" edition of Hannibal was released in 2007. There are no significant changes made to the DVD itself; only the package artwork was changed.

The film was originally released as part of The Hannibal Lecter Collection on Blu-ray in 2009. It was re-released as a stand-alone in 2011.

On February 6, 2019, it was announced that the film would be released on Ultra HD Blu-ray in April. The release includes a new 4K restoration supervised by cinematographer John Mathieson, as well as all special features on the previous two-disc DVD release.[47]

Reception[]

Box office[]

Hannibal grossed $58 million (U.S.) in its opening weekend (from 3,230 screens). At the time (February 2001), this was the fourth-biggest debut ever with 1997's The Lost World: Jurassic Park, 1999's Star Wars: Episode I – The Phantom Menace, and 2000's How the Grinch Stole Christmas (the latter was released a couple months prior) grossed more in an opening weekend.[48] It would outperform 2000's Scream 3 as both the highest debut in February until the 2003 release of Daredevil and the highest debut for a horror film until September 2017 with the release of It and 1999's The Sixth Sense as the highest opening for a psychological thriller until October 2019 with the release of Joker, though it had remained as of 2012 and up until that point as the highest-grossing psychological thriller with the December 2010 release of Black Swan coming to a close second. It also outperformed Scary Movie as, when it was released, the highest-grossing R-rated film of all time until the November 2003 release of The Matrix Revolutions, and the biggest-opening box office for an R-rated film ever until the February 2004 release of The Passion of the Christ (the title for being highest opening for February and R-rated film would go to Deadpool by 2016). On October 2012, it was ranked 90th all time.[48] Final domestic box office gross (U.S.) reached $165,092,268, with a worldwide gross of $351,692,268.[5] The film spent three weeks at number one in the U.S. box office chart, and four weeks at number one in the UK, and was the year's third highest-grossing film in that country behind Lara Croft: Tomb Raider and Harry Potter and the Philosopher's Stone.[49] In Italy, it grossed $4.6 million in its opening weekend, setting a record for a US release, beating The Blair Witch Project.[50] It also set a record opening week in the Netherlands with $1.3 million in six days, beating Independence Day and had the second biggest opening in Spain with $4.1 million in 6 days.[51] Hannibal was the tenth highest-grossing film of the year worldwide,[52] in a year which also saw the blockbuster releases (a year which also had already established franchises such as The Mummy Returns, Planet of the Apes and Jurassic Park III, or would later become big franchises like The Fast and the Furious, Shrek, Monsters, Inc., Harry Potter and the Philosopher's Stone, and The Lord of the Rings: The Fellowship of the Ring. Hannibal also made over $87,000,000 in U.S. video rentals following release in August 2001.[53]

Critical response[]

The reviews for Hannibal were mixed.[27][48][54] On Rotten Tomatoes, the film holds an approval score of 40% based on 171 reviews, with an average rating of 5.1/10. The website's critical consensus reads, "While superbly acted and stylishly filmed, Hannibal lacks the character interaction between the two leads which made the first movie so engrossing."[55] On Metacritic, the film has a rating of 57 out of 100 from 36 reviews.[9] Time magazine wrote: "A banquet of creepy, gory or grotesque incidents is on display in Hannibal. But this superior sequel has romance in its dark heart." Empire magazine gave it two out of five stars, calling it "laughable to just plain boring, Hannibal is toothless to the end." David Thomson, writing in the British Film Institute magazine Sight & Sound, praised the film. "It works. It's smart, good-looking, sexy, fun ... dirty, naughty and knowing."[54] Thomson does make clear, however, he is a great fan of director Ridley Scott's work.[54] He adds: "It is, literally, that Hannibal Lecter has become such a household joke that he can't be dreadful again. It seems clear that Anthony Hopkins and Scott saw that, and planned accordingly. That's how the movie was saved."[54] Variety magazine in its review said "Hannibal is not as good as Lambs ... ultimately more shallow and crass at its heart than its predecessor, Hannibal is nevertheless tantalizing, engrossing and occasionally startling."[56]

A negative review in The Guardian claimed that what was wrong with the film was carried over from the book: "The result is an inflated, good-looking bore of a movie. The Silence of the Lambs was a marvelous thing. This, by contrast is barely okey-dokey."[57] Roger Ebert gave the film a "Thumbs down" rating on the television program At the Movies with Ebert & Roeper and gave the film a 2.5 out of 4 stars rating in his print review, which he began with the following: "Ridley Scott's Hannibal is a carnival geek show. We must give it credit for the courage of its depravity; if it proves nothing else, it proves that if a man cutting off his face and feeding it to his dogs doesn't get the NC-17 rating for violence, nothing ever will."[58]

Differences from the novel[]

According to Variety magazine, the script for Hannibal was: "quite faithful to the Harris blueprint; fans of the tome may regret the perhaps necessary excision of some characters, most notably Mason Verger's muscle-bound macho sister Margot, as well as the considerable fascinating academic detail, but will basically feel the book has been respected (yes, even the climactic dinner party is served up almost intact, with the only surprise twists saved for its wake)."[56] Time Out noted: "The weight-watchers script sensibly dispenses with several characters to serve a brew that's enjoyably spicy but low on substance. So much story is squeezed into 131 minutes that little time's left for analysis or characterization."[59] Producer Dino De Laurentiis was asked why some characters, notably Jack Crawford, were left out of the film: "I think if you get a book which is 600 pages, you have to reduce it to a script of 100 pages. In two hours of film, you cannot possibly include all the characters. We set ourselves a limit, and cut characters which weren't so vital."[60]

In the book, Mason Verger runs an orphanage, from which he calls children to verbally abuse as a substitute for his no longer being able to molest them. He also has a sister, Margot, whom he had raped when they were children and who is a lesbian. When she disclosed her sexual orientation to her family, their father disowned her. As she is sterile due to steroid abuse, Verger exerts some control over her by promising her a semen sample with which to impregnate her lover, who could then inherit the Verger fortune. At the book's end, Margot and Starling both help Lecter escape during a shootout between Starling and Verger's guards. Margot, at Lecter's advice, stimulates her brother to ejaculate with a rectally inserted cattle prod, and then kills him by ramming his pet moray eel down his throat.

The book's controversial ending has Lecter presenting Starling with the exhumed bones of her father, which he "brings to life" by hypnotizing Starling, allowing her to say goodbye. This forges an odd alliance between Starling and Lecter, culminating in their becoming lovers and escaping to Argentina. At the novel's end, Barney sees them at the Teatro Colón of Buenos Aires.

Also gone from the film are the flashbacks to Lecter's childhood, in which he sees his younger sister, Mischa, eaten by German deserters in 1944. These flashbacks formed the basis for the 2007 film Hannibal Rising (written concurrently with the 2006 novel of the same name) which portrays Lecter as a young man.

Hopkins was asked in an interview on the subject of whether or not he believed the idea of Starling and Lecter heading off into the sunset as lovers (as happens in the book). "Yes, I did. Other people found that preposterous. I suppose there's a moral issue there. I think it would have been a very interesting thing though. I think it would have been very interesting had she gone off, because I suspected that there was that romance, attachment there, that obsession with her. I guessed that a long time ago, at the last phone call to Clarice, at the end of SotL, she said, 'Dr. Lecter, Dr. Lecter ... '."[61]

Other media[]

Prequels[]

The film was followed by two films which are prequels based on novels by Thomas Harris (although the novel of Red Dragon isn’t itself a prequel as it was written before Hannibal).

  • Red Dragon (2002)
  • Hannibal Rising (2007)

In popular culture[]

In 2013, there was a news story from Italy where a gangster fed his rival alive to pigs. Many media stories compared this to a similar scene in Hannibal.[62]

See also[]

Lua error: bad argument #2 to 'title.new' (unrecognized namespace name 'Portal').

  • "Vide Cor Meum"—the song from the opera in Florence

References[]

  1. Hannibal (18). British Board of Film Classification (1 February 2001).
  2. http://lumiere.obs.coe.int/web/film_info/?id=17252
  3. http://www.afi.com/members/catalog/DetailView.aspx?s=&Movie=62035
  4. http://www.tcm.com/tcmdb/title/451729/Hannibal/
  5. 5.0 5.1 5.2 Hannibal (2001).
  6. Cult Horror 'Hannibal' Just Dropped On Netflix (en).
  7. Williams, Karl. Hannibal (2001). AllMovie.
  8. "Taste of success", The Independent, 20 February 2001. 
  9. 9.0 9.1 Hannibal Reviews. Metacritic. CBS Interactive.
  10. Collins, Jim (1992). Film Theory Goes to the Movies. London, England: Routledge, page 35. ISBN 978-0-415-90576-3. 
  11. 11.00 11.01 11.02 11.03 11.04 11.05 11.06 11.07 11.08 11.09 11.10 11.11 11.12 11.13 11.14 11.15 11.16 11.17 11.18 11.19 11.20 11.21 11.22 11.23 11.24 11.25 11.26 11.27 11.28 11.29 11.30 11.31 11.32 11.33 11.34 Hannibal DVD "Making of feature"
  12. 12.00 12.01 12.02 12.03 12.04 12.05 12.06 12.07 12.08 12.09 12.10 12.11 Bernstein, Jill. "How Hannibal came to be made", The Guardian, 9 February 2001. 
  13. 13.0 13.1 13.2 13.3 "News articles", IMDB. 
  14. 14.0 14.1 14.2 14.3 14.4 14.5 14.6 14.7 14.8 Template:Cite magazine
  15. 15.0 15.1 15.2 "Bloody 'Hannibal' lacks bite of 'Lambs'", CNN, 8 February 2001. 
  16. 16.0 16.1 Morris, Mark. "Pleased to eat you", The Guardian, 4 February 2001. 
  17. Flynn, Gillian. "Rebirth of Cruel", Entertainment Weekly, 11 October 2002. 
  18. https://www.youtube.com/watch?v=GomRnogIdHE
  19. 19.0 19.1 19.2 Prigge, Steven (2004). Movie Moguls Speak: Interview with top film producers. McFarland. ISBN 978-0-7864-1929-6. 
  20. Stax. "Script Review: Hannibal", ScreenwriterUtopia. 
  21. 21.0 21.1 Travers, Peter. "Hannibal—Rolling Stone Review", Rolling Stone. 
  22. 22.0 22.1 22.2 Fierman, Daniel. "Killer Instinct", Entertainment Weekly, 17 March 2000. 
  23. 23.0 23.1 "Lambs 'in doubt' without Foster", BBC, 6 January 2000. 
  24. "Foster passes on Lambs sequel", BBC, 29 December 1999. 
  25. "The Total Film Interview: Jodie Foster", Total Film. 
  26. 26.0 26.1 26.2 26.3 26.4 26.5 26.6 26.7 Hannibal DVD "Ridley Scott commentary"
  27. 27.0 27.1 Rob, Brian (2005). Ridley Scott: Pocket Essential. Pocket Essentials. ISBN 978-1-904048-47-3. 
  28. "Sir Anthony set for Lambs sequel", BBC, 21 December 1999. 
  29. 29.0 29.1 "Movie Interview: Anthony Hopkins", BBC. 
  30. 30.0 30.1 Rose, Charlie. "60 Minutes: Actors' Take On Ridley Scott", CBS News, 30 January 2001. 
  31. Llenden, Joseph (June 2003). "You Offered Me What?! Roles Rejected By Great Actors". Total Film (Future plc). 
  32. Johnson, Malcolm. "A Heroic Persona". Hartford Courant. 12 October 2004. Retrieved 22 July 2012.
  33. IGN.com: Interview with Gary Oldman --[[ ---------------------------------- Lua module implementing the Template loop detected: Template:Webarchive template. A merger of the functionality of three templates: Template:Wayback, Template:Webcite and Template:Cite archives ]] --[[--------------------------< D E P E N D E N C I E S >------------------------------------------------------ ]] require('Module:No globals'); local getArgs = require ('Module:Arguments').getArgs; --[[--------------------------< F O R W A R D D E C L A R A T I O N S >-------------------------------------- ]] local categories = {}; -- category names local config = {}; -- global configuration settings local digits = {}; -- for i18n; table that translates local-wiki digits to western digits local err_warn_msgs = {}; -- error and warning messages local excepted_pages = {}; local month_num = {}; -- for i18n; table that translates local-wiki month names to western digits local prefixes = {}; -- service provider tail string prefixes local services = {}; -- archive service provider data from local s_text = {}; -- table of static text strings used to build final rendering local uncategorized_namespaces = {}; -- list of namespaces that we should not categorize local uncategorized_subpages = {}; -- list of subpages that should not be categorized --[[--------------------------< P A G E S C O P E I D E N T I F I E R S >---------------------------------- ]] local non_western_digits; -- boolean flag set true when data.digits.enable is true local this_page = mw.title.getCurrentTitle(); local track = {}; -- Associative array to hold tracking categories local ulx = {}; -- Associative array to hold template data --[[--------------------------< S U B S T I T U T E >---------------------------------------------------------- Populates numbered arguments in a message string using an argument table. ]] local function substitute (msg, args) return args and mw.message.newRawMessage (msg, args):plain() or msg; end --[[--------------------------< tableLength >----------------------- Given a 1-D table, return number of elements ]] local function tableLength(T) local count = 0 for _ in pairs(T) do count = count + 1 end return count end --[=[-------------------------< M A K E _ W I K I L I N K >---------------------------------------------------- Makes a wikilink; when both link and display text is provided, returns a wikilink in the form D; if only link is provided, returns a wikilink in the form L; if neither are provided or link is omitted, returns an empty string. ]=] local function make_wikilink (link, display, no_link) if nil == no_link then if link and ( ~= link) then if display and ( ~= display) then return table.concat ({'', display, ''}); else return table.concat ({'', link, ''}); end end return display or ; -- link not set so return the display text else -- no_link if display and ( ~= display) then -- if there is display text return display; -- return that else return link or ; -- return the target article name or empty string end end end --[[--------------------------< createTracking >----------------------- Return data in track[] ie. tracking categories ]] local function createTracking() if not excepted_pages[this_page.fullText] then -- namespace:title/fragment is allowed to be categorized (typically this module's / template's testcases page(s)) if uncategorized_namespaces[this_page.nsText] then return ; -- this page not to be categorized so return empty string end for _,v in ipairs (uncategorized_subpages) do -- cycle through page name patterns if this_page.text:match (v) then -- test page name against each pattern return ; -- this subpage type not to be categorized so return empty string end end end local out = {}; if tableLength(track) > 0 then for key, _ in pairs(track) do -- loop through table table.insert (out, make_wikilink (key)); -- and convert category names to links end end return table.concat (out); -- concat into one big string; empty string if table is empty end --[[--------------------------< inlineError >----------------------- Critical error. Render output completely in red. Add to tracking category. This function called as the last thing before abandoning this module ]] local function inlineError (msg, args) track[categories.error] = 1 return table.concat ({ 'Error in ', -- open the error message span config.tname, -- insert the local language template name ' template: ', substitute (msg, args), -- insert the formatted error message '.', -- close the span createTracking() -- add the category }) end --[[--------------------------< inlineRed >----------------------- Render a text fragment in red, such as a warning as part of the final output. Add tracking category. ]] local function inlineRed(msg, trackmsg) if trackmsg == "warning" then track[categories.warning] = 1; elseif trackmsg == "error" then track[categories.error] = 1; end return '' .. msg .. '' end --[[--------------------------< base62 >----------------------- Convert base-62 to base-10 Credit: https://de.wikipedia.org/wiki/Modul:Expr ]] local function base62( value ) local r = 1 -- default return value is input value is malformed if value:match ('%W') then -- value must only be in the set [0-9a-zA-Z] return; -- nil return when value contains extraneous characters end local n = #value -- number of characters in value local k = 1 local c r = 0 for i = n, 1, -1 do -- loop through all characters in value from ls digit to ms digit c = value:byte( i, i ) if c >= 48 and c <= 57 then -- character is digit 0-9 c = c - 48 elseif c >= 65 and c <= 90 then -- character is ascii a-z c = c - 55 else -- must be ascii A-Z c = c - 61 end r = r + c * k -- accumulate this base62 character's value k = k * 62 -- bump for next end -- for i return r end --[[--------------------------< D E C O D E _ D A T E >-------------------------------------------------------- Given a date string, return it in iso format along with an indicator of the date's format. Except that month names must be recognizable as legitimate month names with proper capitalization, and that the date string must match one of the recognized date formats, no error checking is done here; return nil else ]] local function decode_date (date_str) local patterns = { ['dmy'] = {'^(%d%d?) +([^%s%d]+) +(%d%d%d%d)$', 'd', 'm', 'y'}, -- %a does not recognize unicode combining characters used by some languages ['mdy'] = {'^([^%s%d]+) (%d%d?), +(%d%d%d%d)$', 'm', 'd', 'y'}, ['ymd'] = {'^(%d%d%d%d) +([^%s%d]+) (%d%d?)$', 'y', 'm', 'd'}, -- not mos compliant at en.wiki but may be acceptible at other wikis }; local t = {}; if non_western_digits then -- this wiki uses non-western digits? date_str = mw.ustring.gsub (date_str, '%d', digits); -- convert this wiki's non-western digits to western digits end if date_str:match ('^%d%d%d%d%-%d%d%-%d%d$') then -- already an iso format date, return western digits form return date_str, 'iso'; end for k, v in pairs (patterns) do local c1, c2, c3 = mw.ustring.match (date_str, patterns[k][1]); -- c1 .. c3 are captured but we don't know what they hold if c1 then -- set on match t = { -- translate unspecified captures to y, m, and d [patterns[k][2]] = c1, -- fill the table of captures with the captures [patterns[k][3]] = c2, -- take index names from src_pattern table and assign sequential captures [patterns[k][4]] = c3, }; if month_num[t.m] then -- when month not already a number t.m = month_num[t.m]; -- replace valid month name with a number else return nil, 'iso'; -- not a valid date form because month not valid end return mw.ustring.format ('%.4d-%.2d-%.2d', t.y, t.m, t.d), k; -- return date in iso format end end return nil, 'iso'; -- date could not be decoded; return nil and default iso date end --[[--------------------------< makeDate >----------------------- Given year, month, day numbers, (zero-padded or not) return a full date in df format where df may be one of: mdy, dmy, iso, ymd on entry, year, month, day are presumed to be correct for the date that they represent; all are required in this module, makeDate() is sometimes given an iso-format date in year: makeDate (2018-09-20, nil, nil, df) this works because table.concat() sees only one table member ]] local function makeDate (year, month, day, df) local format = { ['dmy'] = 'j F Y', ['mdy'] = 'F j, Y', ['ymd'] = 'Y F j', ['iso'] = 'Y-m-d', }; local date = table.concat ({year, month, day}, '-'); -- assemble year-initial numeric-format date (zero padding not required here) if non_western_digits then -- this wiki uses non-western digits? date = mw.ustring.gsub (date, '%d', digits); -- convert this wiki's non-western digits to western digits end return mw.getContentLanguage():formatDate (format[df], date); end --[[--------------------------< I S _ V A L I D _ D A T E >---------------------------------------------------- Returns true if date is after 31 December 1899 (why is 1900 the min year? shouldn't the internet's date-of-birth be min year?), not after today's date, and represents a valid date (29 February 2017 is not a valid date). Applies Gregorian leapyear rules. all arguments are required ]] local function is_valid_date (year, month, day) local days_in_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; local month_length; local y, m, d; local today = os.date ('*t'); -- fetch a table of current date parts if not year or == year or not month or == month or not day or == day then return false; -- something missing end y = tonumber (year); m = tonumber (month); d = tonumber (day); if 1900 > y or today.year < y or 1 > m or 12 < m then -- year and month are within bounds TODO: 1900? return false; end if (2==m) then -- if February month_length = 28; -- then 28 days unless if (0==(y%4) and (0~=(y%100) or 0==(y%400))) then -- is a leap year? month_length = 29; -- if leap year then 29 days in February end else month_length=days_in_month[m]; end if 1 > d or month_length < d then -- day is within bounds return false; end -- here when date parts represent a valid date return os.time({['year']=y, ['month']=m, ['day']=d, ['hour']=0}) <= os.time(); -- date at midnight must be less than or equal to current date/time end --[[--------------------------< decodeWebciteDate >----------------------- Given a URI-path to Webcite (eg. /67xHmVFWP) return the encoded date in df format returns date string in df format - webcite date is a unix timestamp encoded as bae62 or the string 'query' ]] local function decodeWebciteDate(path, df) local dt = {}; local decode; dt = mw.text.split(path, "/") -- valid URL formats that are not base62 -- http://www.webcitation.org/query?id=1138911916587475 -- http://www.webcitation.org/query?url=http..&date=2012-06-01+21:40:03 -- http://www.webcitation.org/1138911916587475 -- http://www.webcitation.org/cache/73e53dd1f16cf8c5da298418d2a6e452870cf50e -- http://www.webcitation.org/getfile.php?fileid=1c46e791d68e89e12d0c2532cc3cf629b8bc8c8e if dt[2]:find ('query', 1, true) or dt[2]:find ('cache', 1, true) or dt[2]:find ('getfile', 1, true) or tonumber(dt[2]) then return 'query'; end decode = base62(dt[2]); -- base62 string -> exponential number if not decode then return nil; -- nil return when dt[2] contains characters not in %w end dt = os.date('*t', string.format("%d", decode):sub(1,10)) -- exponential number -> text -> first 10 characters (a unix timestamp) -> a table of date parts decode = makeDate (dt.year, dt.month, dt.day, 'iso'); -- date comparisons are all done in iso format with western digits if non_western_digits then -- this wiki uses non-western digits? decode = mw.ustring.gsub (decode, '%d', digits); -- convert this wiki's non-western digits to western digits end return decode; end --[[--------------------------< decodeWaybackDate >----------------------- Given a URI-path to Wayback (eg. /web/20160901010101/http://example.com ) or Library of Congress Web Archives (eg. /all/20160901010101/http://example.com) or UK Government Web Archive (eg. /ukgwa/20160901010101/http://example.com or /tna/20160901010101/http://example.com) return the formatted date eg. "September 1, 2016" in df format Handle non-digits in snapshot ID such as "re_" and "-" and "*" returns two values: first value is one of these: valid date string in df format - wayback date is valid (including the text string 'index' when date is '/*/') empty string - wayback date is malformed (less than 8 digits, not a valid date) nil - wayback date is '/save/' or otherwise not a number second return value is an appropriate 'message' may or may not be formatted ]] local function decodeWaybackDate(path, df) local msg, snapdate; snapdate = path:gsub ('^/web/', ):gsub ('^/all/', ):gsub ('^/ukgwa/', ):gsub ('^/tna/', ):gsub ('^/', ); -- remove leading /web/, /all/, /ukgwa/, /tna/, or / snapdate = snapdate:match ('^[^/]+'); -- get timestamp if snapdate == "*" then -- eg. /web/*/http.., etc. return 'index'; -- return indicator that this url has an index date end snapdate = snapdate:gsub ('%a%a_%d?$', ):gsub ('%-', ); -- from date, remove any trailing "re_", dashes msg = ; if snapdate:match ('%*$') then -- a trailing '*' causes calendar display at archive .org snapdate = snapdate:gsub ('%*$', ); -- remove so not part of length calc later msg = inlineRed (err_warn_msgs.ts_cal, 'warning'); -- make a message end if not tonumber(snapdate) then return nil, 'ts_nan'; -- return nil (fatal error flag) and message selector end local dlen = snapdate:len(); if dlen < 8 then -- we need 8 digits TODO: but shouldn't this be testing for 14 digits? return , inlineRed (err_warn_msgs.ts_short, 'error'); -- return empty string and error message end local year, month, day = snapdate:match ('(%d%d%d%d)(%d%d)(%d%d)'); -- no need for snapdatelong here if not is_valid_date (year, month, day) then return , inlineRed (err_warn_msgs.ts_date, 'error'); -- return empty string and error message end snapdate = table.concat ({year, month, day}, '-'); -- date comparisons are all done in iso format if 14 == dlen then return snapdate, msg; -- return date with message if any else return snapdate, msg .. inlineRed (err_warn_msgs.ts_len, 'warning'); -- return date with warning message(s) end end --[[--------------------------< decodeArchiveisDate >----------------------- Given an Archive.is "long link" URI-path (e.g. /2016.08.28-144552/http://example.com) return the date in df format (e.g. if df = dmy, return 28 August 2016) Handles "." and "-" in snapshot date, so 2016.08.28-144552 is same as 20160828144552 returns two values: first value is one of these: valid date string in df format - archive.is date is valid (including the text string 'short link' when url is the short form) empty string - wayback date is malformed (not a number, less than 8 digits, not a valid date) nil - wayback date is '/save/' second return value is an appropriate 'message' may or may not be formatted ]] local function decodeArchiveisDate(path, df) local snapdate if path:match ('^/%w+$') then -- short form url path is '/' followed by some number of base 62 digits and nothing else return "short link" -- e.g. http://archive.is/hD1qz end snapdate = mw.text.split (path, '/')[2]:gsub('[%.%-]', ); -- get snapshot date, e.g. 2016.08.28-144552; remove periods and hyphens local dlen = string.len(snapdate) if dlen < 8 then -- we need 8 digits TODO: but shouldn't this be testing for 14 digits? return , inlineRed (err_warn_msgs.ts_short, 'error'); -- return empty string and error message end local year, month, day = snapdate:match ('(%d%d%d%d)(%d%d)(%d%d)'); -- no need for snapdatelong here if not is_valid_date (year, month, day) then return , inlineRed (err_warn_msgs.ts_date, 'error'); -- return empty string and error message end snapdate = table.concat ({year, month, day}, '-'); -- date comparisons are all done in iso format if 14 == dlen then return snapdate; -- return date else return snapdate, inlineRed (err_warn_msgs.ts_len, 'warning'); -- return date with warning message end end --[[--------------------------< serviceName >----------------------- Given a domain extracted by mw.uri.new() (eg. web.archive.org) set tail string and service ID ]] local function serviceName(host, no_link) local tracking; local index; host = host:lower():gsub ('^web%.(.+)', '%1'):gsub ('^www%.(.+)', '%1'); -- lowercase, remove web. and www. subdomains if services[host] then index = host; else for k, _ in pairs (services) do if host:find ('%f[%a]'..k:gsub ('([%.%-])', '%%%1')) then index = k; break; end end end if index then local out = {}; -- empty string in [1] so that concatenated result has leading single space ulx.url1.service = services[index][4] or 'other'; tracking = services[index][5] or categories.other; -- build tail string if false == services[index][1] then -- select prefix table.insert (out, prefixes.at); elseif true == services[index][1] then table.insert (out, prefixes.atthe); else table.insert (out, services[index][1]); end table.insert (out, make_wikilink (services[index][2], services[index][3], no_link)); -- add article wikilink if services[index][6] then -- add tail postfix if it exists table.insert (out, services[index][6]); end ulx.url1.tail = table.concat (out, ' '); -- put it all together; result has leading space character else -- here when unknown archive ulx.url1.service = 'other'; tracking = categories.unknown; ulx.url1.tail = table.concat ({, prefixes.at, host, inlineRed (err_warn_msgs.unknown_url, error)}, ' '); end track[tracking] = 1 end --[[--------------------------< parseExtraArgs >----------------------- Parse numbered arguments starting at 2, such as url2..url10, date2..date10, title2..title10 For example: Template loop detected: Template:Webarchive Three url arguments not in numeric sequence (1..4..7). Function only processes arguments numbered 2 or greater (in this case 4 and 7) It creates numeric sequenced table entries like: urlx.url2.url = <argument value for url4> urlx.url3.url = <argument value for url7> Returns the number of URL arguments found numbered 2 or greater (in this case returns "2") ]] local function parseExtraArgs(args) local i, j, argurl, argurl2, argdate, argtitle j = 2 for i = 2, config.maxurls do argurl = "url" .. i if args[argurl] then argurl2 = "url" .. j ulx[argurl2] = {} ulx[argurl2]["url"] = args[argurl] argdate = "date" .. i if args[argdate] then ulx[argurl2]["date"] = args[argdate] else ulx[argurl2]["date"] = inlineRed (err_warn_msgs.date_miss, 'warning'); end argtitle = "title" .. i if args[argtitle] then ulx[argurl2]["title"] = args[argtitle] else ulx[argurl2]["title"] = nil end j = j + 1 end end if j == 2 then return 0 else return j - 2 end end --[[--------------------------< comma >----------------------- Given a date string, return "," if it's MDY ]] local function comma(date) return (date and date:match ('%a+ +%d%d?(,) +%d%d%d%d')) or ; end --[[--------------------------< createRendering >----------------------- Return a rendering of the data in ulx[][] ]] local function createRendering() local displayfield local out = {}; local index_date, msg = ulx.url1.date:match ('(index)(.*)'); -- when ulx.url1.date extract 'index' text and message text (if there is a message) ulx.url1.date = ulx.url1.date:gsub ('index.*', 'index'); -- remove message if 'none' == ulx.url1.format then -- For Template:Wayback, Template:Webcite table.insert (out, '['); -- open extlink markup table.insert (out, ulx.url1.url); -- add url if ulx.url1.title then table.insert (out, ' ') -- the required space table.insert (out, ulx.url1.title) -- the title table.insert (out, ']'); -- close extlink markup table.insert (out, ulx.url1.tail); -- tail text if ulx.url1.date then table.insert (out, ' ('); -- open date text; TODO: why the html entity? replace with regular space? table.insert (out, 'index' == ulx.url1.date and s_text.archive or s_text.archived); -- add text table.insert (out, ' '); -- insert a space table.insert (out, ulx.url1.date); -- add date table.insert (out, ')'); -- close date text end else -- no title if index_date then -- when url date is 'index' table.insert (out, table.concat ({' ', s_text.Archive_index, ']'})); -- add the index link label table.insert (out, msg or ); -- add date mismatch message when url date is /*/ and |date= has valid date else table.insert (out, table.concat ({' ', s_text.Archived, '] '})); -- add link label for url has timestamp date (will include mismatch message if there is one) end if ulx.url1.date then if 'index' ~= ulx.url1.date then table.insert (out, ulx.url1.date); -- add date when data is not 'index' end table.insert (out, comma(ulx.url1.date)); -- add ',' if date format is mdy table.insert (out, ulx.url1.tail); -- add tail text else -- no date table.insert (out, ulx.url1.tail); -- add tail text end end if 0 < ulx.url1.extraurls then -- For multiple archive URLs local tot = ulx.url1.extraurls + 1 table.insert (out, '.') -- terminate first url table.insert (out, table.concat ({' ', s_text.addlarchives, ': '})); -- add header text for i=2, tot do -- loop through the additionals local index = table.concat ({'url', i}); -- make an index displayfield = ulx[index]['title'] and 'title' or 'date'; -- choose display text table.insert (out, '['); -- open extlink markup table.insert (out, ulx[index]['url']); -- add the url table.insert (out, ' '); -- the required space table.insert (out, ulx[index][displayfield]); -- add the label table.insert (out, ']'); -- close extlink markup table.insert (out, i==tot and '.' or ', '); -- add terminator end end return table.concat (out); -- make a big string and done else -- For Template:Cite archives if 'addlarchives' == ulx.url1.format then -- Multiple archive services table.insert (out, table.concat ({s_text.addlarchives, ': '})); -- add header text else -- Multiple pages from the same archive table.insert (out, table.concat ({s_text.addlpages, ' '})); -- add header text table.insert (out, ulx.url1.date); -- add date to header text table.insert (out, ': '); -- close header text end local tot = ulx.url1.extraurls + 1; for i=1, tot do -- loop through the additionals local index = table.concat ({'url', i}); -- make an index table.insert (out, '['); -- open extlink markup table.insert (out, ulx[index]['url']); -- add url table.insert (out, ' '); -- add required space displayfield = ulx[index]['title']; if 'addlarchives' == ulx.url1.format then if not displayfield then displayfield = ulx[index]['date'] end else -- must be addlpages if not displayfield then displayfield = table.concat ({s_text.Page, ' ', i}); end end table.insert (out, displayfield); -- add title, date, page label text table.insert (out, ']'); -- close extlink markup table.insert (out, (i==tot and '.' or ', ')); -- add terminator end return table.concat (out); -- make a big string and done end end --[[--------------------------< P A R A M E T E R _ N A M E _ X L A T E >-------------------------------------- for internaltionalization, translate local-language parameter names to their English equivalents TODO: return error message if multiple aliases of the same canonical parameter name are found? returns two tables: new_args - holds canonical form parameters and their values either from translation or because the parameter was already in canonical form origin - maps canonical-form parameter names to their untranslated (local language) form for error messaging in the local language unrecognized parameters are ignored ]] local function parameter_name_xlate (args, params, enum_params) local name; -- holds modifiable name of the parameter name during evaluation local enum; -- for enumerated parameters, holds the enumerator during evaluation local found = false; -- flag used to break out of nested for loops local new_args = {}; -- a table that holds canonical and translated parameter k/v pairs local origin = {}; -- a table that maps original (local language) parameter names to their canonical name for local language error messaging local unnamed_params; -- set true when unsupported positional parameters are detected for k, v in pairs (args) do -- loop through all of the arguments in the args table name = k; -- copy of original parameter name if 'string' == type (k) then if non_western_digits then -- true when non-western digits supported at this wiki name = mw.ustring.gsub (name, '%d', digits); -- convert this wiki's non-western digits to western digits end enum = name:match ('%d+$'); -- get parameter enumerator if it exists; nil else if not enum then -- no enumerator so looking for non-enumnerated parameters -- TODO: insert shortcut here? if params[name] then name holds the canonical parameter name; no need to search further for pname, aliases in pairs (params) do -- loop through each parameter the params table for _, alias in ipairs (aliases) do -- loop through each alias in the parameter's aliases table if name == alias then new_args[pname] = v; -- create a new entry in the new_args table origin [pname] = k; -- create an entry to make canonical parameter name to original local language parameter name found = true; -- flag so that we can break out of these nested for loops break; -- no need to search the rest of the aliases table for name so go on to the next k, v pair end end if found then -- true when we found an alias that matched name found = false; -- reset the flag break; -- go do next args k/v pair end end else -- enumerated parameters name = name:gsub ('%d$', '#'); -- replace enumeration digits with place holder for table search -- TODO: insert shortcut here? if num_params[name] then name holds the canonical parameter name; no need to search further for pname, aliases in pairs (enum_params) do -- loop through each parameter the num_params table for _, alias in ipairs (aliases) do -- loop through each alias in the parameter's aliases table if name == alias then pname = pname:gsub ('#$', enum); -- replace the '#' place holder with the actual enumerator new_args[pname] = v; -- create a new entry in the new_args table origin [pname] = k; -- create an entry to make canonical parameter name to original local language parameter name found = true; -- flag so that we can break out of these nested for loops break; -- no need to search the rest of the aliases table for name so go on to the next k, v pair end end if found then -- true when we found an alias that matched name found = false; -- reset the flag break; -- go do next args k/v pair end end end else unnamed_params = true; -- flag for unsupported positional parameters end end -- for k, v return new_args, origin, unnamed_params; end --[[--------------------------< W E B A R C H I V E >---------------------------------------------------------- template entry point ]] local function webarchive(frame) local args = getArgs (frame); local data = mw.loadData (table.concat ({ -- make a data module name; sandbox or live 'Module:Webarchive/data', frame:getTitle():find('sandbox', 1, true) and '/sandbox' or -- this instance is ./sandbox then append /sandbox })); categories = data.categories; -- fill in the forward declarations config = data.config; if data.digits.enable then digits = data.digits; -- for i18n; table of digits in the local wiki's language non_western_digits = true; -- use_non_western_digits end err_warn_msgs = data.err_warn_msgs; excepted_pages = data.excepted_pages; month_num = data.month_num; -- for i18n; table of month names in the local wiki's language prefixes = data.prefixes; services = data.services; s_text = data.s_text; uncategorized_namespaces = data.uncategorized_namespaces; uncategorized_subpages = data.uncategorized_subpages; local origin = {}; -- holds a map of English to local language parameter names used in the current template; not currently used local unnamed_params; -- boolean set to true when template call has unnamed parameters args, origin, unnamed_params = parameter_name_xlate (args, data.params, data.enum_params); -- translate parameter names in args to English local date, format, msg, udate, uri, url; local ldf = 'iso'; -- when there is no |date= parameter, render url dates in iso format if args.url and args.url1 then -- URL argument (first) return inlineError (data.crit_err_msgs.conflicting, {origin.url, origin.url1}); end url = args.url or args.url1; if not url then return inlineError (data.crit_err_msgs.empty); end -- these iabot bugs perportedly fixed; removing these causes lua script error --[[ -- at Template:Webarchive/testcases/Production; resolve that before deleting these tests if mw.ustring.find( url, "https://web.http", 1, true ) then -- track bug - TODO: IAbot bug; not known if the bug has been fixed; deferred track[categories.error] = 1; return inlineError (data.crit_err_msgs.iabot1); end if url == "https://web.archive.org/http:/" then -- track bug - TODO: IAbot bug; not known if the bug has been fixed; deferred track[categories.error] = 1; return inlineError (data.crit_err_msgs.iabot2); end ]] if not (url:lower():find ('^http') or url:find ('^//')) then return inlineError (data.crit_err_msgs.invalid_url ); end ulx.url1 = {} ulx.url1.url = url ulx.url1.extraurls = parseExtraArgs(args) local good = false; good, uri = pcall (mw.uri.new, ulx.url1.url); -- get a table of uri parts from this url; protected mode to prevent lua error when ulx.url1.url is malformed if not good or nil == uri.host then -- abandon when ulx.url1.url is malformed return inlineError (data.crit_err_msgs.invalid_url); end serviceName(uri.host, args.nolink) if args.date and args.date1 then -- Date argument return inlineError (data.crit_err_msgs.conflicting, {origin.date, origin.date1}); end date = args.date or args.date1; date = date and date:gsub (' +', ' '); -- replace multiple spaces with a single space if date and config.verifydates then if '*' == date then date = 'index'; ldf = 'iso'; -- set to default format elseif 'mdy' == date then date = nil; -- if date extracted from URL, ldf = 'mdy'; -- then |date=mdy overrides iso elseif 'dmy' == date then date = nil; -- if date extracted from URL, ldf = 'dmy'; -- then |date=dmy overrides iso elseif 'ymd' == date then date = nil; -- if date extracted from URL, ldf = 'ymd'; -- then |date=ymd overrides iso else date, ldf = decode_date (date); -- get an iso format date from date and get date's original format end end if 'wayback' == ulx.url1.service or 'locwebarchives' == ulx.url1.service or 'ukgwa' == ulx.url1.service then if date then if config.verifydates then if ldf then udate, msg = decodeWaybackDate (uri.path); -- get the url date in iso format and format of date in |date=; 'index' when wayback url date is * if not udate then -- this is the only 'fatal' error return return inlineError (data.crit_err_msgs[msg]); end if udate ~= date then -- date comparison using iso format dates date = udate; msg = table.concat ({ inlineRed (err_warn_msgs.mismatch, 'warning'), -- add warning message msg, -- add message if there is one }); end end end else -- no |date= udate, msg = decodeWaybackDate (uri.path); if not udate then -- this is the only 'fatal' error return return inlineError (data.crit_err_msgs[msg]); end if == udate then date = nil; -- unset else date = udate; end end elseif 'webcite' == ulx.url1.service then if date then if config.verifydates then if ldf then udate = decodeWebciteDate (uri.path); -- get the url date in iso format if 'query' ~= udate then -- skip if query if udate ~= date then -- date comparison using iso format dates date = udate; msg = table.concat ({ inlineRed (err_warn_msgs.mismatch, 'warning'), }); end end end end else date = decodeWebciteDate( uri.path, "iso" ) if date == "query" then date = nil; -- unset msg = inlineRed (err_warn_msgs.date_miss, 'warning'); elseif not date then -- invalid base62 string date = inlineRed (err_warn_msgs.date1, 'error'); end end elseif 'archiveis' == ulx.url1.service then if date then if config.verifydates then if ldf then udate, msg = decodeArchiveisDate (uri.path) -- get the url date in iso format if 'short link' ~= udate then -- skip if short link if udate ~= date then -- date comparison using iso format dates date = udate; msg = table.concat ({ inlineRed (err_warn_msgs.mismatch, 'warning'), -- add warning message msg, -- add message if there is one }); end end end end else -- no |date= udate, msg = decodeArchiveisDate( uri.path, "iso" ) if udate == "short link" then date = nil; -- unset msg = inlineRed (err_warn_msgs.date_miss, 'warning'); elseif == udate then date = nil; -- unset else date = udate; end end else -- some other service if not date then msg = inlineRed (err_warn_msgs.date_miss, 'warning'); end end if 'index' == date then ulx.url1.date = date .. (msg or ); -- create index + message (if there is one) elseif date then ulx.url1.date = makeDate (date, nil, nil, ldf) .. (msg or ); -- create a date in the wiki's local language + message (if there is one) else ulx.url1.date = msg; end format = args.format; -- Format argument if not format then format = "none" else for k, v in pairs (data.format_vals) do -- |format= accepts two specific values loop through a table of those values local found; -- declare a nil flag for _, p in ipairs (v) do -- loop through local language variants if format == p then -- when |format= value matches format = k; -- use name from table key found = true; -- declare found so that we can break out of outer for loop break; -- break out of inner for loop end end if found then break; end end if format == "addlpages" then if not ulx.url1.date then format = "none" end elseif format == "addlarchives" then format = "addlarchives" else format = "none" end end ulx.url1.format = format if args.title and args.title1 then -- Title argument return inlineError (data.crit_err_msgs.conflicting, {origin.title, origin.title1}); end ulx.url1.title = args.title or args.title1; local rend = createRendering() if not rend then return inlineError (data.crit_err_msgs.unknown); end return rend .. ((unnamed_params and inlineRed (err_warn_msgs.unnamed_params, 'warning')) or ) .. createTracking(); end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return {webarchive = webarchive};
  34. 34.00 34.01 34.02 34.03 34.04 34.05 34.06 34.07 34.08 34.09 34.10 Official Hannibal production notes
  35. 35.0 35.1 Official Hannibal Journal
  36. Rose, Charlie. "60 Minutes: Ridley Scott", CBS News, 27 January 2001. 
  37. 37.0 37.1 Mitchell, Elvis. "FILM REVIEW; Whetting That Large Appetite for Second Helpings", The New York Times, 9 February 2001. 
  38. 38.0 38.1 Clarke, James (2002). Virgin Film: Ridley Scott. Virgin Books. ISBN 0-7535-0731-5. 
  39. Coleman, Christopher. "Goodie, Goodie!", TrackSounds. 
  40. "Top 100 movie soundtracks", Classic FM. [dead link]
  41. "Hannibal News", Counting Down. 5800. 
  42. Wilson, Mark. "Lecter's bloody second course has a hollow centre", The Independent, 6 February 2001. 
  43. Elvis Mitchell. "Hannibal FILM REVIEW; Whetting That Large Appetite for Second Helpings", The New York Times, 9 February 2001. 
  44. Hannibal trivia on imdb.com. IMDB.
  45. 45.0 45.1 Nick Sambides Jr.. "Taking A Bite Out Of Hannibal", cbsnews.com, 8 February 2001. 
  46. 46.0 46.1 Jill Serjeant. "Appetites Whet For Hannibal", MMI Reuters Limited, CBS News, 2 February 2001. 
  47. https://www.blu-ray.com/news/?id=24599
  48. 48.0 48.1 48.2 "Box Office: Hannibal Takes Record-Sized Bite", ABC News, 11 February 2001. 
  49. "Box Office", IMDB Pro. 
  50. Template:Cite magazine
  51. Template:Cite magazine
  52. "Box-Office data for Hannibal", Box Office Mojo. 
  53. "US Video rentals", IMDB. 
  54. 54.0 54.1 54.2 54.3 Thomson, David. "The Riddler Has His Day", Sight & Sound. 
  55. Hannibal (2001). Rotten Tomatoes. Fandango Media.
  56. 56.0 56.1 McCarthy, Todd. "Hannibal Review", Variety, 5 February 2001. 
  57. Brooks, Xan. "Hannibal Review", The Guardian, 16 February 2001. 
  58. Roger Ebert. "Hannibal", Chicago Sun-Times, 9 February 2001. 
  59. "Hannibal review", Time Out Film Guide. 
  60. Mattram, James. "Interview: Dino De Laurentiis", BBC. 
  61. "Interview with Anthony Hopkins", IGN. 
  62. Calder, Rich (29 November 2013). Mobster left to be eaten alive by pigs. NY Post.

Notes[]

Template:Notelist

External links[]

Template:Wikiquote

Template:Hannibal Template:Ridley Scott Template:David Mamet Template:Steven Zaillian Template:Good article

Template:Authority control