summaryrefslogtreecommitdiffstats
path: root/src/fetch/imdbfetcher.h
blob: e3f7827bf7da40dd1218bd4b60ad2f895ddfface (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/***************************************************************************
    copyright            : (C) 2004-2006 by Robby Stephenson
    email                : robby@periapsis.org
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of version 2 of the GNU General Public License as  *
 *   published by the Free Software Foundation;                            *
 *                                                                         *
 ***************************************************************************/

#ifndef IMDBFETCHER_H
#define IMDBFETCHER_H

#include "fetcher.h"
#include "configwidget.h"
#include "../datavectors.h"

#include <kurl.h>
#include <kio/job.h>

#include <tqcstring.h> // for TQByteArray
#include <tqmap.h>
#include <tqguardedptr.h>

class KLineEdit;
class KIntSpinBox;
class TQCheckBox;
class TQRegExpr;

namespace Tellico {
  namespace Fetch {

/**
 * @author Robby Stephenson
 */
class IMDBFetcher : public Fetcher {
Q_OBJECT
  

public:
  IMDBFetcher(TQObject* parent, const char* name=0);
  /**
   */
  virtual ~IMDBFetcher();

  virtual TQString source() const;
  virtual bool isSearching() const { return m_started; }
  virtual void search(FetchKey key, const TQString& value);
  virtual void continueSearch();
  // imdb can search title, person
  virtual bool canSearch(FetchKey k) const { return k == Title || k == Person; }
  virtual void stop();
  virtual Data::EntryPtr fetchEntry(uint uid);
  virtual Type type() const { return IMDB; }
  virtual bool canFetch(int type) const;
  virtual void readConfigHook(const KConfigGroup& config);

  virtual void updateEntry(Data::EntryPtr entry);

  virtual Fetch::ConfigWidget* configWidget(TQWidget* parent) const;

  static StringMap customFields();

  class ConfigWidget : public Fetch::ConfigWidget {
  public:
    ConfigWidget(TQWidget* parent_, const IMDBFetcher* fetcher = 0);
    virtual void saveConfig(KConfigGroup& config);
    virtual TQString preferredName() const;

  private:
    KLineEdit* m_hostEdit;
    TQCheckBox* m_fetchImageCheck;
    KIntSpinBox* m_numCast;
  };
  friend class ConfigWidget;

  static TQString defaultName();

private slots:
  void slotData(KIO::Job* job, const TQByteArray& data);
  void slotComplete(KIO::Job* job);
  void slotRedirection(KIO::Job* job, const KURL& toURL);

private:
  static void initRegExps();
  static TQRegExp* s_tagRx;
  static TQRegExp* s_anchorRx;
  static TQRegExp* s_anchorTitleRx;
  static TQRegExp* s_anchorNameRx;
  static TQRegExp* s_titleRx;

  void doTitle(const TQString& s, Data::EntryPtr e);
  void doRunningTime(const TQString& s, Data::EntryPtr e);
  void doAspectRatio(const TQString& s, Data::EntryPtr e);
  void doAlsoKnownAs(const TQString& s, Data::EntryPtr e);
  void doPlot(const TQString& s, Data::EntryPtr e, const KURL& baseURL_);
  void doPerson(const TQString& s, Data::EntryPtr e,
                const TQString& imdbHeader, const TQString& fieldName);
  void doCast(const TQString& s, Data::EntryPtr e, const KURL& baseURL_);
  void doLists(const TQString& s, Data::EntryPtr e);
  void doRating(const TQString& s, Data::EntryPtr e);
  void doCover(const TQString& s, Data::EntryPtr e, const KURL& baseURL);

  void parseSingleTitleResult();
  void parseSingleNameResult();
  void parseMultipleTitleResults();
  void parseTitleBlock(const TQString& str);
  void parseMultipleNameResults();
  Data::EntryPtr parseEntry(const TQString& str);

  TQByteArray m_data;
  TQMap<int, Data::EntryPtr> m_entries;
  TQMap<int, KURL> m_matches;
  TQGuardedPtr<KIO::Job> m_job;

  FetchKey m_key;
  TQString m_value;
  bool m_started;
  bool m_fetchImages;

  TQString m_host;
  int m_numCast;
  KURL m_url;
  bool m_redirected;
  uint m_limit;
  TQStringList m_fields;

  TQString m_popularTitles;
  TQString m_exactTitles;
  TQString m_partialTitles;
  enum TitleBlock { Unknown = 0, Popular = 1, Exact = 2, Partial = 3, SinglePerson = 4};
  TitleBlock m_currentTitleBlock;
  int m_countOffset;
};

  } // end namespace
} // end namespace

#endif