<email ⁄>
<windows live messenger ⁄>
<myCurriculum type="pdf" ⁄>
No final, vencem os que oram, em vez de temer, e agem em vez de lamentar
*{padding: 0; margin: 0;} body{ font-family: Verdana, Tahoma, Arial, sans-serif;font-size: 62.5%; color: #000;background: #fff;text-align: left;margin-top: .5em; } div#container,div#search{ margin: 0 auto; width: 80em; padding: .8em; border: solid 0.6em #3F4C6B; overflow:hidden; } div#search{text-align: center;} label, span, strong{font-size: 1.2em;color: #D01F3C;} strong{color: #356AA0 !important; font-weight: 900;} input{border: solid .1em #FF7400;color: #B02B2C;background-color: #FFFF88;} input#txtFilmID{font-size: 2.8em;border-color: #FF7400;text-align: center;} input#btnFilmViewStats{ background-color: #356AA0; font-size: 1.8em;color: #F9F7ED; } div#FilmInfo{ float: left; padding: .6em;line-height: 1.6em;width: 65em; border: solid 0.4em #6BBA70; text-align: justify; } div#FilmPoster{ float: right; padding: .6em;right: .8em;top: .8em; border: solid 0.4em #6BBA70; } a{text-decoration: none;color: #FF7400;} a:hover{text-decoration: underline;}
Imports Microsoft.VisualBasic Imports System.Net Imports System.IO Imports System.Text ''' <summary> ''' Class que permite obter algumas informações ''' sobre um filme em www.imdb.com ''' </summary> ''' <author>pedrocorreia.net</author> Public Class SoCalledImdbApi Private Const _imdb_url As String = "http://www.imdb.com" Private _movie_url As String = "" Private _movie_id As String = "" Private _html As String = "" ''' <summary> ''' Método construtor ''' </summary> ''' <param name="movie_id">ID do filme, formato "tt0000000"</param> Public Sub New(ByVal movie_id As String) If Me._IsValid(movie_id) Then MovieID = movie_id Me._SetMovieURL() Me.FetchInfo() Else Throw New Exception("IMDB_API_INVALID_MOVIE_ID") End If End Sub ''' <summary> ''' Obter HTML ''' </summary> Private Sub FetchInfo() If Me._IsValid(Me._movie_id) Then Dim pedido As WebRequest = WebRequest.Create(Me._movie_url) Dim resposta As HttpWebResponse = CType(pedido.GetResponse(), HttpWebResponse) Dim dataStream As Stream = resposta.GetResponseStream() Dim reader As New StreamReader(dataStream) Me._html = reader.ReadToEnd() Else Throw New Exception("IMDB_API_INVALID_MOVIE_ID") End If End Sub ''' <summary> ''' Getter/ Setter ID do filme ''' Formato: tt0000000 ''' </summary> ''' <value>ID do filme, formato "tt0000000"</value> ''' <returns>ID do filme, formato "tt0000000"</returns> Public Property MovieID() As String Get Return Me._movie_id End Get Set(ByVal value As String) Me._movie_id = value End Set End Property ''' <summary> ''' Obter titulo ''' </summary> ''' <returns>String</returns> Public Function GetMovieTitle() As String GetMovieTitle = Me._GetGenericInfo("<title>", "</title>") End Function ''' <summary> ''' Obter poster ''' </summary> ''' <returns>String</returns> ''' <remarks>Devolve tag imagem completa</remarks> Public Function GetMoviePoster() As String GetMoviePoster = Me._GetGenericInfo("<div class=""photo"">", "</div>") End Function ''' <summary> ''' Obter idioma ''' </summary> ''' <returns>String</returns> Public Function GetMovieLanguage() As String GetMovieLanguage = Me._GetGenericInfo("<h5>Language:</h5>", "</div>") End Function ''' <summary> ''' Obter género ''' </summary> ''' <returns>String</returns> Public Function GetMovieGenre() As String GetMovieGenre = Me._GetGenericInfo("<h5>Genre:</h5>", "</div>") End Function ''' <summary> ''' Obter tagline ''' </summary> ''' <returns>String</returns> Public Function GetMovieTagline() As String GetMovieTagline = Me._GetGenericInfo("<h5>Tagline:</h5>", "</div>") End Function ''' <summary> ''' Obter nome do Realizador ''' </summary> ''' <returns>String</returns> Public Function GetMovieDirector() As String GetMovieDirector = Me._GetGenericInfo("<h5>Director:</h5>", "</div") End Function ''' <summary> ''' Obter realizador ''' </summary> ''' <returns>String</returns> Public Function GetMovieWriters() As String Dim writers As String = Me._GetGenericInfo("<h5>Writers:</h5>", "</div>") If String.IsNullOrEmpty(writers) Then writers = Me._GetGenericInfo("<h5>Writers <a href=""/wga"">(WGA)</a>:</h5>", "</div>") End If If String.IsNullOrEmpty(writers) Then writers = Me._GetGenericInfo("<h5>Writer:</h5>", "</div>") End If If String.IsNullOrEmpty(writers) Then writers = Me._GetGenericInfo("<h5>Writer: <a href=""/wga"">(WGA)</a>:</h5>", "</div>") End If GetMovieWriters = writers End Function ''' <summary> ''' Obter plot ''' </summary> ''' <returns>String</returns> Public Function GetMoviePlot() As String GetMoviePlot = Me._GetGenericInfo("<h5>Plot:</h5>", "</div") End Function ''' <summary> ''' Obter duração ''' </summary> ''' <returns>String</returns> Public Function GetMovieRuntime() As String GetMovieRuntime = Me._GetGenericInfo("<h5>Runtime:</h5>", "</div") End Function ''' <summary> ''' Obter introdução do comentário do utilizador ''' </summary> ''' <returns>String</returns> Public Function GetMovieShortUserComment() As String GetMovieShortUserComment = Me._GetGenericInfo("<h5>User Comments:</h5>", "<a") End Function ''' <summary> ''' Obter comentário completo do utilizador ''' </summary> ''' <returns>String</returns> Public Function GetMovieFullUserComment() As String GetMovieFullUserComment = Me._GetGenericInfo("Author:", "<div class=""yn""", True) End Function ''' <summary> ''' Obter link do filme ''' </summary> ''' <returns>String</returns> Public Function GetMovieLink() As String GetMovieLink = String.Format("<a href='{0}' target='_blank'>{0}</a>", Me._movie_url) End Function ''' <summary> ''' Obter data de estreia do filme ''' </summary> ''' <returns>String</returns> Public Function GetMovieYear() As String GetMovieYear = Me._GetGenericInfo("<h5>Release Date:</h5>", "<a") End Function ''' <summary> ''' Obter nota do filme ''' </summary> ''' <returns>String</returns> Public Function GetUserRating() As String GetUserRating = Me._GetGenericInfo("<b>User Rating:</b>", "</small>") End Function ''' <summary> ''' Obter lista de actores com os nomes reais e os nomes da respectiva personagem ''' </summary> ''' <returns>String</returns> Public Function GetCast() As String Dim init_tag_actor As String = "<td class=""nm"">", init_tag_char As String = "<td class=""char"">" Dim end_tag As String = "</td>" Dim aux_str_actor As String = "", aux_str_char As String = "" Dim str As New StringBuilder() Dim cur_pos As Integer = 0, start_at As Integer = 0, end_at As Integer = 0 Dim size_init_tag_actor As Integer = init_tag_actor.Length Dim size_init_tag_char As Integer = init_tag_char.Length While cur_pos <> -1 'obter nome do actor cur_pos = Me._html.IndexOf(init_tag_actor, end_at) aux_str_actor = "" : aux_str_char = "" If cur_pos > -1 Then start_at = cur_pos + size_init_tag_actor end_at = Me._html.IndexOf(end_tag, start_at) aux_str_actor = _StripTags(Me._html.Substring(start_at, (end_at - start_at))) End If 'obter nome da personagem cur_pos = Me._html.IndexOf(init_tag_char, end_at) If cur_pos > -1 Then start_at = cur_pos + size_init_tag_char end_at = Me._html.IndexOf(end_tag, start_at) aux_str_char = _StripTags(Me._html.Substring(start_at, (end_at - start_at))) End If If Not String.IsNullOrEmpty(aux_str_actor) Or Not String.IsNullOrEmpty(aux_str_char) Then str.Append(String.Format("{0} ({1}); ", aux_str_actor, aux_str_char)) End If End While GetCast = str.ToString() End Function ''' <summary> ''' Obter informação genérica ''' </summary> ''' <param name="init_tag">Tag onde começa</param> ''' <param name="end_tag">Tag onde acaba</param> ''' <param name="include_br">Incluir br?</param> ''' <returns>String</returns> Private Function _GetGenericInfo(ByVal init_tag As String, ByVal end_tag As String, Optional ByVal include_br As Boolean = False) As String Dim size_init_tag As Integer = init_tag.Length Dim start_at As Integer = Me._html.IndexOf(init_tag) If start_at = -1 Then Return "" start_at = start_at + size_init_tag Dim end_at As Integer = Me._html.IndexOf(end_tag, start_at) _GetGenericInfo = _StripTags(Me._html.Substring(start_at, (end_at - start_at)), include_br) End Function ''' <summary> ''' Remover e substituir tags html; ''' </summary> ''' <param name="txt">String</param> ''' <returns>String</returns> Private Function _StripTags(ByVal txt As String, Optional ByVal include_br As Boolean = False) As String 'limpar tags, à excepção de <img /> e <a /> 'uniformizar <br/> e converter <p> para <br> Dim str As String = txt.Trim().Replace("<p>", "<br/>").Replace("<br>", "<br/>") Dim strip_tags As String = "b,i,u,title,link,small,p,title,div" Dim splitted_str As String() = strip_tags.Split(New [Char]() {","}) For Each s As String In splitted_str str = str.Replace(String.Format("<{0}>", s), String.Empty) str = str.Replace(String.Format("</{0}>", s), String.Empty) Next 'se o texto terminar com <br/>, remover If str.EndsWith("<br/>") Then str = str.Remove(str.LastIndexOf("<br/>")) 'remover todos os <br/>, caso necessário If include_br = False Then str = str.Replace("<br/>", ". ") 'os links no imdb são relativos, vamos modificá-los para absolutos If str.Contains("<a") Then str = str.Replace("href=""", "href=""" & SoCalledImdbApi._imdb_url) str = str.Replace("<a", "<a target=""_blank"" ") End If 'caso especial da synopsis e ratings Dim aux_str As String = String.Format("{0}synopsis", SoCalledImdbApi._imdb_url) If str.Contains(aux_str) Then str = str.Replace(aux_str, String.Format("{0}synopsis", Me._movie_url)) aux_str = String.Format("{0}ratings", SoCalledImdbApi._imdb_url) If str.Contains(aux_str) Then str = str.Replace(aux_str, String.Format("{0}ratings", Me._movie_url)) ' _StripTags = str End Function ''' <summary> ''' Verificar se o ID do filme é válido ''' </summary> ''' <param name="movie_id"></param> ''' <returns>Boolean</returns> Private Function _IsValid(ByVal movie_id As String) As Boolean _IsValid = Regex.IsMatch(movie_id, "tt[\d]") End Function ''' <summary> ''' Atribuir ID do filme ''' </summary> ''' <remarks></remarks> Private Sub _SetMovieURL() Me._movie_url = String.Format("{0}/title/{1}/", SoCalledImdbApi._imdb_url, MovieID) End Sub End Class
Partial Class _Default Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load End Sub Protected Sub btnFilmViewStats_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnFilmViewStats.Click 'criar objecto imdb api Dim imdb As New SoCalledImdbApi(Me.txtFilmID.Text) FilmPoster.InnerHtml = imdb.GetMoviePoster() lblTitle.Text = imdb.GetMovieTitle() lblRating.Text = imdb.GetUserRating() lblDirector.Text = imdb.GetMovieDirector() lblWriters.Text = imdb.GetMovieWriters() lblCast.Text = imdb.GetCast() lblLanguage.Text = imdb.GetMovieLanguage() lblGenre.Text = imdb.GetMovieGenre() lblYear.Text = imdb.GetMovieYear() lblTagLine.Text = imdb.GetMovieTagline() lblPlot.Text = imdb.GetMoviePlot() lblRuntime.Text = imdb.GetMovieRuntime() lblShortComment.Text = imdb.GetMovieShortUserComment() lblFullComment.Text = imdb.GetMovieFullUserComment() lblLink.Text = imdb.GetMovieLink() End Sub End Class
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" EnableViewState="false" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Diz que é uma espécie de IMDB tiny API?!</title> <link href="StyleSheet.css" rel="stylesheet" type="text/css" /> </head> <body> <form id="form1" runat="server"> <div id="container"> <div id="FilmInfo"> <strong>Titulo: </strong> <asp:Label ID="lblTitle" runat="server"></asp:Label><br /> <strong>Nota: </strong> <asp:Label ID="lblRating" runat="server"></asp:Label><br /> <strong>Realizador: </strong> <asp:Label ID="lblDirector" runat="server"></asp:Label><br /> <strong>Argumentista: </strong> <asp:Label ID="lblWriters" runat="server"></asp:Label><br /> <strong>Actores: </strong> <asp:Label ID="lblCast" runat="server"></asp:Label><br /> <strong>Idioma: </strong> <asp:Label ID="lblLanguage" runat="server"></asp:Label><br /> <strong>Género: </strong> <asp:Label ID="lblGenre" runat="server"></asp:Label><br /> <strong>Data: </strong> <asp:Label ID="lblYear" runat="server"></asp:Label><br /> <strong>Tagline: </strong> <asp:Label ID="lblTagLine" runat="server"></asp:Label><br /> <strong>Enredo: </strong> <asp:Label ID="lblPlot" runat="server"></asp:Label><br /> <strong>Duração: </strong> <asp:Label ID="lblRuntime" runat="server"></asp:Label><br /> <strong>Comentário: </strong> <asp:Label ID="lblShortComment" runat="server"></asp:Label><br /> <strong>Comentário Completo: </strong> <asp:Label ID="lblFullComment" runat="server"></asp:Label><br /> <strong>Link: </strong> <asp:Label ID="lblLink" runat="server"></asp:Label><br /> </div> <div runat="server" id="FilmPoster"></div> </div> <br /> <div id="search"> <asp:TextBox ID="txtFilmID" runat="server"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFilmID" runat="server" ControlToValidate="txtFilmID" Display="Static" ErrorMessage="ID do Filme" SetFocusOnError="True">*</asp:RequiredFieldValidator> <asp:Button ID="btnFilmViewStats" runat="server" Text="Obter Dados" /> </div> </form> </body> </html>