First round of tweaks and simplifications to description update job, a=chris

Chris Pollett [2022-11-26 00:Nov:th]
First round of tweaks and simplifications to description update job, a=chris
Filename
src/configs/Createdb.php
src/configs/PublicHelpPages.php
src/controllers/components/CrawlComponent.php
src/controllers/components/SocialComponent.php
src/library/Utility.php
src/library/media_jobs/DescriptionUpdateJob.php
src/library/media_jobs/FeedsUpdateJob.php
src/locale/ar/configure.ini
src/locale/bn/configure.ini
src/locale/de/configure.ini
src/locale/el_GR/configure.ini
src/locale/en_US/configure.ini
src/locale/es/configure.ini
src/locale/fa/configure.ini
src/locale/fr_FR/configure.ini
src/locale/he/configure.ini
src/locale/hi/configure.ini
src/locale/id/configure.ini
src/locale/it/configure.ini
src/locale/ja/configure.ini
src/locale/kn/configure.ini
src/locale/ko/configure.ini
src/locale/nl/configure.ini
src/locale/pl/configure.ini
src/locale/pt/configure.ini
src/locale/ru/configure.ini
src/locale/te/configure.ini
src/locale/th/configure.ini
src/locale/tl/configure.ini
src/locale/tr/configure.ini
src/locale/vi_VN/configure.ini
src/locale/zh_CN/configure.ini
src/views/elements/SearchsourcesElement.php
src/views/elements/WikiElement.php
diff --git a/src/configs/Createdb.php b/src/configs/Createdb.php
index 2414cfb04..36eefce41 100755
--- a/src/configs/Createdb.php
+++ b/src/configs/Createdb.php
@@ -976,11 +976,14 @@ $media_sources = [
         'en-US'],
     ['100000006', 'IMDB', 'description_source', 'video',
         'https://www.imdb.com/find?q=',
-        "Plot | span | data-testid = plot-l\n" .
-        "Genres | a | class = ipc-chip" .
-        "###li | class = find-result-item###" .
-        "a | class = ipc-metadata-list-summary-item__t###" .
-        "a | class = ipc-metadata-list-summary-item__t############" .
+        "Year/Rating | //ul[contains(@data-testid," .
+            "'hero-title-block__metadata')]/li/a\n" .
+        "Plot | //span[contains(@data-testid,'plot-l')]\n" .
+        "Genres | //a[contains(@class,'ipc-chip')]" .
+        "###//li[contains(@class,'find-result-item')]###" .
+        "//a[contains(@class,'pc-metadata-list-summary-item__t')]###" .
+        "//a[contains(@class,'ipc-metadata-list-summary-item__t')]/@href".
+        "############" .
         "Catch me if you can.mp4\n" .
         "Inception.mp4\n" .
         "Wrong Turn.mp4", 'en-US']
diff --git a/src/configs/PublicHelpPages.php b/src/configs/PublicHelpPages.php
index a81f309b4..37dc7f3b3 100644
--- a/src/configs/PublicHelpPages.php
+++ b/src/configs/PublicHelpPages.php
@@ -42957,29 +42957,39 @@ sort=aname
 END_HEAD_VARSThe '''Max Depth''' dropdown is used to limit what urls are allowed to be crawl by the number of hops they are from a seed site. For example, if the Max Depth was set to 2, then seed sites would be crawled, sites linked to seed sites would be crawled, and sites linked to sites linked to seed sites would be crawled. A depth 0 crawl only crawls the seed sites.
 EOD;
 $help_pages["en-US"]["Media_Sources"] = <<< 'EOD'
-page_type=standard
+alternative_path=
+
+author=
+
+default_sort=aname
+
+description=

 page_alias=

 page_border=solid-border

-toc=true
+page_header=

-title=
+page_footer=

-author=
+page_theme=
+
+page_type=standard
+
+properties=

 robots=

-description=
+share_expires=-2

-alternative_path=
+title=

-page_header=
+toc=true

-page_footer=
+url_shortener=

-sort=aname
+update_desc=

 END_HEAD_VARS&#039;&#039;&#039;Media Sources&#039;&#039;&#039; are used to specify how Yioop should handle news feeds, podcast, and trending value sites. The &#039;&#039;&#039;Add Media Source&#039;&#039;&#039; form lets you add new media sources. What this form looks like depends on the &#039;&#039;&#039;Type&#039;&#039;&#039; dropdown chosen. Below we describe the form for each of the possible choices of type:

@@ -43113,6 +43123,26 @@ A &#039;&#039;&#039;Trending value source&#039;&#039;&#039; is a value on a web

 Here there is only one capture group (\d+\.\d+), so searching on trending:stocks, one would see all the hour, weekly, etc values for the trending values with that category. One such row would be Yioop Price whose values would be computed based on the numbers extracted according to this regex&#039;s (\d+\.\d+) capture group.

+&lt;br /&gt;
+
+A &#039;&#039;&#039;Description Source&#039;&#039;&#039; is used to update the description of wiki page resources based on the resource&#039;s name. The &#039;&#039;&#039;Name&#039;&#039;&#039; field is used to give a name to this search source. The &#039;&#039;&#039;URL&#039;&#039;&#039; field is used to provide the url of web page along with any required query parameters in order to look up resource using its name. The &#039;&#039;&#039;Language&#039;&#039;&#039; field is used to specify the locale to be used at search site given they support it. The &#039;&#039;&#039;Mime Type&#039;&#039;&#039; field is used to specify mime type of file format of resources to be processed. The &#039;&#039;&#039;Info Xpaths&#039;&#039;&#039; field is used to specify the details of HTML tags containing the required information to be collected as the description of the resources. The &#039;&#039;&#039;Item Xpath&#039;&#039;&#039; field is used to specify tag name and optionally attribute with value that aids to uniquely identify the HTML elements that completely contain all the details of a single search result, mostly this will be a &lt;tr&gt; tag. The &#039;&#039;&#039;Title Xpath&#039;&#039;&#039; field is used to specify the details of HTML tag within the &#039;&#039;&#039;Item Xpath&#039;&#039;&#039; that contains the text representing the title of search result in the similar format as &#039;&#039;&#039;Item Xpath&#039;&#039;&#039;. The &#039;&#039;&#039;Url Xpath&#039;&#039;&#039; field is used to specify details of HTML tag within &#039;&#039;&#039;Item Xpath&#039;&#039;&#039; that contains the URL of details page about the search result. The &#039;&#039;&#039;Test Values&#039;&#039;&#039; field is used to provide test values to be used while in the test mode of search source. Below is the example of search source for IMDB site
+&lt;pre&gt;
+ Name: IMDB
+ URL: https://www.imdb.com/find?q=
+ Language: English
+ Mime Type: VIDEO
+ Info Xpaths:
+  Year/Rating | //ul[contains(@data-testid,&#039;hero-title-block__metadata&#039;)]/li/a
+  Plot | //span[contains(@data-testid,&#039;plot-l&#039;)]
+  Genres | //a[contains(@class,&#039;ipc-chip&#039;)]
+ Item Xpath: //li[contains(@class,&#039;find-result-item&#039;)]
+ Title Xpath: //a[contains(@class,&#039;pc-metadata-list-summary-item__t&#039;)]
+ Url Xpath: //a[contains(@class,&#039;ipc-metadata-list-summary-item__t&#039;)]/@href
+ Test Values:
+  Brahmastra Part One.mp4
+  House of the Dragon.mp4
+&lt;/pre&gt;
+
 EOD;
 $help_pages["en-US"]["Media_Updater"] = <<< 'EOD'
 page_type=standard
