diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..2b2502c --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python: Current File", + "type": "python", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "justMyCode": false + } + ] +} \ No newline at end of file diff --git a/Home.html b/Home.html new file mode 100644 index 0000000..80b3f7f --- /dev/null +++ b/Home.html @@ -0,0 +1,423 @@ + + + + + + + + Dashboard + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+ + + + + \ No newline at end of file diff --git a/Server.bat b/Server.bat new file mode 100644 index 0000000..79e7856 --- /dev/null +++ b/Server.bat @@ -0,0 +1,3 @@ +@echo off +python -m http.server +pause diff --git a/SimpleBrowser.py b/SimpleBrowser.py new file mode 100644 index 0000000..8322472 --- /dev/null +++ b/SimpleBrowser.py @@ -0,0 +1,441 @@ +# importing libraries +from PyQt5.QtCore import * +from PyQt5.QtWidgets import * +from PyQt5.QtGui import * +from PyQt5.QtWebEngineWidgets import * +from PyQt5.QtPrintSupport import * +import webbrowser, json, os, sys, datetime +from json.decoder import JSONDecodeError + +# creating main window class +class MainWindow(QMainWindow): + + # constructor + def __init__(self, *args, **kwargs): + super(MainWindow, self).__init__(*args, **kwargs) + + # ADD TAB WIGDETS TO DISPLAY WEB TABS + self.tabs = QTabWidget() + self.tabs.setDocumentMode(True) + self.tabs.setTabsClosable(True) + self.setCentralWidget(self.tabs) + self.setGeometry(100, 100, 1000, 700) + self.history = [] + + # ADD DOUBLE CLICK EVENT LISTENER + self.tabs.tabBarDoubleClicked.connect(self.tab_open_doubleclick) + # ADD TAB CLOSE EVENT LISTENER + self.tabs.tabCloseRequested.connect(self.close_current_tab) + # ADD ACTIVE TAB CHANGE EVENT LISTENER + self.tabs.currentChanged.connect(self.current_tab_changed) + + self.status = QStatusBar() + self.setStatusBar(self.status) + + # ADD NAVIGATION TOOLBAR + navtb = QToolBar("Navigation") + navtb.setIconSize(QSize(20, 20)) + self.addToolBar(navtb) + + #### ADD BUTTONS TO NAVIGATION TOOLBAR + # PREVIOUS WEB PAGE BUTTON + back_btn = QAction(QIcon(os.path.join('icons', 'left.svg')), "Back", self) + back_btn.setStatusTip("Back to previous page") + navtb.addAction(back_btn) + back_btn.triggered.connect(lambda: self.tabs.currentWidget().back()) + + # NEXT WEB PAGE BUTTON + next_btn = QAction(QIcon(os.path.join('icons', 'right.svg')), "Forward", self) + next_btn.setStatusTip("Forward to next page") + navtb.addAction(next_btn) + next_btn.triggered.connect(lambda: self.tabs.currentWidget().forward()) + + # REFRESH WEB PAGE BUTTON + reload_btn = QAction(QIcon(os.path.join('icons', 'reload.svg')), "Reload", self) + reload_btn.setStatusTip("Reload page") + navtb.addAction(reload_btn) + reload_btn.triggered.connect(lambda: self.tabs.currentWidget().reload()) + + # HOME PAGE BUTTON + home_btn = QAction(QIcon(os.path.join('icons', 'home.svg')), "Home", self) + home_btn.setStatusTip("Go home") + navtb.addAction(home_btn) + home_btn.triggered.connect(self.navigate_home) + + # Separator in the tool bar + navtb.addSeparator() + + # Google Page BUTTON + google_btn = QAction(QIcon(os.path.join('icons', 'google-logo.png')), "Google", self) + google_btn.setStatusTip("Google") + navtb.addAction(google_btn) + google_btn.triggered.connect(self.navigate_google) + + # ADD LINE EDIT TO SHOW AND EDIT URLS + self.urlbar = QLineEdit() + navtb.addWidget(self.urlbar) + self.urlbar.returnPressed.connect(self.navigate_to_url) + + # Separator in the tool bar + navtb.addSeparator() + + # ADD STOP BUTTON TO STOP URL LOADING + stop_btn = QAction(QIcon(os.path.join('icons', 'stop.svg')), "Stop", self) + stop_btn.setStatusTip("Stop loading current page") + navtb.addAction(stop_btn) + stop_btn.triggered.connect(lambda: self.tabs.currentWidget().stop()) + + # creating a button for bookmark + bookmark_btn = QAction(QIcon(os.path.join('icons', 'bookmark.svg')), "Add Bookmark", self) + bookmark_btn.setStatusTip("Bookmark this page") + navtb.addAction(bookmark_btn) + bookmark_btn.triggered.connect(self.add_bookmark) + + # ADD FILE MENU ACTIONS + file_menu = self.menuBar().addMenu("&Tab+") + + # ADD FILE MENU ACTIONS + new_tab_action = QAction(QIcon(os.path.join('icons', 'cil-library-add.png')), "New Tab", self) + new_tab_action.setStatusTip("Open a new tab") + file_menu.addAction(new_tab_action) + # ADD NEW TAB + new_tab_action.triggered.connect(lambda _: self.add_new_tab()) + self.add_new_tab(QUrl.fromLocalFile("/Home.html")) + + # creating a menu for bookmarks + # adding this menu to the menu bar + bookmark_menu = self.menuBar().addMenu("&Bookmarks") + show_bookmarks = QAction("Show Bookmarks", self) + bookmark_menu.addAction(show_bookmarks) + show_bookmarks.triggered.connect(self.show_bookmark) + + # Help menu + help_menu = self.menuBar().addMenu("&Help") + # ADD HELP MENU ACTIONS + navigate_home_action = QAction(QIcon(os.path.join('icons', 'cil-exit-to-app.png')), "Homepage", self) + navigate_home_action.setStatusTip("Go to Homepage") + help_menu.addAction(navigate_home_action) + # NAVIGATE TO DEVELOPER WEBSITE + navigate_home_action.triggered.connect(self.navigate_home) + + # creating a button for History + history_btn = QAction(QIcon(os.path.join('icons', 'history.svg')), "Show History", self) + history_btn.setStatusTip("Show History") + + navtb.addAction(history_btn) + history_btn.triggered.connect(self.show_history) + + # STYLESHEET TO CUSTOMIZE WINDOW + self.setStyleSheet(""" + + /*Body */ + QWidget{ + background-color:#202832; + color: rgb(255, 255, 255); + } + /* The tab widget frame */ + QTabWidget::pane { + border-top: 2px solid rgb(90, 90, 90); + position: absolute; + color: rgb(255, 255, 255); + } + /* New Tab Css */ + QTabBar::tab { + width: 100%; + background-color:#202832; + margin: 0.1em; + padding: 0.3em; + font-size:14px; + border : 1px solid white; + border-radius : 4px; + } + QTabBar::tab:hover{ + background: rgb(49, 49, 49); + border: 1px solid aqua; + background-color:#0d1117; + border-radius: 4px; + } + QTabBar::tab:selected{ + background: rgb(49, 49, 49); + border: 1px solid #112740; + background-color:#0d1117; + border-radius: 4px; + border:1px solid yellow; + } + /*searchbar*/ + QLineEdit { + border: 2px solid #112740; + border-radius: 10px; + padding: 5px; + margin-right:50px; + background-color:#0d1117; + color: rgb(255, 255, 255); + } + QLineEdit:hover { + border: 2px solid white; + } + QLineEdit:focus{ + border: 2px solid rgb(0, 136, 255); + color: rgb(200, 200, 200); + } + QPushButton{ + background: rgb(49, 49, 49); + border: 2px solid rgb(0, 36, 36); + background-color: rgb(0, 36, 36); + padding: 5px; + border-radius: 10px; + } + /*Button*/ + QLabel:hover{ + + border: 2px solid #112740; + + border-radius: 10px; + } + QToolButton::hover{ + background: rgb(49, 49, 49); + border: 2px solid #112740; + background-color:#0d1117; + border-radius: 10px; + } + + """) + + # SHOW MAIN WINDOW + self.show() + + #*********** FUNCTION ***********# + + # ADD NEW WEB TAB + def add_new_tab(self, qurl=None, label="Loading..."): + # Check if url value is blank + if qurl is None: + qurl = QUrl.fromLocalFile("/Home.html") + + # Load the passed url + browser = QWebEngineView() + browser.setUrl(qurl) + + # ADD THE WEB PAGE TAB + i = self.tabs.addTab(browser, label) + self.tabs.setCurrentIndex(i) + + # ADD BROWSER EVENT LISTENERS + # On URL change + browser.urlChanged.connect(lambda qurl, browser=browser: + self.update_urlbar(qurl, browser)) + # On loadfinished + browser.loadFinished.connect(lambda _, i=i, browser=browser: + self.tabs.setTabText(i, browser.page().title())) + + browser.loadFinished.connect(lambda qurl, browser=browser: + self.add_history(qurl, browser)) # Connect to add_history method + + # ADD NEW TAB ON DOUBLE CLICK ON TABS + def tab_open_doubleclick(self, i): + if i == -1: # No tab under the click + self.add_new_tab() + + # CLOSE TABS + def close_current_tab(self, i): + if self.tabs.count() < 2: #Only close if there is more than one tab open + return + + self.tabs.removeTab(i) + + # method for updating url + # this method is called by the QWebEngineView object + def update_urlbar(self, q, browser): + + if browser != self.tabs.currentWidget(): + + return + + # URL Schema + if q.scheme() == 'https': + pass + + + else: + pass + + # setting text to the url bar + + # setting cursor position of the url bar + + self.urlbar.setText(q.toString()) + self.urlbar.setCursorPosition(0) + + def current_tab_changed(self, i): + # i = tab index + # GET CURRENT TAB URL + qurl = self.tabs.currentWidget().url() + # UPDATE URL TEXT + self.update_urlbar(qurl, self.tabs.currentWidget()) + # UPDATE WINDOWS TITTLE + self.update_title(self.tabs.currentWidget()) + + # method for updating the title of the window + def update_title(self, browser): + if browser != self.tabs.currentWidget(): + # If this signal is not from the current ACTIVE tab, ignore + return + + title = self.tabs.currentWidget().page().title() + self.setWindowTitle("% s - Simple Browser" % title) + + # home action + def navigate_home(self, browser): + self.tabs.currentWidget().setUrl(QUrl.fromLocalFile("/Home.html")) + + # Google action + def navigate_google(self, browser): + self.tabs.currentWidget().setUrl(QUrl("http://google.com")) + + # method called by the line edit when return key is pressed + def navigate_to_url(self): + + # getting url and converting it to QUrl object + q = QUrl(self.urlbar.text()) + + # if url is scheme is blank + if q.scheme() == "": + # set url scheme to html + q.setScheme("http") + + # set the url to the browser + self.tabs.currentWidget().setUrl(q) + + # method for adding bookmark + def add_bookmark(self): + # get the current page's title and url + title = self.tabs.currentWidget().title() + url = self.tabs.currentWidget().url().toString() + date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + # create a bookmark object with title and url + bookmark = {"title": title, "url": url, "date": date} + + # load the existing bookmarks from file + with open("bookmarks.json", "r") as f: + try: + bookmarks = json.load(f) + except JSONDecodeError: + bookmarks = [] + + # add the new bookmark to the list of bookmarks + bookmarks.append(bookmark) + + # save the updated bookmarks to file + with open("bookmarks.json", "w") as f: + json.dump(bookmarks, f, indent=1) + + # show a message box to inform the user + msg_box = QMessageBox() + msg_box.setText(f"Bookmark added for {title}") + msg_box.exec_() + self.show_bookmark() + + def show_bookmark(self): + # load the existing bookmarks from file + + with open("bookmarks.json", "r") as f: + try: + bookmarks = json.load(f) + except JSONDecodeError: + bookmarks = [] + + # create a dialog to display the bookmarks + dialog = QDialog(self) + dialog.setWindowTitle("Bookmarks") + dialog.setMinimumWidth(500) + dialog.setMinimumHeight(300) + + # create a list widget to display the bookmarks + list_widget = QListWidget(dialog) + list_widget.itemDoubleClicked.connect(self.navigate_to_bookmark) + dialog_layout = QVBoxLayout(dialog) + dialog_layout.addWidget(list_widget) + + # add the bookmarks to the list widget + for bookmark in bookmarks: + item = QListWidgetItem(bookmark["title"]) + item.setData(Qt.UserRole, bookmark["url"]) + list_widget.addItem(item) + + # show the dialog + dialog.exec_() + + # method for navigating to a bookmark + def navigate_to_bookmark(self, item): + url = item.data(Qt.UserRole) + self.tabs.currentWidget().load(QUrl(url)) + + def add_history(self, qurl, browser): + # get the current page's title and url + title = self.tabs.currentWidget().title() + url = self.tabs.currentWidget().url().toString() + date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + # create a history object with title and url + record = {"title": title, "url": url, "date": date} + + # load the existing history from file + with open("history.json", "r") as f: + try: + history = json.load(f) + except JSONDecodeError: + history = [] + + # add the new record to the list of history + history.append(record) + + # save the updated history to file + with open("history.json", "w") as f: + json.dump(history, f, indent=1) + + def show_history(self): + # load the existing history from file + with open("history.json", "r") as f: + try: + history = json.load(f) + except JSONDecodeError: + history = [] + + # create a dialog to display the history + dialog = QDialog(self) + dialog.setWindowTitle("Web History") + dialog.setMinimumWidth(800) + dialog.setMinimumHeight(500) + + # create a list widget to display the history + list_widget = QListWidget(dialog) + list_widget.itemDoubleClicked.connect(self.navigate_to_history) + dialog_layout = QVBoxLayout(dialog) + dialog_layout.addWidget(list_widget) + + # add the history to the list widget + for record in history: + item = QListWidgetItem(record["title"]) + item.setData(Qt.UserRole, record["url"]) + list_widget.addItem(item) + + # show the dialog + dialog.exec_() + + # method for navigating to a history + def navigate_to_history(self, item): + url = item.data(Qt.UserRole) + self.tabs.currentWidget().load(QUrl(url)) + +# creating a pyQt5 application +app = QApplication(sys.argv) + +# name to the application +app.setApplicationName("Simple Browser") + +# creating a main window object +window = MainWindow() + +# loop +app.exec_() diff --git a/bookmarks.html b/bookmarks.html new file mode 100644 index 0000000..22c6a9f --- /dev/null +++ b/bookmarks.html @@ -0,0 +1,198 @@ + + + + + + + + + Bookmarks + + + + + + +
+
+

Bookmarks

+
+ + + + + + + + + + + + +
Title Url Date
+
+ + + \ No newline at end of file diff --git a/bookmarks.json b/bookmarks.json new file mode 100644 index 0000000..8b5b160 --- /dev/null +++ b/bookmarks.json @@ -0,0 +1,32 @@ +[ + { + "title": "HyperWannaFLY - YouTube", + "url": "https://www.youtube.com/@HyperWannaFLY/videos", + "date": "2023-03-14 19:04:35" + }, + { + "title": "Master The Blaster (Valorant Montage) - YouTube", + "url": "https://www.youtube.com/watch?v=q53JPm6BB58", + "date": "2023-03-14 19:05:27" + }, + { + "title": "LE Kraken - YouTube", + "url": "https://www.youtube.com/@lekraken", + "date": "2023-03-14 22:14:19" + }, + { + "title": "MD Computers", + "url": "https://mdcomputers.in/", + "date": "2023-03-17 01:04:45" + }, + { + "title": "GB Devil - YouTube", + "url": "https://www.youtube.com/@GB_Devil", + "date": "2023-03-22 23:15:50" + }, + { + "title": "YouTube", + "url": "https://www.youtube.com/gaming", + "date": "2023-04-09 01:15:25" + } +] \ No newline at end of file diff --git a/history.html b/history.html new file mode 100644 index 0000000..6254fcc --- /dev/null +++ b/history.html @@ -0,0 +1,186 @@ + + + + + + + + Web History + + + + + + +
+
+

Web History

+
+ + + + + + + + + + + +
Title Url Date
+
+ + + \ No newline at end of file diff --git a/history.json b/history.json new file mode 100644 index 0000000..95465e6 --- /dev/null +++ b/history.json @@ -0,0 +1,457 @@ +[ + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-03-30 16:17:34" + }, + { + "title": "YouTube", + "url": "https://www.youtube.com/", + "date": "2023-03-30 16:17:39" + }, + { + "title": "Google", + "url": "https://www.google.com/", + "date": "2023-03-30 16:17:48" + }, + { + "title": "youtuv - Google Search", + "url": "https://www.google.com/search?q=youtuv&source=hp&ei=1GglZLyiKo_t-AbVlpHQBQ&iflsig=AOEireoAAAAAZCV25LricxdisxZF_PaT4Ew3E2AIYhuY&ved=0ahUKEwi83N2WvYP-AhWPNt4KHVVLBFoQ4dUDCAk&uact=5&oq=youtuv&gs_lcp=Cgdnd3Mtd2l6EAMyEwguEIAEELEDEIMBEMcBENEDEAoyBggAEAoQAzINCAAQgAQQsQMQgwEQCjIGCAAQChADMg0IABCABBCxAxCDARAKMg0IABCABBCxAxCDARAKMgoIABCABBCxAxAKMg0IABCABBCxAxCDARAKMgYIABAKEAMyBwgAEIAEEAo6DgguEI8BEOoCEIwDEOUCOg4IABCPARDqAhCMAxDlAjoRCC4QgwEQxwEQsQMQ0QMQgAQ6CwgAEIAEELEDEIMBOgQIABADOhEILhCABBCxAxCDARDHARDRAzoLCC4QgAQQsQMQgwE6CAgAEIAEELEDOgUIABCABFDWI1jrK2DsNGgBcAB4AIABa4gB0gSSAQM0LjKYAQCgAQGwAQo&sclient=gws-wiz", + "date": "2023-03-30 16:17:59" + }, + { + "title": "YouTube", + "url": "https://www.youtube.com/", + "date": "2023-03-30 16:18:25" + }, + { + "title": "youtuv - Google Search", + "url": "https://www.google.com/search?q=youtuv&source=hp&ei=1GglZLyiKo_t-AbVlpHQBQ&iflsig=AOEireoAAAAAZCV25LricxdisxZF_PaT4Ew3E2AIYhuY&ved=0ahUKEwi83N2WvYP-AhWPNt4KHVVLBFoQ4dUDCAk&uact=5&oq=youtuv&gs_lcp=Cgdnd3Mtd2l6EAMyEwguEIAEELEDEIMBEMcBENEDEAoyBggAEAoQAzINCAAQgAQQsQMQgwEQCjIGCAAQChADMg0IABCABBCxAxCDARAKMg0IABCABBCxAxCDARAKMgoIABCABBCxAxAKMg0IABCABBCxAxCDARAKMgYIABAKEAMyBwgAEIAEEAo6DgguEI8BEOoCEIwDEOUCOg4IABCPARDqAhCMAxDlAjoRCC4QgwEQxwEQsQMQ0QMQgAQ6CwgAEIAEELEDEIMBOgQIABADOhEILhCABBCxAxCDARDHARDRAzoLCC4QgAQQsQMQgwE6CAgAEIAEELEDOgUIABCABFDWI1jrK2DsNGgBcAB4AIABa4gB0gSSAQM0LjKYAQCgAQGwAQo&sclient=gws-wiz", + "date": "2023-03-30 16:18:37" + }, + { + "title": "HyperWannaFly - Google Search", + "url": "https://www.google.com/search?q=HyperWannaFly&ei=3mglZM-eKb_p4-EPuaOv8A0&ved=0ahUKEwjPhb-bvYP-AhW_9DgGHbnRC94Q4dUDCA8&uact=5&oq=HyperWannaFly&gs_lcp=Cgxnd3Mtd2l6LXNlcnAQAzoOCAAQigUQsQMQgwEQkQI6CggAEIoFEAoQkQI6BQgAEIAEOhEILhCDARDHARCxAxDRAxCABDoLCAAQigUQsQMQgwE6CwguEIAEELEDEIMBOgsIABCABBCxAxCDAToICAAQgAQQsQM6EwguEIoFELEDEMcBENEDEEMQ6gQ6BwgAEIoFEEM6CAguEIAEELEDOgcILhCKBRBDOh4ILhCKBRCxAxDHARDRAxBDEOoEENwEEN4EEOAEGAE6DQguEIoFEOUEENQCEEM6CggAEIoFELEDEEM6EAguEIoFEOUEENQCEEMQ6gQ6CgguEIoFEOUEEEM6GwguEIoFEOUEENQCEEMQ6gQQ3AQQ3gQQ4AQYAToLCC4QgAQQxwEQ0QM6BwgAEIAEEAo6BwgAEA0QgAQ6CAgAEB4QDRAKOgoIABAeEA0QDxAKOgUIABCiBEoECEEYAEoFCEASATFQAFjfIWCqJmgAcAF4AIABrQGIAfkMkgEEMC4xM5gBAKABAcABAdoBBggBEAEYFA&sclient=gws-wiz-serp", + "date": "2023-03-30 16:18:44" + }, + { + "title": "HyperWannaFLY - YouTube", + "url": "https://www.youtube.com/c/hyperwannafly", + "date": "2023-03-30 16:19:01" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-03-30 19:07:05" + }, + { + "title": "information page", + "url": "file:///info.html", + "date": "2023-03-30 19:08:08" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-03-30 19:08:11" + }, + { + "title": "Bookmarks", + "url": "http://localhost:8000/bookmarks.html", + "date": "2023-03-30 19:08:37" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-03-30 19:08:44" + }, + { + "title": "Web History", + "url": "http://localhost:8000/history.html", + "date": "2023-03-30 19:08:46" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-03-30 19:10:41" + }, + { + "title": "YouTube", + "url": "https://www.youtube.com/", + "date": "2023-03-30 19:10:45" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-03-30 19:10:46" + }, + { + "title": "Hyperwannafly - Google Search", + "url": "https://www.google.com/search?q=Hyperwannafly", + "date": "2023-03-30 19:10:55" + }, + { + "title": "HyperWannaFLY - YouTube", + "url": "https://www.youtube.com/c/hyperwannafly", + "date": "2023-03-30 19:10:57" + }, + { + "title": "Hyperwannafly - Google Search", + "url": "https://www.google.com/search?q=Hyperwannafly", + "date": "2023-03-30 19:10:58" + }, + { + "title": "HyperWannaFLY (@hyperwannafly) \u2022 Instagram photos and videos", + "url": "https://www.instagram.com/hyperwannafly/", + "date": "2023-03-30 19:10:59" + }, + { + "title": "Hyperwannafly - Google Search", + "url": "https://www.google.com/search?q=Hyperwannafly", + "date": "2023-03-30 19:11:02" + }, + { + "title": "https://twitter.com/HyperX555", + "url": "https://twitter.com/HyperX555", + "date": "2023-03-30 19:11:04" + }, + { + "title": "Hyperwannafly - Google Search", + "url": "https://www.google.com/search?q=Hyperwannafly", + "date": "2023-03-30 19:11:05" + }, + { + "title": "Hyperwannafly - Google Search", + "url": "https://www.google.com/search?q=Hyperwannafly&source=lnms&tbm=isch&sa=X&ved=2ahUKEwj42aDv44P-AhUkXmwGHQIpCt4Q_AUoAXoECAEQAw&biw=1920&bih=948&dpr=1", + "date": "2023-03-30 19:11:21" + }, + { + "title": "Hyperwannafly - Google Search", + "url": "https://www.google.com/search?q=Hyperwannafly&source=lmns&tbm=vid&bih=948&biw=1920&hl=en&sa=X&ved=2ahUKEwjxyOn744P-AhUgArcAHSmYABEQ_AUoAnoECAEQAg", + "date": "2023-03-30 19:11:23" + }, + { + "title": "Hyperwannafly - Google Search", + "url": "https://www.google.com/search?q=Hyperwannafly&hl=en&tbm=isch&source=lnms&sa=X&ved=2ahUKEwjLqez844P-AhW1SWwGHXsZC2oQ_AUoAXoECAEQAw&biw=1920&bih=948&dpr=1", + "date": "2023-03-30 19:11:24" + }, + { + "title": "Web History", + "url": "http://localhost:8000/history.html", + "date": "2023-03-30 19:11:35" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:03:14" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:04:38" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:04:39" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:05:26" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:05:26" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:05:27" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:05:27" + }, + { + "title": "youtube - Google Search", + "url": "https://www.google.com/search?q=youtube", + "date": "2023-04-09 01:05:42" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:06:00" + }, + { + "title": "YouTube", + "url": "https://www.youtube.com/", + "date": "2023-04-09 01:06:05" + }, + { + "title": "Bookmarks", + "url": "http://localhost:8000/bookmarks.html", + "date": "2023-04-09 01:06:13" + }, + { + "title": "Web History", + "url": "http://localhost:8000/history.html", + "date": "2023-04-09 01:06:16" + }, + { + "title": "Spotify - Web Player: Music for everyone", + "url": "https://open.spotify.com/", + "date": "2023-04-09 01:06:25" + }, + { + "title": "information page", + "url": "file:///info.html", + "date": "2023-04-09 01:06:29" + }, + { + "title": "Google", + "url": "https://www.google.com/", + "date": "2023-04-09 01:06:37" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:08:24" + }, + { + "title": "Bookmarks", + "url": "http://localhost:8000/bookmarks.html", + "date": "2023-04-09 01:08:32" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:08:48" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:08:51" + }, + { + "title": "Bookmarks", + "url": "http://localhost:8000/bookmarks.html", + "date": "2023-04-09 01:08:58" + }, + { + "title": "HyperWannaFLY - YouTube", + "url": "https://www.youtube.com/@HyperWannaFLY/videos", + "date": "2023-04-09 01:09:07" + }, + { + "title": "Bookmarks", + "url": "http://localhost:8000/bookmarks.html", + "date": "2023-04-09 01:09:08" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:09:11" + }, + { + "title": "Web History", + "url": "http://localhost:8000/history.html", + "date": "2023-04-09 01:09:12" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:09:15" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:09:16" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:09:17" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:09:17" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:09:18" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:09:18" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:09:18" + }, + { + "title": "YouTube", + "url": "https://www.youtube.com/", + "date": "2023-04-09 01:09:23" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:09:39" + }, + { + "title": "Bookmarks", + "url": "http://localhost:8000/bookmarks.html", + "date": "2023-04-09 01:09:44" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:10:19" + }, + { + "title": "YouTube", + "url": "https://www.youtube.com/", + "date": "2023-04-09 01:13:45" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:16:38" + }, + { + "title": "information page", + "url": "file:///info.html", + "date": "2023-04-09 01:16:42" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-09 01:17:09" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-15 11:48:56" + }, + { + "title": "youtube - Google Search", + "url": "https://www.google.com/search?q=youtube", + "date": "2023-04-15 11:51:45" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-15 11:54:18" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-15 12:01:02" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-15 12:17:31" + }, + { + "title": "information page", + "url": "file:///info.html", + "date": "2023-04-15 12:26:17" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-15 12:28:28" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-15 13:19:35" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-15 13:20:20" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-15 13:20:38" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-15 13:24:18" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-15 13:29:18" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-15 18:25:31" + }, + { + "title": "Web History", + "url": "http://localhost:8000/history.html", + "date": "2023-04-15 18:25:39" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-16 14:59:49" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-16 15:00:07" + }, + { + "title": "YouTube", + "url": "https://www.youtube.com/", + "date": "2023-04-16 15:00:30" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-16 15:00:59" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-16 15:00:59" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-22 01:21:06" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-22 01:21:26" + }, + { + "title": "localhost", + "url": "http://localhost:8000/bookmarks.html", + "date": "2023-04-22 01:21:27" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-04-22 01:21:30" + }, + { + "title": "Dashboard", + "url": "file:///Home.html", + "date": "2023-06-24 02:01:43" + } +] \ No newline at end of file diff --git a/icons/bookmark.svg b/icons/bookmark.svg new file mode 100644 index 0000000..297ece7 --- /dev/null +++ b/icons/bookmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/cil-arrow-circle-left.png b/icons/cil-arrow-circle-left.png new file mode 100644 index 0000000..9e3b928 Binary files /dev/null and b/icons/cil-arrow-circle-left.png differ diff --git a/icons/cil-arrow-circle-right.png b/icons/cil-arrow-circle-right.png new file mode 100644 index 0000000..200695e Binary files /dev/null and b/icons/cil-arrow-circle-right.png differ diff --git a/icons/cil-home.png b/icons/cil-home.png new file mode 100644 index 0000000..ef3160f Binary files /dev/null and b/icons/cil-home.png differ diff --git a/icons/cil-library-add.png b/icons/cil-library-add.png new file mode 100644 index 0000000..4856e1e Binary files /dev/null and b/icons/cil-library-add.png differ diff --git a/icons/cil-media-stop.png b/icons/cil-media-stop.png new file mode 100644 index 0000000..6050b40 Binary files /dev/null and b/icons/cil-media-stop.png differ diff --git a/icons/cil-options.png b/icons/cil-options.png new file mode 100644 index 0000000..75630e4 Binary files /dev/null and b/icons/cil-options.png differ diff --git a/icons/cil-reload.png b/icons/cil-reload.png new file mode 100644 index 0000000..63acc08 Binary files /dev/null and b/icons/cil-reload.png differ diff --git a/icons/cil-tag.png b/icons/cil-tag.png new file mode 100644 index 0000000..c4bb725 Binary files /dev/null and b/icons/cil-tag.png differ diff --git a/icons/google-logo.png b/icons/google-logo.png new file mode 100644 index 0000000..e7196bc Binary files /dev/null and b/icons/google-logo.png differ diff --git a/icons/history.svg b/icons/history.svg new file mode 100644 index 0000000..94af7a7 --- /dev/null +++ b/icons/history.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/home.svg b/icons/home.svg new file mode 100644 index 0000000..9e78e1f --- /dev/null +++ b/icons/home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/left.svg b/icons/left.svg new file mode 100644 index 0000000..d2349fa --- /dev/null +++ b/icons/left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/options.svg b/icons/options.svg new file mode 100644 index 0000000..c180067 --- /dev/null +++ b/icons/options.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/reload.svg b/icons/reload.svg new file mode 100644 index 0000000..8cac811 --- /dev/null +++ b/icons/reload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/right.svg b/icons/right.svg new file mode 100644 index 0000000..c0b847d --- /dev/null +++ b/icons/right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/stop.svg b/icons/stop.svg new file mode 100644 index 0000000..1ff435f --- /dev/null +++ b/icons/stop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/0.jpg b/images/0.jpg new file mode 100644 index 0000000..a86ac38 Binary files /dev/null and b/images/0.jpg differ diff --git a/images/1.jpg b/images/1.jpg new file mode 100644 index 0000000..9b78803 Binary files /dev/null and b/images/1.jpg differ diff --git a/images/2.png b/images/2.png new file mode 100644 index 0000000..04741c3 Binary files /dev/null and b/images/2.png differ diff --git a/images/3.jpg b/images/3.jpg new file mode 100644 index 0000000..a6e9314 Binary files /dev/null and b/images/3.jpg differ diff --git a/images/4.jpg b/images/4.jpg new file mode 100644 index 0000000..075a47e Binary files /dev/null and b/images/4.jpg differ diff --git a/images/5.jpg b/images/5.jpg new file mode 100644 index 0000000..93b6198 Binary files /dev/null and b/images/5.jpg differ diff --git a/images/6.jpg b/images/6.jpg new file mode 100644 index 0000000..93d23b5 Binary files /dev/null and b/images/6.jpg differ diff --git a/images/Spiderman.jpg b/images/Spiderman.jpg new file mode 100644 index 0000000..584cc63 Binary files /dev/null and b/images/Spiderman.jpg differ diff --git a/images/Spiderman.mp4 b/images/Spiderman.mp4 new file mode 100644 index 0000000..d708a36 Binary files /dev/null and b/images/Spiderman.mp4 differ diff --git a/images/cropped-1920-1080-1030412.jpg b/images/cropped-1920-1080-1030412.jpg new file mode 100644 index 0000000..7d59b42 Binary files /dev/null and b/images/cropped-1920-1080-1030412.jpg differ diff --git a/info.html b/info.html new file mode 100644 index 0000000..43dc89d --- /dev/null +++ b/info.html @@ -0,0 +1,184 @@ + + + + + + + + + information page + + + +
+
+
+
+ +
+
+

Browser

+

+ A web browser made in Python is a software application that allows users to access and navigate web pages on the internet. + It is built using the Python programming language and third-party libraries such as PyQt & Tkinter to create a graphical user interface. + The browser may include features such as tabbed browsing, bookmark management, and support for various web technologies such as HTML, CSS, and JavaScript. +

+
+
+
+ +
+
+
+ +
+
+

HTML & CSS

+

Mayuresh Khadpe

+

+ + Works on HTML & CSS to Create Homepages & All Web Related Part. + Made a Fully Working Browser Front Page & graphical user interface. + +

+
+
+
+ +
+
+
+ +
+
+

Python

+

Sarvesh Patil

+

+ + Works on Python to Create Browser ( Software ). + libraries used are PyQt to create a graphical user interface. + Data like History and Bookmarks are stored in the .json file format. + +

+
+
+
+
+ + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..507eee4 Binary files /dev/null and b/requirements.txt differ diff --git a/test.py b/test.py new file mode 100644 index 0000000..8673500 --- /dev/null +++ b/test.py @@ -0,0 +1,2 @@ +import subprocess +subprocess.call(['D:\Project\SimpleBrowser\Server.bat']) \ No newline at end of file