diff --git a/src/controllers/components/CrawlComponent.php b/src/controllers/components/CrawlComponent.php
index b6224452a..f1943ecf7 100644
--- a/src/controllers/components/CrawlComponent.php
+++ b/src/controllers/components/CrawlComponent.php
@@ -2563,10 +2563,10 @@ class CrawlComponent extends Component implements CrawlConstants
             C\ONE_YEAR => tl('crawl_component_one_year')
             ];
         $data['MEDIA_MIME_TYPE'] = [
-            "video" => "VIDEO",
-            "audio" => "AUDIO",
-            "text" => "TEXT",
-            "application" => "APPLICATION"
+            "video" => tl('crawl_component_video'),
+            "audio" => tl('crawl_component_audio'),
+            "text" => tl('crawl_component_text'),
+            "application" => tl('crawl_component_application'),
         ];
         $source_type_flag = false;
         if (isset($_REQUEST['type']) &&
@@ -2745,7 +2745,6 @@ class CrawlComponent extends Component implements CrawlConstants
                         }
                         if (in_array($clean_me, $must_have) &&
                             $r[$clean_me] == "" ) {
-                            echo $clean_me;
                             if (empty($_REQUEST['modify_add'])) {
                                 $_REQUEST['modify_add'] = [];
                                 $request_fields[] = "modify_add";
@@ -3093,10 +3092,9 @@ class CrawlComponent extends Component implements CrawlConstants
                             $wiki_update_job->updatePodcastsOneGo([$source],
                             C\ONE_WEEK, true);
                     } else if ($source['TYPE'] == 'description_source') {
-                        $desc_update_job = new M\DescriptionUpdateJob();
-                        $desc_update_job->
-                            parseDescriptionSourceAuxInfo($source);
-                        $data['FEED_TEST_RESULTS'] = $desc_update_job->
+                        $description_job = new M\DescriptionUpdateJob();
+                        $description_job->parseDescriptionAuxInfo($source);
+                        $data['FEED_TEST_RESULTS'] = $description_job->
                             updateResourcesDescription([$source],
                             test_mode: true);
                     }
diff --git a/src/controllers/components/SocialComponent.php b/src/controllers/components/SocialComponent.php
index 8de687785..c61bdf7fc 100644
--- a/src/controllers/components/SocialComponent.php
+++ b/src/controllers/components/SocialComponent.php
@@ -66,7 +66,8 @@ class SocialComponent extends Component implements CrawlConstants
      * File to tell DescriptionUpdateJob that a wiki resource needs a
      * description
      */
-    const NEEDS_DESC_FILE = C\APP_DIR . "/resources/needs_descriptions.txt";
+    const NEEDS_DESCRIPTION_FILE =
+        C\APP_DIR . "/resources/needs_descriptions.txt";
     /**
      * Used to handle the manage group activity.
      *
@@ -3920,8 +3921,9 @@ EOD;
                 $group_model->getGroupPageResourceUrls($group_id,
                     $data['PAGE_ID'], $sub_path);
             $thumb_folder = $data['RESOURCES_INFO']['thumb_folder'];
-            if (!empty($thumb_folder) && !empty($data["HEAD"]['update_desc'])) {
-                $fp = fopen(self::NEEDS_DESC_FILE, "a");
+            if (!empty($thumb_folder) &&
+                !empty($data["HEAD"]['update_description'])) {
+                $fp = fopen(self::NEEDS_DESCRIPTION_FILE, "a");
                 fwrite($fp, $thumb_folder . "\n");
                 fclose($fp);
             }
@@ -4375,8 +4377,9 @@ EOD;
                         } else {
                             $head_vars[$key] == true;
                         }
-                    } else if ($key == 'update_desc') {
-                        $head_vars[$key] = isset($_REQUEST['update_desc']);
+                    } else if ($key == 'update_description') {
+                        $head_vars[$key] =
+                            isset($_REQUEST['update_description']);
                     }
                 }
                 $head_string = "";
@@ -5080,7 +5083,7 @@ EOD;
             'title' => '',
             'toc' => true,
             'url_shortener' => '',
-            'update_desc' => false
+            'update_description' => false
         ];
        /* Check if back params need to be set. Set them if required.
           the back params are usually sent when the wiki action is initiated
diff --git a/src/library/Utility.php b/src/library/Utility.php
index 1b06072ed..f11938ae5 100755
--- a/src/library/Utility.php
+++ b/src/library/Utility.php
@@ -1143,12 +1143,14 @@ function getDomFromString($to_parse)
     set_error_handler(null);
     $dom = new \DOMDocument("1.0");
     $dom->formatOutput = true;
+        $dom->preserveWhiteSpace = false;
     if (stristr($to_parse, "<html") === false && !empty($to_parse)) {
         @$dom->loadXML($to_parse);
     }
     if ($dom->documentElement == null) {
         $dom = new \DOMDocument("1.0");
         $dom->formatOutput = true;
+        $dom->preserveWhiteSpace = false;
         //this hack modified from php.net
         @$dom->loadHTML('<?xml encoding="UTF-8">' . $to_parse);
         foreach ($dom->childNodes as $item) {
@@ -1166,6 +1168,7 @@ function getDomFromString($to_parse)
             if (!empty($to_parse)) {
                 $dom = new \DOMDocument("1.0");
                 $dom->formatOutput = true;
+                $dom->preserveWhiteSpace = false;
                 @$dom->loadXML($to_parse);
                 if ($dom->documentElement == null) {
                     $dom = new \DOMDocument("1.0");
@@ -1178,6 +1181,50 @@ function getDomFromString($to_parse)
     set_error_handler(C\NS_CONFIGS . "yioop_error_handler");
     return $dom;
 }
+/**
+ * Returns an array of DOMDocuments for the nodes that match an xpath
+ * query on $dom, a DOMDocument
+ *
+ * @param DOMDocument $dom document to run xpath query on
+ * @param string $query xpath query to run
+ * @return array of DOMDocuments one for each node matching the
+ *  xpath query in the original DOMDocument
+ */
+function getTags($dom, $query)
+{
+    $nodes = [];
+    if (is_a($dom, "DOMDocument")) {
+        $dom_xpath = new \DOMXPath($dom);
+        if (!$dom_xpath) {
+            return [];
+        }
+        $tags = $dom_xpath->query($query);
+    }
+    if (empty($tags) || $tags->length == 0) {
+        if(!empty($dom->textContent)) {
+            $redom = new \DOMDocument;
+            @$redom->loadHTML($dom->textContent);
+            $dom_xpath = new \DOMXPath($redom);
+            if (!$dom_xpath) {
+                return [];
+            }
+            $tags = $dom_xpath->query($query);
+        }
+        if (empty($tags) || $tags->length == 0) {
+            return [];
+        }
+    }
+    $i = 0;
+    while ($item = $tags->item($i)) {
+        $tmp_dom = new \DOMDocument;
+        $tmp_dom->formatOutput = true;
+        $node = $tmp_dom->importNode($item, true);
+        $tmp_dom->appendChild($node);
+        $nodes[] = $tmp_dom;
+        $i++;
+    }
+    return $nodes;
+}
 /**
  * Converts a string to string where each char has been replaced by its
  * hexadecimal equivalent
diff --git a/src/library/media_jobs/DescriptionUpdateJob.php b/src/library/media_jobs/DescriptionUpdateJob.php
index 415dc00f5..84b7bc6d9 100644
--- a/src/library/media_jobs/DescriptionUpdateJob.php
+++ b/src/library/media_jobs/DescriptionUpdateJob.php
@@ -22,8 +22,7 @@
  *
  * END LICENSE
  *
- * @author Chris Pollett chris@pollett.org (initial MediaJob class
- *      and subclasses based on work of Pooja Mishra for her master's)
+ * @author Parth Patel (modfied to better use xpaths Chris Pollett)
  * @license https://www.gnu.org/licenses/ GPL3
  * @link https://www.seekquarry.com/
  * @copyright 2009 - 2022
@@ -56,7 +55,8 @@ class DescriptionUpdateJob extends MediaJob
      * File to tell DescriptionUpdateJob that a wiki resource needs a
      * description
      */
-    const NEEDS_DESC_FILE = C\APP_DIR . "/resources/needs_descriptions.txt";
+    const NEEDS_DESCRIPTION_FILE = C\APP_DIR .
+        "/resources/needs_descriptions.txt";
     /**
      * Initializes the last update time to far in the past so, description will
      * get immediately updated. Sets up connection to DB to fetch description
@@ -70,7 +70,7 @@ class DescriptionUpdateJob extends MediaJob
         $db_class = C\NS_DATASOURCES . ucfirst(C\DBMS). "Manager";
         $this->db = new $db_class();
         $this->db->connect();
-        C\nsconddefine("DESCRIPTION_UPDATE_INTERVAL", C\ONE_DAY);
+        C\nsconddefine("DESCRIPTION_UPDATE_INTERVAL", C\ONE_HOUR);
     }
     /**
      * Only update if its been more than a day since the last update
@@ -83,8 +83,8 @@ class DescriptionUpdateJob extends MediaJob
         $time = time();
         $delta = $time - $this->update_time;
         if ($delta > C\DESCRIPTION_UPDATE_INTERVAL &&
-            file_exists(self::NEEDS_DESC_FILE) &&
-            filesize(self::NEEDS_DESC_FILE) > 0) {
+            file_exists(self::NEEDS_DESCRIPTION_FILE) &&
+            filesize(self::NEEDS_DESCRIPTION_FILE) > 0) {
             $this->update_time = $time;
             L\crawlLog("---- Performing resources description update ----");
             return true;
@@ -100,55 +100,30 @@ class DescriptionUpdateJob extends MediaJob
     public function nondistributedTasks()
     {
         $db = $this->db;
-        $sql = "SELECT * FROM MEDIA_SOURCE WHERE (TYPE='description_source')";
+        $sql = "SELECT * FROM MEDIA_SOURCE WHERE TYPE='description_source'";
         $result = $db->execute($sql);
-        $desc_sources = [];
-        while ($desc_source = $db->fetchArray($result)) {
-            $this->parseDescriptionSourceAuxInfo($desc_source);
-            $desc_sources[] = $desc_source;
+        $sources = [];
+        while ($source = $db->fetchArray($result)) {
+            $this->parseDescriptionAuxInfo($source);
+            $sources[] = $source;
         }
-        $this->tasks = $desc_sources;
-        $this->doTasks($desc_sources);
+        $this->tasks = $sources;
+        $this->doTasks($sources);
     }
     /**
-     * Used to fill in details for an associative arrays containing the
-     * details of a description search source which should be used to update
-     * description of resources of wiki pages
+     * Parses out the components of the auxiliary field of a description
+     * source.
      *
-     * @param array &$desc_source after running will contain an associative
-     *  array of details about a particular search source. The input source
-     *  is assumed to have at least the NAME, SOURCE_URL, AUX_INFO, and CATEGORY
-     *  fields filled in.
+     * @param array &source associative array of data about one particular
+     *  description
      */
-    public function parseDescriptionSourceAuxInfo(&$desc_source)
+    public static function parseDescriptionAuxInfo(&$source)
     {
-        $aux_parts = explode("###", $desc_source['AUX_INFO']);
-        list($desc_source['AUX_INFO'], $desc_source['ROW_TAG'],
-            $desc_source['ROW_TITLE'], $desc_source['ROW_URL'], , , ,
-            $desc_source['TEST_DATA']) = $aux_parts;
-        $row_tag_details = explode("|", $desc_source['ROW_TAG']);
-        $title_tag_details = explode("|", $desc_source['ROW_TITLE']);
-        $url_tag_details = explode("|", $desc_source['ROW_URL']);
-        $desc_source['ROW_TAG'] = trim($row_tag_details[0]);
-        if (count($row_tag_details) > 1) {
-            $row_tag_attribute = explode("=", $row_tag_details[1]);
-            $desc_source['ROW_ATTRIBUTE_NAME'] = trim($row_tag_attribute[0]);
-            $desc_source['ROW_ATTRIBUTE_VALUE'] = trim($row_tag_attribute[1]);
-        }
-        $desc_source['ROW_TITLE'] = trim($title_tag_details[0]);
-        if (count($title_tag_details) > 1) {
-            $title_tag_attribute = explode("=", $title_tag_details[1]);
-            $desc_source['TITLE_ATTRIBUTE_NAME'] =
-                trim($title_tag_attribute[0]);
-            $desc_source['TITLE_ATTRIBUTE_VALUE'] =
-                trim($title_tag_attribute[1]);
-        }
-        $desc_source['ROW_URL'] = trim($url_tag_details[0]);
-        if (count($url_tag_details) > 1) {
-            $url_tag_attribute = explode("=", $url_tag_details[1]);
-            $desc_source['URL_ATTRIBUTE_NAME'] = trim($url_tag_attribute[0]);
-            $desc_source['URL_ATTRIBUTE_VALUE'] = trim($url_tag_attribute[1]);
-        }
+        $aux_parts = explode("###", html_entity_decode(
+            $source['AUX_INFO'], ENT_QUOTES));
+        list($source['AUX_INFO'], $source['ITEM_XPATH'],
+            $source['TITLE_XPATH'],$source['URL_XPATH'],
+            , , , $source['TEST_DATA']) = $aux_parts;
     }
     /**
      * For each resource requiring description update, use the description
@@ -159,7 +134,7 @@ class DescriptionUpdateJob extends MediaJob
     public function doTasks($tasks)
     {
         $this->thumb_folder_paths = explode("\n",
-            file_get_contents(self::NEEDS_DESC_FILE));
+            file_get_contents(self::NEEDS_DESCRIPTION_FILE));
         $this->thumb_folder_paths = array_unique($this->thumb_folder_paths);
         if (!is_array($tasks) || !is_array($this->thumb_folder_paths)) {
             L\crawlLog(
@@ -175,28 +150,31 @@ class DescriptionUpdateJob extends MediaJob
             if ($time - $this->update_time >= C\ONE_HOUR) {
                 L\crawlLog("---- Runtime limit exceeded, saving the current " .
                     "state and yielding the processor ----");
-                file_put_contents(self::NEEDS_DESC_FILE, implode(PHP_EOL,
+                file_put_contents(self::NEEDS_DESCRIPTION_FILE, implode(PHP_EOL,
                     $this->thumb_folder_paths));
                 return;
             }
             $this->updateResourcesDescription($tasks, $thumb_folder_path);
             array_shift($this->thumb_folder_paths);
         }
-        file_put_contents(self::NEEDS_DESC_FILE, "");
+        file_put_contents(self::NEEDS_DESCRIPTION_FILE, "");
     }
     /**
-     * Updates the description of given resource by iterating over all the
-     * description sources until found, save the description in file at given
+     * Updates/finds descriptions for resources listed in a
+     * needs_description.txt in a wiki pages thumb subfolder.
+     * It does this by iterating over all configured description search sources
+     * a until a match is found. It then saves the description in file at given
      * resource thumb folder path
      *
-     * @param string $file_path path to sub-folders needs_description.txt file
+     * @param string $thumb_folder_path path to sub-folders
+     *  needs_description.txt file
      * @param array $sources associative array containing details of all search
      *      sources
      * @param boolean $test_mode used to return string in test mode
      * @return string if $test_mode true
      */
-    public function updateResourcesDescription($sources, $thumb_folder_path="",
-        $test_mode = false)
+    public function updateResourcesDescription($sources,
+        $thumb_folder_path = "", $test_mode = false)
     {
         if (!$test_mode && !file_exists($thumb_folder_path)) {
             return false;
@@ -231,12 +209,11 @@ class DescriptionUpdateJob extends MediaJob
             }
             $log_function("Processing $i - $resource_detail", "h3");
             array_shift($resources_detail_copy);
-            $name = $resource_detail;
-            $name = trim(preg_replace('/\s+/', ' ', $name));
-            $mime_type = L\mimeType("$name", true);
-            $mime_type = explode("/", $mime_type)[0];
-            $name = pathinfo($name)['filename'];
-            $name = preg_replace('/\s+/', '_', $name);
+            $resource_name = $resource_detail;
+            $resource_name = trim(preg_replace('/\s+/', ' ', $resource_name));
+            $mime_type = explode("/", L\mimeType($resource_name, true))[0];
+            $resource_name = pathinfo($resource_name)['filename'];
+            $resource_name = preg_replace('/\s+/', '_', $resource_name);
             $max_score = 0;
             $details_page_url = "";
             foreach ($sources as $source) {
@@ -244,49 +221,26 @@ class DescriptionUpdateJob extends MediaJob
                 if ($source['CATEGORY'] == $mime_type) {
                     $log_function("*** Using search source <b>$source_name" .
                         "</b> to find description ***", "p");
-                    $search_page_url = $source['SOURCE_URL'] . $name;
+                    $search_page_url = $source['SOURCE_URL'] . $resource_name;
                     $log_function(" Search Page URL - $search_page_url", "pre");
                     $search_page = FetchUrl::getPage($search_page_url);
                     if (empty($search_page)) {
-                        $log_function("<FONT COLOR='#FF0000'>No search results".
-                        "found for $name</FONT>", "p");
+                        $log_function("<span class='red'>No search results".
+                        "found for $resource_name</span>", "p");
                         continue;
                     }
                     set_error_handler(null);
-                    $dom = new \DOMDocument('1.0');
-                    $dom->preserveWhiteSpace = false;
-                    $dom->formatOutput = true;
-                    @$dom->loadHTML($search_page);
+                    $dom = L\getDomFromString($search_page);
+                    $dom_xpath = new \DOMXPath($dom);
+                    $items = @$dom_xpath->evaluate($source['ITEM_XPATH']);
                     set_error_handler(C\NS_CONFIGS . "yioop_error_handler");
-                    $dom_result_rows = $dom->
-                        getElementsByTagName($source['ROW_TAG']);
-                    foreach ($dom_result_rows as $dom_result_row) {
-                        $process_row = true;
-                        if (isset($source['ROW_ATTRIBUTE_NAME'])) {
-                            $attr_name = $source['ROW_ATTRIBUTE_NAME'];
-                            $attr_value = $source['ROW_ATTRIBUTE_VALUE'];
-                            $process_row = false;
-                            $attr_map = $dom_result_row->attributes;
-                            $attr = $attr_map->getNamedItem($attr_name);
-                            if (!empty($attr)) {
-                                if ($attr_name == "class" &&
-                                    str_contains($attr->nodeValue,
-                                    $attr_value)) {
-                                    $process_row = true;
-                                } else if ($attr->nodeValue == $attr_value){
-                                    $process_row = true;
-                                }
-                            }
-                        }
-                        if ($process_row) {
-                            $processed_result = $this->
-                                processResultRow($dom_result_row,
-                                    $name, $source, $test_mode);
-                            $test_results .= $processed_result[2];
-                            if ($processed_result[0] > $max_score) {
-                                $max_score = $processed_result[0];
-                                $details_page_url = $processed_result[1];
-                            }
+                    foreach ($items as $item) {
+                        $processed_result = $this->processItem($item,
+                            $resource_name, $source, $dom, $test_mode);
+                        $test_results .= $processed_result[2];
+                        if ($processed_result[0] > $max_score) {
+                            $max_score = $processed_result[0];
+                            $details_page_url = $processed_result[1];
                         }
                     }
                     if (!empty($details_page_url)) {
@@ -294,8 +248,8 @@ class DescriptionUpdateJob extends MediaJob
                             "$details_page_url</b>", "pre");
                         $details_page = FetchUrl::getPage($details_page_url);
                         if (empty($details_page)) {
-                            $log_function("<FONT COLOR='#FF0000'>Details page".
-                            " not available</FONT>", "p");
+                            $log_function("<span class='red'>Details page".
+                            " not available</span>", "p");
                             continue;
                         }
                         list($details, $test_info) = $this->getDetails(
@@ -323,23 +277,32 @@ class DescriptionUpdateJob extends MediaJob
         return $test_mode ? $test_results : true;
     }
     /**
-     * Processes the search result row DOM element by extracting title to find
-     * text match score and url of details page
+     * Processes $item, a DOMElement representing a search result for
+     * a description for the wiki resource $name, extracting a title and
+     * url. Form the title a match score with $name is obtained. This score
+     * and url as well as in test mode log messages are returned.
      *
-     * @param $row  DOMNode row DOM element
-     * @param $name The saved name of the resource in a wiki page
-     * @param $source The description source details
-     * @return array $score, $url
+     * @param $item DOMNode representing one possible description search result
+     * @param $name the wiki resource name we are trying to get a description
+     *  of
+     * @param $source the source associative array with information about how
+     *  to extract description from the current dom document and dom  node.
+     * @param $dom DOMDocument of whole document node is from, used in
+     *  creating DOMXpath object for quering $item.
+     * @return array $score, $url, $test_results $score of $item as a likely
+     *  source for a description for the wiki resource $name, $url
+     *  that $item point to with more information, $test_results log messages
+     *  if in test mode.
      */
-    public function processResultRow($row, $name, $source, $test_mode = false)
+    public function processItem($item, $name, $source, $dom, $test_mode = false)
     {
-        if (!$row->hasChildNodes()) {
+        if (!$item->hasChildNodes()) {
             return [0, null, ""];
         }
         $test_results = "";
         $log_function = function ($msg, $log_tag = "div class='source-test'")
             use (&$test_results, $test_mode) {
-            $close_tag= preg_split("/\s+/",$log_tag)[0];
+            $close_tag = preg_split("/\s+/",$log_tag)[0];
             if ($test_mode) {
                 $test_results .=
                     "<$log_tag style='overflow-x: scroll;'>$msg</$close_tag>\n";
@@ -347,91 +310,34 @@ class DescriptionUpdateJob extends MediaJob
                 L\crawlLog($msg);
             }
         };
-        $log_function("*** Processing the result row ***", "p");
-        $dom_child_nodes = $row->childNodes;
+        $log_function("*** Processing item ***", "p");
+        $dom_xpath = new \DOMXPath($dom);
         $title = "";
-        $url = "";
-        $processed_data = [];
-        foreach ($dom_child_nodes as $child) {
-            $this->processChildNode($child, $source, $processed_data);
-            if (isset($processed_data['TITLE']) &&
-                isset($processed_data['URL'])) {
-                $name = mb_strtolower($name);
-                $title = trim(mb_strtolower($processed_data['TITLE']));
-                similar_text($name, $title, $score);
-                $url_parts = parse_url($source['SOURCE_URL']);
-                $base_url = $url_parts['scheme']."://".$url_parts['host'];
-                $absolute_url = UrlParser::canonicalLink(
-                        $processed_data['URL'], $base_url);
-                $log_function(" <b>Title:</b> $title", "pre");
-                $log_function(" <b>URL:</b> $absolute_url", "pre");
-                $log_function(" <b>Title Match Percentage:</b> $score", "pre");
-                return [$score, $absolute_url, $test_results];
-            }
+        if ($source['TITLE_XPATH'][0] == "/") {
+            $source['TITLE_XPATH'] = "." . $source['TITLE_XPATH'];
         }
-        return [0, null, $test_results];
-    }
-    /**
-     * Recursively process all the element and its child elements untill matches
-     * title or url tag of source
-     *
-     * @param $child_node DOMNode to be processed
-     * @param $source Description source details
-     * @param &$processed_data array to store title and url values if found
-     * @return array $title, $url if the matching tags found
-     */
-    public function processChildNode($node, $source, &$processed_data)
-    {
-        if ($node->hasChildNodes()) {
-            foreach ($node->childNodes as $child_node) {
-                $this->processChildNode($child_node, $source, $processed_data);
-            }
+        $title_nodes = @$dom_xpath->evaluate($source['TITLE_XPATH'], $item);
+        if (!empty($title_nodes) && !empty($title_nodes->item(0))) {
+            $title = trim(mb_strtolower($title_nodes->item(0)->textContent));
+            similar_text($name, $title, $score);
         }
-        $tag = $node->nodeName;
-        $attr_map = $node->attributes;
-        if ($tag == $source['ROW_TITLE']) {
-            if (isset($source['TITLE_ATTRIBUTE_NAME']) && !empty($attr_map)) {
-                $attr_name = $source['TITLE_ATTRIBUTE_NAME'];
-                $attr_value = $source['TITLE_ATTRIBUTE_VALUE'];
-                $attr = $attr_map->getNamedItem($attr_name);
-                if (!empty($attr_node) &&
-                    $attr_node->nodeValue == $source['TITLE_ATTRIBUTE_VALUE']) {
-                    $processed_data['TITLE'] = $node->textContent;
-                }
-                if (!empty($attr)) {
-                    if ($attr_name == "class" &&
-                        str_contains($attr->nodeValue,
-                        $attr_value)) {
-                        $processed_data['TITLE'] = $node->textContent;
-                    } else if ($attr->nodeValue == $attr_value){
-                        $processed_data['TITLE'] = $node->textContent;
-                    }
-                }
-            } else if (!isset($source['TITLE_ATTRIBUTE_NAME'])) {
-                $processed_data['TITLE'] = $node->textContent;
-            }
+        if ($source['URL_XPATH'][0] == "/") {
+            $source['URL_XPATH'] = "." . $source['URL_XPATH'];
         }
-        if ($tag == $source['ROW_URL']) {
-            if (isset($source['URL_ATTRIBUTE_NAME']) && !empty($attr_map)) {
-                $attr_name = $source['URL_ATTRIBUTE_NAME'];
-                $attr_value = $source['URL_ATTRIBUTE_VALUE'];
-                $attr = $attr_map->getNamedItem($attr_name);
-                if (!empty($attr)) {
-                    if ($attr_name == "class" &&
-                        str_contains($attr->nodeValue,
-                        $attr_value)) {
-                        $processed_data['URL'] = $attr_map->
-                            getNamedItem("href")?->nodeValue;
-                    } else if ($attr->nodeValue == $attr_value){
-                        $processed_data['URL'] = $attr_map->
-                            getNamedItem("href")?->nodeValue;
-                    }
-                }
-            } else if (!isset($source['URL_ATTRIBUTE_NAME'])) {
-                $processed_data['URL'] = $attr_map->
-                    getNamedItem("href")?->nodeValue;
-            }
+        $url_nodes = @$dom_xpath->evaluate($source['URL_XPATH'], $item);
+        $url_parts = parse_url($source['SOURCE_URL']);
+        $base_url = $url_parts['scheme']."://".$url_parts['host'];
+        if (!empty($url_nodes) && !empty($url_nodes->item(0))) {
+            $url = $url_nodes->item(0)->textContent;
+            $url = UrlParser::canonicalLink($url, $base_url);
         }
+        if (!empty($title) && !empty($url)) {
+            $log_function(" <b>Title:</b> $title", "pre");
+            $log_function(" <b>URL:</b> $url", "pre");
+            $log_function(" <b>Title Match Percentage:</b> $score", "pre");
+            return [$score, $url, $test_results];
+        }
+        return [0, null, $test_results];
     }
     /**
      * Fetches the details on the url page using the xpaths
@@ -455,67 +361,40 @@ class DescriptionUpdateJob extends MediaJob
             }
         };
         set_error_handler(null);
-        $dom = new \DOMDocument('1.0');
-        $dom->preserveWhiteSpace = false;
-        $dom->formatOutput = true;
-        @$dom->loadHTML($page);
+        $dom = L\getDomFromString($page);
         $details = "";
         set_error_handler(C\NS_CONFIGS . "yioop_error_handler");
         if (empty($dom)) {
-            $log_function("<FONT COLOR='#FF0000'>Error creating DOM</FONT>",
+            $log_function("<span class='red'>Error creating DOM</span>",
                 "pre");
             return $details;
         }
-        $aux_info = explode("\n", $source['AUX_INFO']);
+        $detail_items = explode("\n", $source['AUX_INFO']);
         $details = "";
-        foreach ($aux_info as $info) {
+        foreach ($detail_items as $detail_item) {
             $info_found = false;
             $sub_details = "";
-            list($header, $tag, $attr_detail) = explode("|", $info);
-            $header = trim($header);
-            $tag = trim($tag);
-            list($attr_name, $attr_value) = explode("=", trim($attr_detail));
-            if (!empty($tag)) {
-                $attr_name = trim($attr_name);
-                $attr_value = trim($attr_value);
-                $log_function("*** Fetching <b>$header</b> ***", "p");
-                $nodes = $dom->getElementsByTagName($tag);
-                if (!empty($nodes)) {
-                    foreach ($nodes as $node) {
-                        if (!empty($attr_name) && !empty($attr_value)) {
-                            if ($node->hasAttributes()) {
-                                $attr_map = $node->attributes;
-                                $attr = $attr_map->getNamedItem($attr_name);
-                                if (!empty($attr)) {
-                                    if ($attr_name == "class" &&
-                                        str_contains($attr->nodeValue,
-                                        $attr_value)) {
-                                        $sub_details .= trim(
-                                            preg_replace('/\s+/',
-                                            ' ', $node->nodeValue)) . "\n";
-                                        $info_found = true;
-                                    } else if ($attr->nodeValue == $attr_value){
-                                        $sub_details .= trim(
-                                            preg_replace('/\s+/',
-                                            ' ', $node->nodeValue)) . "\n";
-                                        $info_found = true;
-                                    }
-                                }
-                            }
-                        } else {
-                            $sub_details .= trim(preg_replace('/\s+/', ' ',
-                                $node->nodeValue)) . "\n";
-                        }
+            list($detail_name, $detail_xpath, ) = explode("|", $detail_item);
+            $detail_name = trim($detail_name);
+            $dom_xpath = new \DOMXPath($dom);
+            $detail_nodes = @$dom_xpath->evaluate($detail_xpath);
+            if (!empty($detail_nodes)) {
+                foreach ($detail_nodes as $detail_node) {
+                    if (!empty($detail_node->nodeValue)) {
+                        $sub_details .= trim(preg_replace('/\s+/', ' ',
+                            $detail_node->nodeValue)) . "\n";
+                        $info_found = true;
                     }
                 }
-                if (!$info_found) {
-                    $log_function("<FONT COLOR='#FF0000'>Could not fetch value".
-                        " for <b>$header</b></FONT>", "pre");
-                } else {
-                    $details .= "$header\n" . $sub_details;
-                }
+            }
+            if (!$info_found) {
+                $log_function("<span class='red'>Could not fetch value".
+                    " for <b>$detail_name</b></span>", "pre");
+            } else {
+                $details .= "\n$detail_name\n".
+                str_pad("",strlen($detail_name), "-")."\n" . $sub_details;
             }
         }
-        return [$details, $test_results];
+        return [wordwrap($details), $test_results];
     }
 }
diff --git a/src/library/media_jobs/FeedsUpdateJob.php b/src/library/media_jobs/FeedsUpdateJob.php
index f3ab90b1b..34367ce0a 100644
--- a/src/library/media_jobs/FeedsUpdateJob.php
+++ b/src/library/media_jobs/FeedsUpdateJob.php
@@ -440,7 +440,7 @@ class FeedsUpdateJob extends MediaJob
             if ($is_html) {
                 $query = $feed['CHANNEL_PATH'];
                 $query = preg_replace("/script/u", "hscript", $query);
-                $sub_dom = $this->getTags($dom, $query);
+                $sub_dom = L\getTags($dom, $query);
                 if (!$sub_dom) {
                     $log_function("----... Scraper couldn't parse channel".
                         " path so bailing on this feed.", "h3");
@@ -450,7 +450,7 @@ class FeedsUpdateJob extends MediaJob
                 }
                 $query = $feed['ITEM_PATH'];
                 $query = preg_replace("/script/u", "hscript", $query);
-                $nodes = $this->getTags($sub_dom[0], $query);
+                $nodes = L\getTags($sub_dom[0], $query);
                 $item_elements = ["title" => $feed['TITLE_PATH'],
                     "description" => $feed['DESCRIPTION_PATH'],
                     "link" => $feed['LINK_PATH']];
@@ -521,7 +521,7 @@ class FeedsUpdateJob extends MediaJob
                         continue;
                     }
                     if ($is_html) {
-                        $tag_nodes = $this->getTags($node, $feed_element);
+                        $tag_nodes = L\getTags($node, $feed_element);
                         if (!isset($tag_nodes[0])) {
                             $tag_node = null;
                         } else {
@@ -657,48 +657,6 @@ class FeedsUpdateJob extends MediaJob
         }
         return ($test_mode) ? $test_results : true;
     }
-    /**
-     * Returns an array of DOMDocuments for the nodes that match an xpath
-     * query on $dom, a DOMDocument
-     *
-     * @param DOMDocument $dom document to run xpath query on
-     * @param string $query xpath query to run
-     * @return array of DOMDocuments one for each node matching the
-     *  xpath query in the original DOMDocument
-     */
-    public function getTags($dom, $query)
-    {
-        $nodes = [];
-        $dom_xpath = new \DOMXPath($dom);
-        if (!$dom_xpath) {
-            return [];
-        }
-        $tags = $dom_xpath->query($query);
-        if (empty($tags) || $tags->length == 0) {
-            if(!empty($dom->textContent)) {
-                $redom = new \DOMDocument;
-                @$redom->loadHTML($dom->textContent);
-                $dom_xpath = new \DOMXPath($dom);
-                if (!$dom_xpath) {
-                    return [];
-                }
-                $tags = $dom_xpath->query($query);
-            }
-            if (empty($tags) || $tags->length == 0) {
-                return [];
-            }
-        }
-        $i = 0;
-        while ($item = $tags->item($i)) {
-            $tmp_dom = new \DOMDocument;
-            $tmp_dom->formatOutput = true;
-            $node = $tmp_dom->importNode($item, true);
-            $tmp_dom->appendChild($node);
-            $nodes[] = $tmp_dom;
-            $i++;
-        }
-        return $nodes;
-    }
     /**
      * Helper method for addFoundItemsPartitionIndex(). Checks if the current
      * shard is full or not and adds items to it.
@@ -824,7 +782,6 @@ class FeedsUpdateJob extends MediaJob
         $this->found_items[] = $out_item;
         return true;
     }
-
     /**
      * Converts the results of an associative array coming from a
      * json_decode'd string to an HTML string where the json field
diff --git a/src/locale/ar/configure.ini b/src/locale/ar/configure.ini
index f0e939cbc..7c45325d3 100755
--- a/src/locale/ar/configure.ini
+++ b/src/locale/ar/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "يوم واحد"
 crawl_component_one_week = "أسبوع واحد"
 crawl_component_one_month = "شهر واحد"
 crawl_component_one_year = "سنة واحدة"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "مؤشر/ميكس للاستخدام"
 crawl_component_trend_category = "الاتجاه الفئة"
 crawl_component_index = "مؤشر"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url مسارات Xpath:"
 searchsources_element_link_xpath_text = "تحميل Xpath:"
 searchsources_element_trend_category_group = "المجموعة ضمن الفئة:"
 searchsources_element_trending_regex = "الاتجاه قيمة Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "مصادر إعلامية"
 searchsources_element_subsearches = "سوبسيرتشيس الحالي"
diff --git a/src/locale/bn/configure.ini b/src/locale/bn/configure.ini
index 5017a668f..c8749b09f 100755
--- a/src/locale/bn/configure.ini
+++ b/src/locale/bn/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "এক দিন"
 crawl_component_one_week = "এক সপ্তাহ"
 crawl_component_one_month = "এক মাস"
 crawl_component_one_year = "এক বছর"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "সূচী/মিশ্রণ ব্যবহার করতে"
 crawl_component_trend_category = "প্রবণতা বিভাগ"
 crawl_component_index = "সূচক"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url XPaths:"
 searchsources_element_link_xpath_text = "ডাউনলোড Xpath:"
 searchsources_element_trend_category_group = "গ্রুপ মধ্যে বিভাগ:"
 searchsources_element_trending_regex = "প্রবণতা মান Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "মিডিয়া উত্স"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/de/configure.ini b/src/locale/de/configure.ini
index a656c24c8..8d6080210 100755
--- a/src/locale/de/configure.ini
+++ b/src/locale/de/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "Eines Tages"
 crawl_component_one_week = "Eine Woche"
 crawl_component_one_month = "Einen Monat"
 crawl_component_one_year = "Ein Jahr"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "Index/Mix zu Verwenden"
 crawl_component_trend_category = "Trend Kategorie"
 crawl_component_index = "Index"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux-Url XPaths:"
 searchsources_element_link_xpath_text = "Download Xpath:"
 searchsources_element_trend_category_group = "Gruppe Innerhalb Der Kategorie:"
 searchsources_element_trending_regex = "Trend Wert-Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "Media-Quellen"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/el_GR/configure.ini b/src/locale/el_GR/configure.ini
index 897d2781a..fc7679aad 100644
--- a/src/locale/el_GR/configure.ini
+++ b/src/locale/el_GR/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "Μία Ημέρα"
 crawl_component_one_week = "Μία Εβδομάδα"
 crawl_component_one_month = "Έναν Μήνα"
 crawl_component_one_year = "Ένα Έτος"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "Προεπιλεγμένο ευρετήριο"
 crawl_component_trend_category = "Κατηγορία τάσης"
 crawl_component_index = "Δείκτης"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "XPaths Βοηθητικού Url:"
 searchsources_element_link_xpath_text = "Κατέβασμα Xpath:"
 searchsources_element_trend_category_group = "Ομάδα εντός κατηγορίας:"
 searchsources_element_trending_regex = "Regex τιμής τάσης:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "Πηγές Media"
 searchsources_element_subsearches = "Υποαναζητήσεις"
diff --git a/src/locale/en_US/configure.ini b/src/locale/en_US/configure.ini
index 1f87ccc45..5944cf6dc 100644
--- a/src/locale/en_US/configure.ini
+++ b/src/locale/en_US/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "One Day"
 crawl_component_one_week = "One Week"
 crawl_component_one_month = "One Month"
 crawl_component_one_year = "One Year"
+crawl_component_video = "Video"
+crawl_component_audio = "Audio"
+crawl_component_text = "Text"
+crawl_component_application = "Application"
 crawl_component_sources_indexes = "Default Index"
 crawl_component_trend_category = "Trend Category"
 crawl_component_index = "Index"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url XPaths:"
 searchsources_element_link_xpath_text = "Download Xpath:"
 searchsources_element_trend_category_group = "Group Within Category:"
 searchsources_element_trending_regex = "Trend Value Regex:"
-searchsources_element_info_tags = "Required Info Tag:"
-searchsources_element_list_row_tag = "List Row Tag:"
-searchsources_element_row_title_tag = "Row Title Tag:"
-searchsources_element_row_url_tag = "Row URL Tag:"
+searchsources_element_info_xpaths = "Info Xpaths"
+searchsources_element_item_xpath = "Item Xpath"
+searchsources_element_title_xpath = "Title Xpath"
+searchsources_element_url_xpath = "Url Xpath"
 searchsources_element_test_values = "Test Values:"
 searchsources_element_media_sources = "Media Sources"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/es/configure.ini b/src/locale/es/configure.ini
index 1ad409a85..c85d70b1d 100755
--- a/src/locale/es/configure.ini
+++ b/src/locale/es/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "Un D&iacute;a"
 crawl_component_one_week = "Una Semana"
 crawl_component_one_month = "Un Mes"
 crawl_component_one_year = "Un A&ntilde;o"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "&Iacute;ndice/Mezcla a Utilizar"
 crawl_component_trend_category = "La Tendencia De La Categor&iacute;a"
 crawl_component_index = "&Iacute;ndice"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url Xpath:"
 searchsources_element_link_xpath_text = "Descargar Xpath:"
 searchsources_element_trend_category_group = "Grupo Dentro De La Categor&iacute;a:"
 searchsources_element_trending_regex = "El Valor De Tendencia Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "Fuentes De Medios De Comunicaci&oacute;n"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/fa/configure.ini b/src/locale/fa/configure.ini
index 74119f0a7..05f77ec58 100755
--- a/src/locale/fa/configure.ini
+++ b/src/locale/fa/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "یک روز"
 crawl_component_one_week = "یک هفته"
 crawl_component_one_month = "یک ماه"
 crawl_component_one_year = "یک سال"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "نمایه/ترکیب مورد استفاده"
 crawl_component_trend_category = "روند دسته"
 crawl_component_index = "شاخص"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url XPaths:"
 searchsources_element_link_xpath_text = "دانلود Xpath:"
 searchsources_element_trend_category_group = "گروه در دسته:"
 searchsources_element_trending_regex = "روند ارزش عبارت منظم:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "منابع رسانه"
 searchsources_element_subsearches = "زیرجستجوهای فعلی"
diff --git a/src/locale/fr_FR/configure.ini b/src/locale/fr_FR/configure.ini
index 6123cb6ca..d96dc9eac 100755
--- a/src/locale/fr_FR/configure.ini
+++ b/src/locale/fr_FR/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "Un jour"
 crawl_component_one_week = "Une semaine"
 crawl_component_one_month = "Un mois"
 crawl_component_one_year = "Un an"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "Index/M&eacute;lange &agrave; utiliser"
 crawl_component_trend_category = "La Tendance De La Cat&eacute;gorie"
 crawl_component_index = "Index"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux URL des requ&ecirc;tes Xpath:"
 searchsources_element_link_xpath_text = "T&eacute;l&eacute;charger Xpath:"
 searchsources_element_trend_category_group = "Groupe Au Sein De La Cat&eacute;gorie:"
 searchsources_element_trending_regex = "La Tendance De La Valeur De La Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "Les sources des m&eacute;dias"
 searchsources_element_subsearches = "Sous-recherches"
diff --git a/src/locale/he/configure.ini b/src/locale/he/configure.ini
index 501bf8ac2..a0bd0a5e6 100755
--- a/src/locale/he/configure.ini
+++ b/src/locale/he/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "יום אחד"
 crawl_component_one_week = "שבוע"
 crawl_component_one_month = "חודש אחד"
 crawl_component_one_year = "שנה אחת"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "מדד/לערבב להשתמש"
 crawl_component_trend_category = "מגמה קטגוריה"
 crawl_component_index = "מדד"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url XPaths:"
 searchsources_element_link_xpath_text = "הורד Xpath:"
 searchsources_element_trend_category_group = "קבוצה בתוך קטגוריה זו:"
 searchsources_element_trending_regex = "מגמה ערך Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "מקורות מדיה"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/hi/configure.ini b/src/locale/hi/configure.ini
index 322655b24..20967660c 100755
--- a/src/locale/hi/configure.ini
+++ b/src/locale/hi/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "एक दिन"
 crawl_component_one_week = "एक सप्ताह"
 crawl_component_one_month = "एक महीने"
 crawl_component_one_year = "एक वर्ष"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "सूचकांक/मिश्रण का उपयोग करने के लिए"
 crawl_component_trend_category = "प्रवृत्ति श्रेणी"
 crawl_component_index = "सूचकांक"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux यूआरएल XPaths:"
 searchsources_element_link_xpath_text = "डाउनलोड Xpath:"
 searchsources_element_trend_category_group = "समूह के भीतर श्रेणी:"
 searchsources_element_trending_regex = "प्रवृत्ति मूल्य Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "मीडिया स्रोतों"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/id/configure.ini b/src/locale/id/configure.ini
index ee6dd221b..bd17a0326 100755
--- a/src/locale/id/configure.ini
+++ b/src/locale/id/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "Satu Hari"
 crawl_component_one_week = "Satu Minggu"
 crawl_component_one_month = "Satu Bulan"
 crawl_component_one_year = "Satu Tahun"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "Indeks/Campuran untuk Menggunakan"
 crawl_component_trend_category = "Tren Kategori"
 crawl_component_index = "Indeks"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url XPaths:"
 searchsources_element_link_xpath_text = "Download Xpath:"
 searchsources_element_trend_category_group = "Kelompok Dalam Kategori:"
 searchsources_element_trending_regex = "Tren Nilai Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "Sumber-Sumber Media"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/it/configure.ini b/src/locale/it/configure.ini
index 67d4c7081..ce186e0af 100755
--- a/src/locale/it/configure.ini
+++ b/src/locale/it/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "Un Giorno"
 crawl_component_one_week = "Una Settimana"
 crawl_component_one_month = "Un Mese"
 crawl_component_one_year = "Un Anno"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "Indice/Mix da Usare"
 crawl_component_trend_category = "Tendenza Categoria"
 crawl_component_index = "Indice"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url Xpath:"
 searchsources_element_link_xpath_text = "Scarica Xpath:"
 searchsources_element_trend_category_group = "Gruppo All&#039;Interno Della Categoria:"
 searchsources_element_trending_regex = "Valore Di Tendenza Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "Fonti Multimediali"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/ja/configure.ini b/src/locale/ja/configure.ini
index 711a84cb8..06f25fe4d 100755
--- a/src/locale/ja/configure.ini
+++ b/src/locale/ja/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "一日"
 crawl_component_one_week = "一週間"
 crawl_component_one_month = "一ヶ月"
 crawl_component_one_year = "一年"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "デスクトップミックスの使用"
 crawl_component_trend_category = "基調カテゴリ"
 crawl_component_index = "Index"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url XPaths:"
 searchsources_element_link_xpath_text = "ダウンロードXpath:"
 searchsources_element_trend_category_group = "グループカテゴリ:"
 searchsources_element_trending_regex = "流値Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "メディア源"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/kn/configure.ini b/src/locale/kn/configure.ini
index 98d9de6b1..c6ca9c45a 100755
--- a/src/locale/kn/configure.ini
+++ b/src/locale/kn/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "ಒಂದು ದಿನ"
 crawl_component_one_week = "ಒಂದು ವಾರ"
 crawl_component_one_month = "ಒಂದು ತಿಂಗಳ"
 crawl_component_one_year = "ಒಂದು ವರ್ಷದ"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "ಸೂಚ್ಯಂಕ/ಮಿಶ್ರಣ ಬಳಸಲು"
 crawl_component_trend_category = "ಪ್ರವೃತ್ತಿ ವರ್ಗ"
 crawl_component_index = "ಸೂಚ್ಯಂಕ"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url XPaths:"
 searchsources_element_link_xpath_text = "ಡೌನ್ಲೋಡ್ Xpath:"
 searchsources_element_trend_category_group = "ಗುಂಪು ಒಳಗೆ ವರ್ಗ:"
 searchsources_element_trending_regex = "ಪ್ರವೃತ್ತಿ ಮೌಲ್ಯ ರಿಜೆಕ್ಸ್:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "ಮಾಧ್ಯಮ ಮೂಲಗಳು"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/ko/configure.ini b/src/locale/ko/configure.ini
index 360519160..2d5439816 100755
--- a/src/locale/ko/configure.ini
+++ b/src/locale/ko/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "일일"
 crawl_component_one_week = "일주일"
 crawl_component_one_month = "한 달"
 crawl_component_one_year = "One Year"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "Index/혼합 사용"
 crawl_component_trend_category = "추 카테고리"
 crawl_component_index = "Index"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url Xpath:"
 searchsources_element_link_xpath_text = "다운로드 Xpath:"
 searchsources_element_trend_category_group = "그룹 내에서 카테고리:"
 searchsources_element_trending_regex = "추 값 Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "미디어 소스"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/nl/configure.ini b/src/locale/nl/configure.ini
index 0cad2b0d8..156de816f 100644
--- a/src/locale/nl/configure.ini
+++ b/src/locale/nl/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "Op Een Dag"
 crawl_component_one_week = "Een Week"
 crawl_component_one_month = "Een Maand"
 crawl_component_one_year = "&Eacute;&eacute;n Jaar"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "Index / Mix te gebruiken"
 crawl_component_trend_category = "Trend Categorie"
 crawl_component_index = "Index"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url XPaths:"
 searchsources_element_link_xpath_text = "Download Xpath:"
 searchsources_element_trend_category_group = "Groep Binnen Een Categorie:"
 searchsources_element_trending_regex = "Trend Waarde Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "media Bronnen"
 searchsources_element_subsearches = "huidige Subsearches"
diff --git a/src/locale/pl/configure.ini b/src/locale/pl/configure.ini
index 57011b176..8e3c52108 100755
--- a/src/locale/pl/configure.ini
+++ b/src/locale/pl/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "Jeden Dzień"
 crawl_component_one_week = "Tydzień"
 crawl_component_one_month = "Jeden Miesiąc"
 crawl_component_one_year = "Jeden Rok"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "Indeks/mieszanka używać"
 crawl_component_trend_category = "Kategoria Trend "
 crawl_component_index = "Indeks"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Pomocniczy Język XPath Adres URL:"
 searchsources_element_link_xpath_text = "Pobierz Na XPath:"
 searchsources_element_trend_category_group = "Grupy Kategorii:"
 searchsources_element_trending_regex = "Tendencja Wartość Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "Źr&oacute;dła MEDI&Oacute;W "
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/pt/configure.ini b/src/locale/pt/configure.ini
index 909712daa..ee26c9bb3 100755
--- a/src/locale/pt/configure.ini
+++ b/src/locale/pt/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "Um Dia"
 crawl_component_one_week = "Uma Semana"
 crawl_component_one_month = "Um M&ecirc;s"
 crawl_component_one_year = "Um Ano"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "&Iacute;ndice/Mix Usar"
 crawl_component_trend_category = "Tend&ecirc;ncia Categoria"
 crawl_component_index = "&Iacute;ndice de"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url Xpath:"
 searchsources_element_link_xpath_text = "Download Xpath:"
 searchsources_element_trend_category_group = "Grupo Dentro Da Categoria:"
 searchsources_element_trending_regex = "Valor De Tend&ecirc;ncia Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "Fontes De M&iacute;dia"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/ru/configure.ini b/src/locale/ru/configure.ini
index d38a5bc2e..50c8b930d 100755
--- a/src/locale/ru/configure.ini
+++ b/src/locale/ru/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "Один День"
 crawl_component_one_week = "Одну Неделю"
 crawl_component_one_month = "Один Месяц"
 crawl_component_one_year = "Один Год"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "Индекс/смесь использовать"
 crawl_component_trend_category = "Категория Тренд "
 crawl_component_index = "Индекс"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Вспомогательный Язык X
 searchsources_element_link_xpath_text = "Скачать По XPath:"
 searchsources_element_trend_category_group = "Группы В Категории:"
 searchsources_element_trending_regex = "Тенденция Значение Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "Источники СМИ "
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/te/configure.ini b/src/locale/te/configure.ini
index 76d5ccb87..ec403579a 100644
--- a/src/locale/te/configure.ini
+++ b/src/locale/te/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "ఒక రోజు"
 crawl_component_one_week = "ఒక వారం"
 crawl_component_one_month = "ఒక నెల"
 crawl_component_one_year = "ఒక సంవత్సరం"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "సూచిక/మిక్స్ ఉపయోగించడానికి"
 crawl_component_trend_category = "ధోరణి వర్గం"
 crawl_component_index = "ఇండెక్స్"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url XPaths:"
 searchsources_element_link_xpath_text = "డౌన్లోడ్ Xpath:"
 searchsources_element_trend_category_group = "గ్రూప్ లోపల వర్గం:"
 searchsources_element_trending_regex = "ధోరణి విలువ Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "మీడియా వర్గాలు"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/th/configure.ini b/src/locale/th/configure.ini
index 31e219c4f..0e921861d 100755
--- a/src/locale/th/configure.ini
+++ b/src/locale/th/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "วันหนึ่ง"
 crawl_component_one_week = "หนึ่งสัปดาห์"
 crawl_component_one_month = "หนึ่งเดือน"
 crawl_component_one_year = "หนึ่งปี"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "ดัชนี/ผสมที่จะใช้"
 crawl_component_trend_category = "นนี้กระแสความนิยมหมวดหมู่"
 crawl_component_index = "ดัชนี"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "A Button On A Remote Control อยู่
 searchsources_element_link_xpath_text = "ดาวน์โหลด Xpath:"
 searchsources_element_trend_category_group = "กลุ่มภายในหมวดหมู่:"
 searchsources_element_trending_regex = "นนี้กระแสความนิยมค่า Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "ส่วนขยายแฟ้มของแหล่ง"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/tl/configure.ini b/src/locale/tl/configure.ini
index 8bf771495..513afb7b8 100644
--- a/src/locale/tl/configure.ini
+++ b/src/locale/tl/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "Isang Araw"
 crawl_component_one_week = "Isang Linggo"
 crawl_component_one_month = "Isang Buwan"
 crawl_component_one_year = "Isang Taon"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "Index/Mix upang Gamitin"
 crawl_component_trend_category = "Trend Na Kategorya"
 crawl_component_index = "Index"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url XPaths:"
 searchsources_element_link_xpath_text = "I-Download Xpath:"
 searchsources_element_trend_category_group = "Grupo Sa Loob Ng Kategorya:"
 searchsources_element_trending_regex = "Trend Na Halaga Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "Pinagmumulan Ng Media"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/tr/configure.ini b/src/locale/tr/configure.ini
index 82a2b4801..f05f72e34 100755
--- a/src/locale/tr/configure.ini
+++ b/src/locale/tr/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "Bir G&uuml;n"
 crawl_component_one_week = "Bir Hafta"
 crawl_component_one_month = "Bir Ay"
 crawl_component_one_year = "Bir Yıl"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "Dizin/Karışım Kullanmak "
 crawl_component_trend_category = "Trend Kategori"
 crawl_component_index = "Endeksi"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url XPaths:"
 searchsources_element_link_xpath_text = "İndir Xpath:"
 searchsources_element_trend_category_group = "Kategori İ&ccedil;inde Grup:"
 searchsources_element_trending_regex = "Trend Değeri İfade:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "Medya Kaynakları"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/vi_VN/configure.ini b/src/locale/vi_VN/configure.ini
index 1f7b95808..4e58aa37f 100755
--- a/src/locale/vi_VN/configure.ini
+++ b/src/locale/vi_VN/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "Một Ngày"
 crawl_component_one_week = "Một Tuần"
 crawl_component_one_month = "Một Tháng"
 crawl_component_one_year = "Một Năm"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "Chỉ số/Trộn để Sử dụng"
 crawl_component_trend_category = "Xu Hướng Mục"
 crawl_component_index = "Chỉ số"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url XPaths:"
 searchsources_element_link_xpath_text = "Tải Về Khởi Động:"
 searchsources_element_trend_category_group = "Nh&oacute;m Trong Mục:"
 searchsources_element_trending_regex = "Xu Hướng Gi&aacute; Trị Dịch:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "Nguồn Phương Tiện Truyền Thông"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/locale/zh_CN/configure.ini b/src/locale/zh_CN/configure.ini
index 0c7f3dbd4..870ba47f6 100755
--- a/src/locale/zh_CN/configure.ini
+++ b/src/locale/zh_CN/configure.ini
@@ -564,6 +564,10 @@ crawl_component_one_day = "有一天"
 crawl_component_one_week = "一个星期"
 crawl_component_one_month = "一个月"
 crawl_component_one_year = "一年"
+crawl_component_video = ""
+crawl_component_audio = ""
+crawl_component_text = ""
+crawl_component_application = ""
 crawl_component_sources_indexes = "Index/混合使用"
 crawl_component_trend_category = "趋势类别"
 crawl_component_index = "索引"
@@ -1308,10 +1312,10 @@ searchsources_element_aux_url_xpath = "Aux Url Xpath:"
 searchsources_element_link_xpath_text = "下载Xpath:"
 searchsources_element_trend_category_group = "集团内的类别:"
 searchsources_element_trending_regex = "一趋势值Regex:"
-searchsources_element_info_tags = ""
-searchsources_element_list_row_tag = ""
-searchsources_element_row_title_tag = ""
-searchsources_element_row_url_tag = ""
+searchsources_element_info_xpaths = ""
+searchsources_element_item_xpath = ""
+searchsources_element_title_xpath = ""
+searchsources_element_url_xpath = ""
 searchsources_element_test_values = ""
 searchsources_element_media_sources = "媒体来源"
 searchsources_element_subsearches = "Subsearches"
diff --git a/src/views/elements/SearchsourcesElement.php b/src/views/elements/SearchsourcesElement.php
index a5f6ff5dd..1b44332fb 100644
--- a/src/views/elements/SearchsourcesElement.php
+++ b/src/views/elements/SearchsourcesElement.php
@@ -115,10 +115,10 @@ class SearchsourcesElement extends Element
                 tl('searchsources_element_trending_regex') => 6,
             ],
             "description_source" => [
-                tl('searchsources_element_info_tags') => 0,
-                tl('searchsources_element_list_row_tag') => 1,
-                tl('searchsources_element_row_title_tag') => 2,
-                tl('searchsources_element_row_url_tag') => 3,
+                tl('searchsources_element_info_xpaths') => 0,
+                tl('searchsources_element_item_xpath') => 1,
+                tl('searchsources_element_title_xpath') => 2,
+                tl('searchsources_element_url_xpath') => 3,
                 tl('searchsources_element_test_values') => 7
             ]
         ];
@@ -249,17 +249,14 @@ class SearchsourcesElement extends Element
                             tl('searchsources_element_file_format') :
                                 tl('searchsources_element_expires')); ?></b>
                     <?php
-                        if (in_array($source['TYPE'], ["feed_podcast",
-                            "scrape_podcast"])) {
-                            e($data['PODCAST_EXPIRES'][
-                                $source['CATEGORY']]);
-                        } else if ($source['TYPE'] == "description_source") {
-                            e($data['MEDIA_MIME_TYPE'][
-                                $source['CATEGORY']]);
-                        } else {
-                            e($source['CATEGORY']);
-                        }
-                    ?><br />
+                    if (in_array($source['TYPE'], ["feed_podcast",
+                        "scrape_podcast"])) {
+                        e($data['PODCAST_EXPIRES'][$source['CATEGORY']]);
+                    } else if ($source['TYPE'] == "description_source") {
+                        e($data['MEDIA_MIME_TYPE'][$source['CATEGORY']]);
+                    } else {
+                        e($source['CATEGORY']);
+                    }?><br />
                     <b><?= tl('searchsources_element_url') ?></b>
                     <pre><?= htmlentities($source['SOURCE_URL'])
                     ?></pre><?php
@@ -686,8 +683,8 @@ class SearchsourcesElement extends Element
             tl('searchsources_element_aux_url_xpath');
             ?></span><span id="channel-text"><?=
             tl('searchsources_element_channelpath') ?></span>
-            <span id="description-xpath"><?=
-            tl('searchsources_element_info_tags'); ?></span></b></label>
+            <span id="info-xpaths"><?=
+            tl('searchsources_element_info_xpaths'); ?></span></b></label>
             </td><td id='channel-aux'><input type="text"
                 id="channel-path" name="channel_path"
                 value="<?= $data['CURRENT_SOURCE']['channel_path'] ?>"
@@ -701,8 +698,8 @@ class SearchsourcesElement extends Element
             <b><span id="item-text"><?=
             tl('searchsources_element_item_text') ?></span><span
             id="item-text-regex"><?= tl('searchsources_element_item_regex')
-            ?></span><span id="row-tag"><?=
-            tl('searchsources_element_list_row_tag')?></span></b>
+            ?></span><span id="item-xpath"><?=
+            tl('searchsources_element_item_xpath')?></span></b>
             </label></td><td>
             <input type="text" id="item-path" name="item_path"
                 value="<?=$data['CURRENT_SOURCE']['item_path'] ?>"
@@ -714,8 +711,8 @@ class SearchsourcesElement extends Element
             ?></td></tr>
         <tr><td><label id="title-text-label" for="title-path"><b>
             <span id="title-text"><?=tl('searchsources_element_titlepath')?>
-            </span><span id="row-title"><?=
-            tl('searchsources_element_row_title_tag')?></span></b>
+            </span><span id="title-xpath"><?=
+            tl('searchsources_element_title_xpath')?></span></b>
             </label></td><td>
             <input type="text" id="title-path" name="title_path"
                 value="<?= $data['CURRENT_SOURCE']['title_path'] ?>"
@@ -727,8 +724,8 @@ class SearchsourcesElement extends Element
             ?></td></tr>
         <tr><td><label id="description-text-label" for="description-path"><b>
             <span id="description-text"><?=
-            tl('searchsources_element_descpath')?></span><span id="row-url">
-            <?=tl('searchsources_element_row_url_tag')?></span></b>
+            tl('searchsources_element_descpath')?></span><span id="url-xpath">
+            <?=tl('searchsources_element_url_xpath')?></span></b>
             </label></td><td>
             <input type="text" id="description-path" name="description_path"
                 value="<?= $data['CURRENT_SOURCE']['description_path'] ?>"
@@ -960,4 +957,4 @@ class SearchsourcesElement extends Element
             $view, $title, $fields, $dropdowns,
             $postfix);
     }
-}
\ No newline at end of file
+}
diff --git a/src/views/elements/WikiElement.php b/src/views/elements/WikiElement.php
index ae3a3b8e8..b9880f967 100644
--- a/src/views/elements/WikiElement.php
+++ b/src/views/elements/WikiElement.php
@@ -656,15 +656,15 @@ class WikiElement extends Element implements CrawlConstants
             }
             ?>
             <div class="top-margin">
-            <label for="update-desc"><b><?=
+            <label for="update-description"><b><?=
             tl('wiki_element_update_resource_desc') ?></b></label>
-            <input type="checkbox" name="update_desc" value="true"
+            <input type="checkbox" name="update_description" value="true"
                 <?php
-                    $checked = (isset($data['update_desc'])
-                        && $data['update_desc']) ?
+                    $checked = (isset($data['update_description'])
+                        && $data['update_description']) ?
                         'checked="checked"' : '';
                     e( $checked );
-                ?> id='update-desc' />
+                ?> id='update-description' />
             </div>
             <div class="top-margin">
             <label for="page-header"><b><?=tl('wiki_element_page_header')
@@ -2214,4 +2214,4 @@ class WikiElement extends Element implements CrawlConstants
         }
         return $pre_page;
     }
-}
\ No newline at end of file
+}
ViewGit